2011-10-29 34 views
0

例如Pacman。嘴巴關閉或打開。當它移動時,這些圖片會彼此改變。 我試圖做這樣的如何在移動對象時更改圖片

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)); 
     } 
    } 
..... 
+0

不要在WM_TIMER處理程序中繪製。只在WM_PAINT中繪製。 –

回答

2

在WM_TIMER消息處理程序中更改狀態變量(如對象座標,活動位圖等),並使窗口無效。在WM_PAINT消息處理程序中進行所有繪圖。

使用InvalidateRect函數http://msdn.microsoft.com/en-us/library/dd145002(v=vs.85).aspx使窗口客戶區失效。這導致WM_PAINT消息被髮送到窗口,並且WM_PAINT消息處理程序根據新的對象狀態重新繪製窗口。

+0

但我用。 '如果(GetAsyncKeyState(VK_DOWN)) \t \t { \t \t \t如果(GreatFuncUpDownReverse(my_pos.x,my_pos.y)) \t \t \t { ChoosePictureInt = 3; \t \t \t ChooseMouseInt * = - 1; \t \t \t my_pos.y + = 2; \t \t \t} \t \t \t else my_pos.y + = 0; \t \t} InvalidateRect(hwnd,NULL,FALSE);' –

+0

這不是我在你的問題中看到的。請張貼您的最後一個代碼版本,並描述準確的情況。從WM_TIMER消息處理程序中刪除所有繪圖代碼。另外,在鍵盤消息處理程序中處理鍵盤按鍵,而不是在WM_TIMER中處理。 –

+0

這是相當大的代碼,但在所有方向之後,我在'break'前使用了IvalidateRect。但問題解決了。 –