2010-08-26 39 views
1

我有一個窗口,點擊按鈕時會將整個窗口繪製成紅色,但是我的代碼繪製了整個窗口,即使是按鈕。當我調整窗口大小或導致重新繪製按鈕的窗口部分時,按鈕將返回。在繪製窗口後,我只能將按鈕繪製成純色,但這隻能讓它看起來像一個沒有任何東西的正方形。如何重新繪製Win32中的按鈕?

那麼我該如何繪製按鈕的默認顏色?

//WinMain 
hmain = CreateWindowEx (0, L"Window", L"Window", WS_OVERLAPPEDWINDOW, 0, 0, 200, 200, 
    NULL, NULL, hinstance, NULL); 

HWND hwnd2 = CreateWindowEx (0, L"Button", L"Red", WS_CHILD | BS_PUSHBUTTON, 0, 0, 50, 50, 
    hmain, (HMENU) redbtt, hinstance, NULL); 
//Winmain 

//WndProc 
COLORREF red = RGB (255, 0, 0); 
HBRUSH redbrush = CreateSolidBrush (red); 

switch (msg) { 
    case WM_COMMAND: { 
     if (LOWORD (wparam) == redbtt) { 
      color = 'r'; 
      RECT rect; 
      GetClientRect (hmain, &rect); 
      HDC hdc = GetDC (hmain); 
      FillRect (hdc, &rect, redbrush); 
      ReleaseDC (hmain, hdc); 

      /*GetClientRect ((HWND) lparam, &rect); 
      hdc = GetDC ((HWND) lparam); 
      COLORREF color = GetBkColor (hdc); 
      HBRUSH brush = CreateSolidBrush (color); 
      FillRect (hdc, &rect, brush); 
      ReleaseDC ((HWND) lparam, hdc);*/ 
     } 

     break; 
        } 
    case WM_PAINT: { 
     HBRUSH brush; 

     if (color == ' ') { 
      brush = (HBRUSH) (COLOR_WINDOW + 1); 
     } else if (color == 'r') { 
      brush = redbrush; 
     } 

     PAINTSTRUCT ps; 
     HDC hdc = BeginPaint (hmain, &ps); 
     FillRect (hdc, &ps.rcPaint, brush); 
     EndPaint (hmain, &ps); 
     break; 
        } 
//WndProc 

回答

1

這已經有一段時間,因爲我做的Win32,但在我看來,你的畫的東西會是一個更好的WM_ERASEBKGND,因爲這似乎是你在做什麼。你在那裏試過了嗎? (你必須看看,看看,但我不知道,如果BeginPaint適合WM_ERASEBKGND

此外,你應該在CreateSolidBrush的結果調用DeleteObject。我也會等到繪畫內部分配它 - 我不會爲窗口獲得的每條消息分配筆刷。

0

WM_PAINT是在背景上繪製某些東西的時間。如果你想讓窗口呈現穩定的紅色並且不在默認背景和區域之間閃爍,那麼你可能想要使用WM_ERASEBKGND

您可能還會考慮裁剪矩形,以免在實體控件下繪畫。

最後,您可以始終無效或將WM_PAINT發送給您要強制重畫的控件。

1

這是因爲您沒有打開主窗口的WS_CLIPCHILDREN樣式。修復:

hmain = CreateWindowEx (0, L"Window", L"Window", 
      WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN, 0, 0, 200, 200, 
      NULL, NULL, hinstance, NULL); 

'顏色'變量是一個黑客,在實際代碼中避免這種情況。你正在泄漏刷子順便說一句。

+0

這是什麼意思?這只是一個字符決定了WM_PAINT應該塗上什麼顏色。 – TreeTree 2010-08-26 22:38:45

+0

這是一個全局變量。你聽說過全球變數的邪惡嗎?特別不喜歡Windows強制執行的事件驅動編程風格。 「顏色」與窗口強烈關聯,而不是程序的全局狀態以及它創建的所有*其他*窗口。 – 2010-08-26 22:49:42

0
  1. 您應該將WS_CLIPCHILDREN樣式設置爲您的窗口。這樣,按鈕的屬性將自動從繪圖區域中排除,因此您的按鈕不會被「覆蓋」。
  2. 您可以使用InvalidateRect函數來實現所需的效果。