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) ;
            
    }
    

  • 原文地址:https://www.cnblogs.com/dahai/p/2098068.html