代码之家  ›  专栏  ›  技术社区  ›  TreeTree

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

  •  1
  • TreeTree  · 技术社区  · 15 年前

    那么,如何将按钮涂成默认颜色?

    //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 回复  |  直到 15 年前
        1
  •  1
  •   Thanatos    15 年前

    我已经有一段时间没有写Win32了,但在我看来,你的绘画作品比 WM_ERASEBKGND ,因为你似乎就是这样做的。你在那儿试过吗?(你得看看,但我不确定 BeginPaint 适用于 WM峈ERASEBKGND

    还有,你应该打电话来 DeleteObject CreateSolidBrush . 我也会等到画画的东西里面去分配它——我不会在你的窗口收到的每一条信息上分配画笔。

        2
  •  1
  •   Hans Passant    15 年前

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

    'color'变量是一个黑客,避免在实际代码中使用。你把刷子漏了。

        3
  •  0
  •   Greg Domjan    15 年前

    WM_PAINT WM_ERASEBKGND .

    也可以考虑剪切矩形,这样就不会在实体控件下绘制。

    最后,您可以始终使 要强制重画的控件。

        4
  •  0
  •   valdo    15 年前
    1. 你应该设置 WS_CLIPCHILDREN 适合您的窗户。这样,按钮的区域将自动从绘图区域中排除,因此按钮不会被“覆盖”。
    2. 你可以使用 InvalidateRect ,函数以达到所需的效果。