2014-01-26 183 views
1

我正在試圖製作一個程序來控制箭頭鍵的方框的移動。我在我的代碼中遇到問題。是否可以通過SendMessage向WM_PAINT發送消息以繪製一個新的矩形按下左鍵? 以下是我的代碼發送消息到WM_PAINT

case WM_KEYDOWN: 
    switch(wParam) 
    { 
     case VK_LEFT:        //LEFT MOVEMENT 


    SendMessage(hwnd,WM_PAINT,VK_LEFT,0); 
     break; 



     case VK_ESCAPE: 
      //FOR ENDING THE GAME WITH ESCAPE KEY 
      SendMessage(hwnd,WM_DESTROY,VK_ESCAPE,0); 
     break; 
    } 


case WM_PAINT: 
    hdc=BeginPaint(hwnd,&ps); 


     Rectangle(hdc,x,600,x1,700); 
    if(wParam==VK_LEFT) 
    { Rectangle(hdc,x-50,600,x1-50,700); 

    } 
    EndPaint(hwnd,&ps); 
    return 0; 
case WM_DESTROY: 

    PostQuitMessage(0); 
    return 0; 
} 
return DefWindowProc(hwnd,message,wParam,lParam); 
} 
where 

     x1=550; 
      x=500 

當按下左鍵,然後就控制進行到WM_PAINT

因爲當我寫

if(wParam==VK_LEFT) 
     { Rectangle(hdc,x-50,600,x1-50,700); 

     } 

什麼也不會發生,但是當我寫

if(wParam==VK_ESCAPE) 
    PostQuitMessage(0); 
    return 0; 

該窗口以退出鍵退出 它不是最終的代碼。我只是想明白,爲什麼VK_LEFT不執行?

回答

5

永遠不會發送WM_PAINT。該系統負責這樣做。相反,您可以撥打InvalidateRect指定您希望重新繪製的矩形。系統會將該矩形標記爲無效,並且當下一次繪製週期發生時,該矩形將被重新繪製。

如果你想使更復雜的區域無效,那麼有InvalidateRgn

如果您只希望整個窗口無效,請將NULL傳遞給lpRect參數InvalidateRect

+0

+1 This。雖然你可以發送'WM_PAINT',但它不會像預期的那樣工作(例如'WM_TIMER')。 – Damon

+0

它是專門用於WM_PAINT嗎? – Freedom911

+0

@Damon如果你發送了'WM_PAINT',或者甚至發佈了它,當處理該消息的窗口過程調用'BeginPaint'時會發生什麼? –