#include <windows.h>
#include <stdio.h>LRESULT CALLBACK WinLscProc(
  HWND hwnd,      // handle to window
  UINT uMsg,      // message identifier
  WPARAM wParam,  // first message parameter
  LPARAM lParam   // second message parameter
);int WINAPI WinMain(
  HINSTANCE hInstance,      // handle to current instance
  HINSTANCE hPrevInstance,  // handle to previous instance
  LPSTR lpCmdLine,          // command line
  int nCmdShow              // show state
)
{
WNDCLASS wndcls;
wndcls.cbClsExtra=0;
wndcls.cbWndExtra=0;
         wndcls.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
wndcls.hCursor=LoadCursor(NULL,IDC_CROSS);
wndcls.hIcon=LoadIcon(NULL,IDI_ERROR);
wndcls.hInstance=hInstance;
wndcls.lpfnWndProc=WinLscProc;
wndcls.lpszClassName="Templar";
wndcls.lpszMenuName=NULL;
wndcls.style=CS_HREDRAW | CS_VREDRAW;
RegisterClass(&wndcls); HWND hwnd;
hwnd=CreateWindow("Templar","This is a simply program!",WS_OVERLAPPEDWINDOW,
0,0,600,400,NULL,NULL,hInstance,NULL);

ShowWindow(hwnd,SW_SHOWNORMAL);
UpdateWindow(hwnd); MSG msg;
while(GetMessage(&msg,NULL,0,0))   //while(GetMessage(&msg,hwnd,0,0))
         //在这里我开始的时候把第二个参数设成了hwnd 导致我程序关闭后就不能销毁
         //这是为什么啊?
         //BOOL GetMessage(
         //LPMSG lpMsg,         // message information
         //HWND hWnd,           // handle to window
         //UINT wMsgFilterMin,  // first message
         //UINT wMsgFilterMax   // last message
         //);
         //这是GetMessage的原型 {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}LRESULT CALLBACK WinLscProc(
  HWND hwnd,      // handle to window
  UINT uMsg,      // message identifier
  WPARAM wParam,  // first message parameter
  LPARAM lParam   // second message parameter
)
{
switch(uMsg)
{
case WM_CHAR:
char szChar[20];
sprintf(szChar,"Char is %d",wParam);
MessageBox(hwnd,szChar,"hello",0);
break;
case WM_LBUTTONDOWN:
MessageBox(hwnd,"Mouse clicked","hello",0);
HDC hdc;
hdc=GetDC(hwnd);
TextOut(hdc,0,50,"This is a good start!",strlen("This is a good start!"));
ReleaseDC(hwnd,hdc);
break;
case WM_PAINT:
HDC hDC;
PAINTSTRUCT ps;
hDC=BeginPaint(hwnd,&ps);
TextOut(hDC,0,0,"Thank you!",strlen("Thank you!"));
EndPaint(hwnd,&ps);
break;
case WM_CLOSE:
if(IDYES==MessageBox(hwnd,"         Yes/No","hello",MB_YESNO))
{
DestroyWindow(hwnd);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default :
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}

}刚学VC++,问题在中间的注释中  请指教!

解决方案 »

  1.   

    GetMessage的第二个参数为Null时,接收所有属于当前线程的线程消息和窗口消息,如果设置为hwnd则只接收属于这个窗口的消息。
      

  2.   

    在深入浅出vc++中提到过这个问题,同时在msdn中对GetMessage的返回值有描述,下面是从msdn复制的Return ValueIf the function retrieves a message other than WM_QUIT, the return value is nonzero.If the function retrieves the WM_QUIT message, the return value is zero. If there is an error, the return value is -1. For example, the function fails if hWnd is an invalid window handle or lpMsg is an invalid pointer. To get extended error information, call GetLastError.Warning  
    Because the return value can be nonzero, zero, or -1, avoid code like this:while (GetMessage( lpMsg, hWnd, 0, 0)) ...
    The possibility of a -1 return value means that such code can lead to fatal application errors. Instead, use code like this:Hide ExampleBOOL bRet;while( (bRet = GetMessage( &msg, hWnd, 0, 0 )) != 0)

        if (bRet == -1)
        {
            // handle the error and possibly exit
        }
        else
        {
            TranslateMessage(&msg); 
            DispatchMessage(&msg); 
        }
    }