例如吃豆人。嘴巴闭合或张开。并且在移动时,这些图片会相互更改。
我试图这样做

 case WM_PAINT:
 ......
 if (ChoosePictureInt==0)
    {
         MaskBlt(mdc,my_pos.x,my_pos.y,my_size.cx,my_size.cy,my_dc,0,0,my_closemask,0,0,MAKEROP4(SRCCOPY,SRCPAINT));
         MaskBlt(mdc, my_pos.x, my_pos.y, my_size.cx, my_size.cy, my_dc, 0, 0, my_mask, 0, 0, MAKEROP4(SRCCOPY, SRCPAINT));

    }


但是结果是我在窗口中只有最后一张照片。
当我想这样做时(以​​防WM_TIMER)

 case WM_TIMER:
     if(LOWORD(wParam) == 777u) {
        if(GetAsyncKeyState(VK_LEFT))
      {
         if (GreatFuncLeftRight(my_pos.x,my_pos.y))
         {
            ChoosePictureInt = 1;
            if (ChooseMouseInt == 0)
                ChooseMouseInt = 0;
            else ChooseMouseInt = 0;
            my_pos.x -= 2;  // влево
                      MaskBlt(mdc, my_pos.x, my_pos.y, my_size.cx, my_size.cy, my_dc, 0, 0, my_mask, 0, 0, MAKEROP4(SRCCOPY, SRCPAINT));
         }
         else my_pos.x-=0;
      }


什么都没发生

我的答案

这就是我解决这个问题的方式(我认为这不是最好的方法)

//for examp. for -> direction
if(GetAsyncKeyState(VK_RIGHT))
      {
         if (GreatFuncLeftRightReverse(my_pos.x,my_pos.y))
         {
                            ChoosePictureInt = 0; //variable for picture with direction
            ChooseMouseInt *=-1; //variable for closed or opened mouth
            my_pos.x += 5;  // вправо
         }
         else my_pos.x+=0;
      }


这是WM_PAINT中的事件

......
if (ChoosePictureInt==0)
    {
      if(ChooseMouseInt<0)
      {
          Sleep(85);
         MaskBlt(mdc,my_pos.x,my_pos.y,my_size.cx,my_size.cy,my_dc,0,0,my_mask,0,0,MAKEROP4(SRCCOPY,SRCPAINT));
      }
      else
      {
          Sleep(85);
         MaskBlt(mdc, my_pos.x, my_pos.y, my_size.cx, my_size.cy, my_dc4, 0, 0, my_closemask, 0, 0, MAKEROP4(SRCCOPY, SRCPAINT));
      }
    }
.....

最佳答案

在WM_TIMER消息处理程序中更改状态变量(例如对象坐标,活动位图等),并使窗口无效。在WM_PAINT消息处理程序中绘制所有图形。

使用InvalidateRect函数http://msdn.microsoft.com/en-us/library/dd145002(v=vs.85).aspx使窗口工作区无效。这导致WM_PAINT消息被发送到窗口,并且WM_PAINT消息处理程序根据新的对象状态重新绘制窗口。

10-04 11:38