如何在Win32中重新绘制按钮?

时间:2010-08-26 20:40:09

标签: c++ winapi

我有一个带有按钮的窗口,点击时会将整个窗口描绘为红色,但我的代码会绘制整个窗口,甚至是按钮。当我调整窗口大小或导致按钮重绘的窗口部分时,按钮将返回。我只能在绘制窗口后将按钮绘制为纯色,但这只会使其看起来像一个没有任何内容的正方形。

那么如何将按钮绘制为默认颜色?

//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

4 个答案:

答案 0 :(得分:1)

自从我完成Win32以来已经有一段时间了,但在我看来,你的绘画内容会更好WM_ERASEBKGND,因为这似乎就是你正在做的事情。你在那里试过吗? (您必须查看并查看,但我不确定BeginPaint是否适合WM_ERASEBKGND

此外,您应该在DeleteObject的结果上致电CreateSolidBrush。我也要等到绘画内部分配它 - 我不会在你的窗口得到的每条消息上分配画笔。

答案 1 :(得分:1)

这是因为您没有为主窗口打开WS_CLIPCHILDREN样式。修正:

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

'color'变量是一个hack,在实际代码中避免这种情况。你正在泄漏刷子。

答案 2 :(得分:0)

WM_PAINT是在背景上绘制内容的时间。如果您希望窗口为纯红色而不是在默认背景和reg之间闪烁,那么您可能希望使用WM_ERASEBKGND

您可能还会考虑裁剪矩形,以免在实体控制下进行绘制。

最后,您始终可以使WM_PAINT无效或发送给您想要强制重绘的控件。

答案 3 :(得分:0)

  1. 您应该将WS_CLIPCHILDREN样式设置为您的窗口。这样,按钮的按钮将自动从绘图区域中排除,因此您的按钮不会被“覆盖”。
  2. 您可以使用InvalidateRect,`函数来实现所需的效果。