首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

一道挺悬的GDI有关问题

2012-03-13 
一道挺悬的GDI问题//chanchu.cpp:定义应用程序的入口点。//#includestdafx.h #includechanchu.h #inclu

一道挺悬的GDI问题
//   chanchu.cpp   :   定义应用程序的入口点。
//

#include   "stdafx.h "
#include   "chanchu.h "
#include   <Windows.h>
#include   <Winuser.h>
#include   <Wingdi.h>
#define   MAX_LOADSTRING   100

//   全局变量:
HINSTANCE   hInst;//   当前实例
TCHAR   szTitle[MAX_LOADSTRING];//   标题栏文本
TCHAR   szWindowClass[MAX_LOADSTRING];//   主窗口类名

HPEN   hpen[7];
HBRUSH   hbru[7];
int   sPen[7]={PS_SOLID,PS_DASH,PS_DOT,PS_DASHDOT,PS_DASHDOTDOT,PS_NULL,PS_INSIDEFRAME};
int   sBru[6]={HS_BDIAGONAL,HS_CROSS,HS_DIAGCROSS,HS_FDIAGONAL,HS_HORIZONTAL,HS_VERTICAL};


//   此代码模块中包含的函数的前向声明:
ATOMMyRegisterClass(HINSTANCE   hInstance);
BOOLInitInstance(HINSTANCE,   int);
LRESULT   CALLBACKWndProc(HWND,   UINT,   WPARAM,   LPARAM);
LRESULT   CALLBACKAbout(HWND,   UINT,   WPARAM,   LPARAM);

void   MyPoint(HDC   hdc);

int   APIENTRY   _tWinMain(HINSTANCE   hInstance,
                                          HINSTANCE   hPrevInstance,
                                          LPTSTR         lpCmdLine,
                                          int               nCmdShow)
{
  //   TODO:   在此放置代码。
MSG   msg;
HACCEL   hAccelTable;

//   初始化全局字符串
LoadString(hInstance,   IDS_APP_TITLE,   szTitle,   MAX_LOADSTRING);
LoadString(hInstance,   IDC_CHANCHU,   szWindowClass,   MAX_LOADSTRING);
MyRegisterClass(hInstance);

//   执行应用程序初始化:
if   (!InitInstance   (hInstance,   nCmdShow))  
{
return   FALSE;
}

hAccelTable   =   LoadAccelerators(hInstance,   (LPCTSTR)IDC_CHANCHU);

//   主消息循环:
while   (GetMessage(&msg,   NULL,   0,   0))  
{
if   (!TranslateAccelerator(msg.hwnd,   hAccelTable,   &msg))  
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}

return   (int)   msg.wParam;
}


