PeekMessage与GetMessage

  • BOOL PeekMessage(
    
      LPMSG lpMsg, 
    
      HWND hWnd, 
    
      UINT wMsgFilterMin, 
    
      UINT wMsgFilterMax, 
    
      UINT wRemoveMsg 
    
    ); 
    
    
    
    
    
    BOOL GetMessage(
    
      LPMSG lpMsg, 
    
      HWND hWnd, 
    
      UINT wMsgFilterMin, 
    
      UINT wMsgFilterMax 
    
    ); 
    
    
  • 参考msdn:
    • PeekMessage: This function checks a thread message queue for a message and places the message (if any) in the specified structure.
    • GetMessage: This function retrieves a message from the calling thread's message queue and places it in the specified structure. 
  • 解释:
    • 函数名:peek---偷看(没消息?我闪!),get---获取(没消息?我等!)
    • 数:PeekMessage比GetMessage多一个wRemoveMsg 参数(用于设置处理完后,是否从队列中移除消息).除了WM_PAINT消息外,GetMessage获取并移除所处理消息,而PeekMessage则可以通过参数设置是否移除所处理消息.
    • 返回值:GetMessage---对WM_QUIT消息返回zero,其他消息返回nonzero.PeekMessage---有消息返回nonzero,无消息返回zero.
  • PeekMessage应用举例(见<Windows程序设计>):
  • /*----------------------------------------------------------------------
    
            
    
      RANDRECT.C --   Displays Random Rectangles
    
            
    
                    (c) Charles Petzold, 1998
    
            
    
    -----------------------------------------------------------------------*/
    
            
    
    #include <windows.h>
    
            
    
    #include <stdlib.h>// for the rand function
    
            
    
    
    
    LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
    
            
    
    void DrawRectangle (HWND) ;
    
            
    
    
    
    int cxClient, cyClient ;
    
            
    
    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
    
            
    
                       PSTR szCmdLine, int iCmdShow)
    
            
    
    {
    
            
    
        static TCHAR szAppName[] = TEXT ("RandRect") ;
    
            
    
        HWND          hwnd ;
    
            
    
        MSG           msg ;
    
            
    
        WNDCLASS      wndclass ;
    
            
    
       
    
            
    
        wndclass.style        = CS_HREDRAW | CS_VREDRAW ;
    
            
    
        wndclass.lpfnWndProc= WndProc ;
    
            
    
        wndclass.cbClsExtra   = 0 ;
    
            
    
        wndclass.cbWndExtra   = 0 ;
    
            
    
        wndclass.hInstance    = hInstance ;
    
            
    
        wndclass.hIcon        = LoadIcon (NULL, IDI_APPLICATION) ;
    
            
    
        wndclass.hCursor      = LoadCursor (NULL, IDC_ARROW) ;
    
            
    
        wndclass.hbrBackground= (HBRUSH) GetStockObject (WHITE_BRUSH) ;
    
            
    
        wndclass.lpszMenuName= NULL ;
    
            
    
        wndclass.lpszClassName= szAppName ;
    
            
    
        if (!RegisterClass (&wndclass))
    
            
    
        {
    
            
    
                MessageBox (NULL, TEXT ("This program requires Windows NT!"),
    
            
    
                                        szAppName, MB_ICONERROR) ;
    
            
    
                return 0 ;
    
            
    
        }
    
            
    
       
    
            
    
        hwnd = CreateWindow (szAppName, TEXT ("Random Rectangles"),
    
            
    
                               WS_OVERLAPPEDWINDOW,
    
            
    
                               CW_USEDEFAULT, CW_USEDEFAULT,
    
            
    
                               CW_USEDEFAULT, CW_USEDEFAULT,
    
            
    
                               NULL, NULL, hInstance, NULL) ;
    
            
    
       
    
            
    
        ShowWindow (hwnd, iCmdShow) ;
    
            
    
        UpdateWindow (hwnd) ;
    
            
    
       
    
            
    
        while (TRUE)
    
            
    
        {
    
            
    
                if (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE))//有消息,处理消息,无消息,画随机矩形
    
            
    
                {
    
            
    
                       if (msg.message == WM_QUIT)//退出
    
            
    
                         break ;
    
            
    
                       TranslateMessage (&msg) ;
    
            
    
                       DispatchMessage (&msg) ;
    
            
    
            }
    
            
    
                else
    
            
    
                       DrawRectangle (hwnd) ;
    
            
    
        }
    
            
    
        return msg.wParam ;
    
            
    
    }
    
            
    
    
    
    LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
    
            
    
    {
    
            
    
        switch (iMsg)
    
            
    
        {
    
            
    
        case   WM_SIZE:
    
            
    
                cxClient = LOWORD (lParam) ;
    
            
    
                cyClient = HIWORD (lParam) ;
    
            
    
                return 0 ;
    
            
    
            
    
            
    
        case   WM_DESTROY:
    
            
    
                PostQuitMessage (0) ;
    
            
    
                return 0 ;
    
            
    
        }
    
            
    
        return DefWindowProc (hwnd, iMsg, wParam, lParam) ;
    
            
    
    }
    
            
    
    void DrawRectangle (HWND hwnd)
    
            
    
    {
    
            
    
        HBRUSHhBrush ;
    
            
    
        HDC           hdc ;
    
            
    
        RECT          rect ;
    
            
    
       
    
            
    
        if (cxClient == 0 || cyClient == 0)
    
            
    
                return ;
    
            
    
        SetRect (&rect, rand () % cxClient, rand () % cyClient,
    
            
    
                              rand () % cxClient, rand () % cyClient) ;
    
            
    
        hBrush = CreateSolidBrush (
    
            
    
                       RGB (rand () % 256, rand () % 256, rand () % 256)) ;
    
            
    
        hdc = GetDC (hwnd) ;
    
            
    
        FillRect (hdc, &rect, hBrush) ;
    
            
    
        ReleaseDC (hwnd, hdc) ;
    
            
    
        DeleteObject (hBrush) ;
    
            
    
    }
    
    

  • 你可能感兴趣的:(message)