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

WM_PAINT的有关问题,如何会产生这个消息的循环?

2012-02-01 
WM_PAINT的问题,怎么会产生这个消息的循环??下面这段代码是要让一些球在窗体上跳来跳去。在WM_PAINT的处理

WM_PAINT的问题,怎么会产生这个消息的循环??
下面这段代码是要让一些球在窗体上跳来跳去。在WM_PAINT的处理中,仅仅是改变了每个球的位置,也就是说要不断地产生WM_PAINT消息并处理它,才能实现。问题是,在代码中我并没有不断的产生WM_PAINT消息阿,那么是什么函数隐式的完成了这个消息的循环?代码大致如下:
LRESULT   CALLBACK   WindowProc   (HWND       hwnd,
                                                          UINT       msg,
                                                          WPARAM   wParam,
                                                          LPARAM   lParam)
{
        //create   some   pens   to   use   for   drawing
        static   HPEN   BluePen     =   CreatePen(PS_SOLID,   1,   RGB(0,   0,   255));
        static   HPEN   OldPen       =   NULL;

        //create   a   solid   brush
        static   HBRUSH   RedBrush   =   CreateSolidBrush(RGB(255,   0,   0));
        static   HBRUSH   OldBrush   =   NULL;
   
        //these   hold   the   dimensions   of   the   client   window   area
    static   int   cxClient,   cyClient;
   
        //create   some   balls
        static   SBall*   balls   =   new   SBall[NUM_BALLS];

        switch   (msg)
        {
                case   WM_CREATE:
                        {这里是初始化的一些操作;   }
                break;
   
                case   WM_PAINT:
                {
               
                          PAINTSTRUCT   ps;        
                          BeginPaint   (hwnd,   &ps);
                   
                          OldPen   =   (HPEN)SelectObject(ps.hdc,   BluePen);
                          OldBrush   =   (HBRUSH)SelectObject(ps.hdc,   RedBrush);

                          for   (int   i=0;   i <NUM_BALLS;   ++i)
                          {
                                  if   (   (balls[i].posX   > =   cxClient)   ||   (balls[i].posX   <0))


                                  {
                                            balls[i].velX   =   -balls[i].velX;
                                  }

                                  if   (   (balls[i].posY   > =   cyClient)   ||   (balls[i].posY   <0))
                                  {
                                            balls[i].velY   =   -balls[i].velY;
                                  }

                                  balls[i].posX   +=   balls[i].velX;
                                  balls[i].posY   +=   balls[i].velY            
                   
                                  Ellipse(ps.hdc,
                                      balls[i].posX   -   RADIUS,
                                      balls[i].posY   -   RADIUS,
                                      balls[i].posX   +   RADIUS,
                                      balls[i].posY   +   RADIUS);
                          }//endfor      
       
                          SelectObject(ps.hdc,   OldPen);
                          SelectObject(ps.hdc,   OldBrush);
                   
                          EndPaint   (hwnd,   &ps);

                          Sleep(10);

                  }break;//endcase
           
                  case   WM_DESTROY:
                  {...   }
                  break;

          }//end   switch



          return   DefWindowProc   (hwnd,   msg,   wParam,   lParam);//缺省处理
}


[解决办法]
用定时器,然后用Invalidate触发.
[解决办法]
Invalidate可产生WM_PAINT消息
[解决办法]
自已处理了wm_paint消息就反回return 0,如果你不反回系统会继续处理wm_paint消息
[解决办法]
check out MTGDI and MTMDI samples in MSDN
[解决办法]
上面的代码肯定自己产生不了WM_PAINT消息的,应该在别的地方;
球的跳来跳出,应该是你代码中的循环所致。
[解决办法]
在你的程序的WinMain里面找

热点排行