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

新手问:WM_PAINT和WM_SIZE的先后顺序有关问题

2012-02-12 
新手问:WM_PAINT和WM_SIZE的先后顺序问题?我想知道在下面的代码中WM_PAINT和WM_SIZE的顺序。/*------------

新手问:WM_PAINT和WM_SIZE的先后顺序问题?
我想知道在下面的代码中WM_PAINT和WM_SIZE的顺序。
/*--------------------------------------------------
      CLOVER.C   --   Clover   Drawing   Program   Using   Regions
                              (c)   Charles   Petzold,   1998
    --------------------------------------------------*/

#include   <windows.h>
#include   <math.h>

#define   TWO_PI   (2.0   *   3.14159)

LRESULT   CALLBACK   WndProc   (HWND,   UINT,   WPARAM,   LPARAM)   ;

int   WINAPI   WinMain   (HINSTANCE   hInstance,   HINSTANCE   hPrevInstance,
                                        PSTR   szCmdLine,   int   iCmdShow)
{
          static   TCHAR   szAppName[]   =   TEXT   ( "Clover ")   ;
          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   ( "Draw   a   Clover "),


                                                    WS_OVERLAPPEDWINDOW,
                                                    CW_USEDEFAULT,   CW_USEDEFAULT,
                                                    CW_USEDEFAULT,   CW_USEDEFAULT,
                                                    NULL,   NULL,   hInstance,   NULL)   ;
         
          ShowWindow   (hwnd,   iCmdShow)   ;
          UpdateWindow   (hwnd)   ;
         
          while   (GetMessage   (&msg,   NULL,   0,   0))
          {
                    TranslateMessage   (&msg)   ;
                    DispatchMessage   (&msg)   ;
          }
          return   msg.wParam   ;
}

LRESULT   CALLBACK   WndProc   (HWND   hwnd,   UINT   iMsg,   WPARAM   wParam,   LPARAM   lParam)
{
          static   HRGN   hRgnClip   ;
          static   int     cxClient,   cyClient   ;
          double             fAngle,   fRadius   ;
          HCURSOR           hCursor   ;
          HDC                   hdc   ;
          HRGN                 hRgnTemp[6]   ;
          int                   i   ;
          PAINTSTRUCT   ps   ;
         
          switch   (iMsg)
          {
          case   WM_SIZE:
                    cxClient   =   LOWORD   (lParam)   ;
                    cyClient   =   HIWORD   (lParam)   ;
                      MessageBox   (   hwnd,TEXT( "this   is   in   WM_SIZE   before   !! ")   ,TEXT( "   in   size   before "),NULL   );
   
                    hCursor   =   SetCursor   (LoadCursor   (NULL,   IDC_WAIT))   ;
                    ShowCursor   (TRUE)   ;


                  //   MessageBox   (   hwnd,TEXT( "this   is   in   WM_SIZE   !! ")   ,TEXT( "   in   size "),NULL   );
                    if   (hRgnClip)
                              DeleteObject   (hRgnClip)   ;

                    //   MessageBox   (   hwnd,TEXT( "this   is   in   WM_SIZE   brfore   !! ")   ,TEXT( "   in   size   "),NULL   );

                    hRgnTemp[0]   =   CreateEllipticRgn   (0,   cyClient   /   3,
                                                                                      cxClient   /   2,   2   *   cyClient   /   3)   ;
                    hRgnTemp[1]   =   CreateEllipticRgn   (cxClient   /   2,   cyClient   /   3,
                                                                                      cxClient,   2   *   cyClient   /   3)   ;
                    hRgnTemp[2]   =   CreateEllipticRgn   (cxClient   /   3,   0,
                                                                                      2   *   cxClient   /   3,   cyClient   /   2)   ;
                    hRgnTemp[3]   =   CreateEllipticRgn   (cxClient   /   3,   cyClient   /   2,
                                                                                      2   *   cxClient   /   3,   cyClient)   ;
                    hRgnTemp[4]   =   CreateRectRgn   (0,   0,   1,   1)   ;
                    hRgnTemp[5]   =   CreateRectRgn   (0,   0,   1,   1)   ;
                    hRgnClip         =   CreateRectRgn   (0,   0,   1,   1)   ;
                   
                    CombineRgn   (hRgnTemp[4],   hRgnTemp[0],   hRgnTemp[1],   RGN_OR)   ;


                    CombineRgn   (hRgnTemp[5],   hRgnTemp[2],   hRgnTemp[3],   RGN_OR)   ;
                    CombineRgn   (hRgnClip,         hRgnTemp[4],   hRgnTemp[5],   RGN_XOR)   ;

                    //MessageBox   (   hwnd,TEXT( "this   is   in   WM_SIZE     after!! ")   ,TEXT( "   in   size   after "),NULL   );

                    for   (i   =   0   ;   i   <   6   ;   i++)
                              DeleteObject   (hRgnTemp[i])   ;
                   
                    SetCursor   (hCursor)   ;
                    ShowCursor   (FALSE)   ;
                    return   0   ;
                   
          case   WM_PAINT:
                    hdc   =   BeginPaint   (hwnd,   &ps)   ;

                    MessageBox   (   hwnd,TEXT( "this   is   in   WM_PAINT     before   !! ")   ,TEXT( "   in   paint   before "),NULL   );

                    SetViewportOrgEx   (hdc,   cxClient   /   2,   cyClient   /   2,   NULL)   ;
                    SelectClipRgn   (hdc,   hRgnClip)   ;
                   
                    fRadius   =   _hypot   (cxClient   /   2.0,   cyClient   /   2.0)   ;
                   
                    for   (fAngle   =   0.0   ;   fAngle   <   TWO_PI   ;   fAngle   +=   TWO_PI   /   360)
                    {
                              MoveToEx   (hdc,   0,   0,   NULL)   ;
                              LineTo   (hdc,   (int)   (   fRadius   *   cos   (fAngle)   +   0.5),
                                                        (int)   (-fRadius   *   sin   (fAngle)   +   0.5))   ;
                    }

//     MessageBox   (   hwnd,TEXT( "this   is   in   WM_PAINT   after!! ")   ,TEXT( "   in   paint   after "),NULL   );



                    EndPaint   (hwnd,   &ps)   ;
                    return   0   ;
                   
          case   WM_DESTROY:
                    DeleteObject   (hRgnClip)   ;
                    PostQuitMessage   (0)   ;
                    return   0   ;
          }
          return   DefWindowProc   (hwnd,   iMsg,   wParam,   lParam)   ;
}
我通过加MessageBox得到WM_PAINT然后WM_SIZE但是在CSDN以前的贴子中说的刚好相反,贴子为:http://topic.csdn.net/t/20030223/12/1456618.html#
高人能给个解释吗?尤其是在windows   是消息这一部分。。

[解决办法]
这样说吧,比如你改变窗体大小,那么就是WM_SIZE
当窗体最小化又还原的时候就是WM_PAINT。
但是我怎么知道楼主你是先改变它大小还是先吧它最小化。我又不是你。
[解决办法]
窗口在初次显示的时候是先有WM_SIZE,然后才是WM_PAINT。另外,一般不要在WM_PAINT中调用MessageBox,这可能会导致窗口不断的重绘,你可以使用OutputDebugString,或者其它不会影响UI的方法
[解决办法]
当窗口从无到有的时候,整个客户区都是无效的,这是会产生WM_PAINT消息;
当调用ShowWindow函数时,此函数会发送WM_SIZE消息;
以后如果窗口的客户区在产生无效区域,那么就会发送WM_PAINT消息,
如果窗口大小发生变化,会发送WM_SIZE消息

热点排行