//
//     函数:   MyRegisterClass()
//
//     目的:   注册窗口类。
//
//     注释:  
//
//         仅当希望在已添加到   Windows   95   的
//         “RegisterClassEx”函数之前此代码与   Win32   系统兼容时,
//         才需要此函数及其用法。调用此函数
//         十分重要,这样应用程序就可以获得关联的
//       “格式正确的”小图标。
//
ATOM   MyRegisterClass(HINSTANCE   hInstance)
{
WNDCLASSEX   wcex;

wcex.cbSize   =   sizeof(WNDCLASSEX);  

wcex.style=   CS_HREDRAW   |   CS_VREDRAW;
wcex.lpfnWndProc=   (WNDPROC)WndProc;
wcex.cbClsExtra=   0;
wcex.cbWndExtra=   0;
wcex.hInstance=   hInstance;
wcex.hIcon=   LoadIcon(hInstance,   (LPCTSTR)IDI_CHANCHU);
wcex.hCursor=   LoadCursor(NULL,   IDC_ARROW);


wcex.hbrBackground=   (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName=   (LPCTSTR)IDC_CHANCHU;
wcex.lpszClassName=   szWindowClass;
wcex.hIconSm=   LoadIcon(wcex.hInstance,   (LPCTSTR)IDI_SMALL);

return   RegisterClassEx(&wcex);
}

//
//       函数:   InitInstance(HANDLE,   int)
//
//       目的:   保存实例句柄并创建主窗口
//
//       注释:  
//
//                 在此函数中,我们在全局变量中保存实例句柄并
//                 创建和显示主程序窗口。
//
BOOL   InitInstance(HINSTANCE   hInstance,   int   nCmdShow)
{
      HWND   hWnd;
      HDC   hdc;
      int   i;

      hInst   =   hInstance;   //   将实例句柄存储在全局变量中

      hWnd   =   CreateWindow( "canvas ",   "绘制窗口 ",   WS_OVERLAPPEDWINDOW,
            CW_USEDEFAULT,   0,   CW_USEDEFAULT,   0,   NULL,   NULL,   hInstance,   NULL);

      if   (!hWnd)
      {
            return   FALSE;
      }

      MoveWindow(hWnd,10,10,650,350,true);
      ShowWindow(hWnd,   nCmdShow);
      UpdateWindow(hWnd);

      for(   i=0;   i <=6;   i++)
      {
      hpen[i]=CreatePen(sPen[i],   1,RGB(255,0,0));
      if(6==i)
      hbru[i]=CreateSolidBrush(RGB(0,255,0));
      else
      hbru[i]=CreateHatchBrush(sBru[i],RGB(0,255,0));
      }
 
      hdc=GetDC(hWnd);
      MyPoint(hdc);

      ReleaseDC(hWnd,   hdc);

     

      return   TRUE;
}


  void   MyPoint(HDC   hdc)
      {
      int   i,x1,x2,y;

      for(   i=0;   i <=6;   i++)
      {
      y=(i+1)*30;

                      SelectObject(hdc,hpen[i]);
      MoveToEx(hdc,30,y,NULL);
      LineTo(hdc,100,y);
      }

      x1=120;
      x2=180;

      for(int   i=0;   i <=6;   i++)
      {
      SelectObject(hdc,hbru[i]);
      Rectangle(hdc,x1,30,x2,y);
      x1+=70;
      x2+=70;
      }

      }

   

//
//     函数:   WndProc(HWND,   unsigned,   WORD,   LONG)
//
//     目的:   处理主窗口的消息。
//
//     WM_COMMAND-   处理应用程序菜单
//     WM_PAINT-   绘制主窗口
//     WM_DESTROY-   发送退出消息并返回
//
//
LRESULT   CALLBACK   WndProc(HWND   hWnd,   UINT   message,   WPARAM   wParam,   LPARAM   lParam)


{
int   wmId,   wmEvent;
PAINTSTRUCT   ps;
HDC   hdc;
        int   i;
switch   (message)  
{
case   WM_COMMAND:
wmId         =   LOWORD(wParam);  
wmEvent   =   HIWORD(wParam);  
//   分析菜单选择:
switch   (wmId)
{
case   IDM_ABOUT:
DialogBox(hInst,   (LPCTSTR)IDD_ABOUTBOX,   hWnd,   (DLGPROC)About);
break;
case   IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return   DefWindowProc(hWnd,   message,   wParam,   lParam);
}
break;
case   WM_PAINT:
hdc   =   BeginPaint(hWnd,   &ps);
MyPoint(hdc);
//   TODO:   在此添加任意绘图代码...
EndPaint(hWnd,   &ps);
break;
case   WM_DESTROY:
for(   i=0;   i <=6;   i++)
{
DeleteObject(hpen[i]);
                        DeleteObject(hbru[i]);
}
PostQuitMessage(0);
break;
default:
return   DefWindowProc(hWnd,   message,   wParam,   lParam);
}
return   0;
}

//   “关于”框的消息处理程序。
LRESULT   CALLBACK   About(HWND   hDlg,   UINT   message,   WPARAM   wParam,   LPARAM   lParam)
{
switch   (message)
{
case   WM_INITDIALOG:
return   TRUE;

case   WM_COMMAND:
if   (LOWORD(wParam)   ==   IDOK   ||   LOWORD(wParam)   ==   IDCANCEL)  
{
EndDialog(hDlg,   LOWORD(wParam));
return   TRUE;
}
break;
}
return   FALSE;
}


程序编译的时候没有错误,但是在运行的时候却没有看到界面。是什么原因。
还有一点是我还没有家入coredll.lib   和   winmgr.lib.怎样把它加进去,我用的是2003的,谢谢大家了。


[解决办法]
加入lib用
#pragma comment(lib, "XXXX.lib ")

代码没问题,初步看效果应该十分不错,实在不行就代码还原。

新建一个,然后逐步添加代码,先声明变量,编译,然后实现MyPoint,编译,然后处理WM_PAINT,编译,然后在InitInstance中初始化画笔和画刷、窗口等。一点点来,看看是哪里导致的效果不对劲了,最后很有可能你会发现代码完全一样,新的就能显示的出来。。
[解决办法]
你在主要地方
比如
类注册的返回值
窗口显示时的句柄地址
看看是否成功创建

热点排行