2012-11-08 38 views
0

昨天我問了我的問題,但無法得到正確的答案。現在生病了,問得更清楚些。 使用win api我創建了一個窗口和一個按鈕。在按鈕的前面有一個以綠色繪製的圓圈。一旦按下該按鈕,圓圈就會變成紅色。使用InvalideRect()更改GDI形狀

(我使用C++,和MinGW編譯器。)

這裏是我的代碼

LRESULT CALLBACK WinProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam) 
{ 
PAINTSTRUCT ps; 
HDC hDC; 
HBRUSH brusha; 
brusha=CreateSolidBrush(RGB(0,255,0)); 

switch(msg) 
{ 
    case WM_CREATE: 
    { 

     b=CreateWindowEx(WS_EX_CLIENTEDGE, 
      "BUTTON", 
      "red", 
      WS_CHILD|WS_VISIBLE| 
      BS_DEFPUSHBUTTON, 
      350, 
      100, 
      100, 
      40, 
      hWnd, 
      (HMENU)BUTTON, 
      GetModuleHandle(NULL), 
      NULL); 
    } 
    break; 


    case WM_PAINT: 
    { 


    hDC=BeginPaint(hWnd,&ps); 
    SelectObject(hDC,brusha); 
    Ellipse(hDC, 20, 20, 100, 100); 
    EndPaint(hWnd, &ps); 

    } 

    case WM_COMMAND: 
     switch(LOWORD(wParam)) 
     { 
      case BUTTON: 
      { 
      brusha=CreatSolideBrush(RGB(255,0,0)); 
      InvalidateRect(hWnd,0,false); 

      } 
     } 
    break; 


     case WM_DESTROY: 
    { 
     PostQuitMessage(0); 
     return 0; 
    } 
    break; 
} 

return DefWindowProc(hWnd,msg,wParam,lParam); 

    } 

這個編譯沒有錯誤。但按鈕點擊沒有任何反應

+0

你的問題是什麼? –

+0

@RaymondChen這個編譯與我的錯誤,但沒有任何反應按鈕點擊。 –

回答

0

那麼問題是,你總是用綠色畫筆繪製。看看你的代碼

HBRUSH brusha; 
brusha=CreateSolidBrush(RGB(0,255,0)); 

switch(msg) 
{ 
    ... 
    case WM_PAINT: 
    { 
    hDC=BeginPaint(hWnd,&ps); 
    SelectObject(hDC,brusha); 
    ... 

在這段代碼brusha總是要當你進入WM_PAINT是一個綠色的畫筆。

您似乎認爲,只是因爲你分配一個紅色刷到,不知怎的,那是會被記住的下一個漆WM_COMMAND部分brusha變量,但事實並非如此。請記住,在C++中,每次輸入函數時都會重新創建變量,並且每次退出函數時都會銷燬變量。所以你寫代碼的方式是行不通的。

可能最簡單的方法是使hbrusha變量static。靜態變量是而不是每次進入和退出功能時創建和銷燬。像這樣的東西

LRESULT CALLBACK WinProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam) 
{ 
    static HBRUSH brusha; 

    switch(msg) 
    { 
    case WM_CREATE: 
     brusha=CreateSolidBrush(RGB(0,255,0)); // set the brush green on create 

     ... 

     break; 


    case WM_COMMAND: 
     switch(LOWORD(wParam)) 
     { 
     case BUTTON: 
      brusha=CreatSolideBrush(RGB(255,0,0)); 
      InvalidateRect(hWnd,0,false); 
     } 
     break; 

     ... 

    } 

    ... 
} 
+0

很好的答案。非常感謝。兩天前我在這個問題上尋求幫助。沒有你的幫助,我永遠也找不到這個。再次感謝。這工作正確... :) –

+1

請注意,此代碼泄漏GDI對象,因爲你永遠不會銷燬你創建的畫筆。 –