下面这段代码是要让一些球在窗体上跳来跳去。在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);//缺省处理
}

解决方案 »

  1.   

    用定时器,然后用Invalidate触发.
      

  2.   

    不,不用加Invalidate触发,上面的这段代码本身就能够产生WM_PAINT的消息循环,就是不明白为什么。是这里面用到的函数隐式的完成了这个过程??谢谢解答:)
      

  3.   

    自已处理了wm_paint消息就反回return 0,如果你不反回系统会继续处理wm_paint消息
      

  4.   

    刚才加上return 0;试了下,没有效果。我觉得应该不是return的问题,即使你return了,但没有wm_paint消息,程序仍然跑不到这里面来,关键在于在什么地方产生了无穷的wm_paint消息。个人意见,不知道对不对。
      

  5.   

    check out MTGDI and MTMDI samples in MSDN
      

  6.   

    上面的代码肯定自己产生不了WM_PAINT消息的,应该在别的地方;
    球的跳来跳出,应该是你代码中的循环所致。
      

  7.   

    非常感谢syy64(太平洋)和whp320(征服者) 两位!
    仔细查看源代码,发现在消息循环的部分还有其它的处理。:)
    再次感谢各位!!