【问题标题】:After createwindow(...), how to give the window a color?在 createwindow(...) 之后,如何给窗口一个颜色?
【发布时间】:2012-04-21 06:13:08
【问题描述】:

我创建了一个句柄为handle_parent 的窗口。然后我创建了一个子窗口如下:

hwnd_child = CreateWindow(child_class_name, _T(""),
WS_CHILDWINDOW, 0, 0, 0, 0, hwnd_parent, (HMENU)0, ghinst, NULL);
ShowWindow(win->hwndSplitterBar, SW_SHOW);
UpdateWindow(win->hwndSplitterBar);

我想设置子窗口“child”的颜色。如果我什么都不做,默认情况下颜色是灰色的。 我怎么能设置它的颜色?我想将颜色保持为黑色,无论如何都要更改。

【问题讨论】:

  • 你是如何绘制你的子窗口的?
  • 我根本不画......有没有直接的方法可以做到这一点,比如setbgcolor(hwnd_child)?我找不到这么直接的方法,所以我来到了这里。我不知道怎么画,如果我需要自己做这个

标签: c++ window background-color createwindow


【解决方案1】:

创建所需颜色的画笔,然后在调用RegisterClass 注册您的窗口类时将其传递给WNDCLASS 结构的hbrBackground 成员。

当你调用UnregisterClass时系统会自动删除这个画笔,所以一旦你把这个画笔传给RegisterClass你就可以忘记它了,千万不要试图自己删除它。

【讨论】:

    【解决方案2】:

    这个例子可能会有所帮助:

    //Setting the background color of a window during window class registration
    WNDCLASS wc = { 0 } ( or WNDCLASS wc; memset(&wc, 0, sizeof(wc)); )
    ...
    ...
    ...
    wc.hbrBackground = CreateSolidBrush(0x000000ff); // a red window class background
    ...
    ...
    RegisterClass(&wc);
    
    // Setting the background during WM_ERASEBKGND
    LRESULT CALLBACK YourWndProc(HWND hwnd, UINT umsg, WPARAM,LPARAM)
    {
       switch( umsg )
       {
          case WM_ERASEBKGND:
          {
             RECT rc;
             GetClientRect(hwnd, &rc);
             SetBkColor((HDC)wParam, 0x000000ff); // red
             ExtTextOut((HDC)wParam, 0, 0, ETO_OPAQUE, &rc, 0, 0, 0);
             return 1;
          }
          // or in WM_PAINT
          case WM_PAINT:
          {
             PAINTSTRUCT ps;
             RECT rc;
             HDC hdc = BeginPaint(hwnd, &ps);
             GetClientRect(hwnd, &rc);
             SetBkColor(hdc, 0x000000ff); // red
             ExtTextOut(hdc, 0, 0, ETO_OPAQUE, &rc, 0, 0, 0);
             EndPaint(hwnd, &ps);
             break;
          }
          ...
          ...
          ...
          default:
             return DefWindowProc(...);
       }
       return 0;
    }
    

    【讨论】:

      【解决方案3】:

      使用 CreateSolidBrush()::

      WNDCLASS wc = { 0 } (或 WNDCLASS wc; memset(&wc, 0, sizeof(wc)); ) ... wc.hbrBackground = CreateSolidBrush(RGB(255,0,0)) 或 CreateSolidBrush(0x000000ff); // 一个红色窗口类背景

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-06-22
        • 1970-01-01
        • 2021-08-24
        • 2022-12-10
        • 1970-01-01
        • 1970-01-01
        • 2011-03-28
        • 1970-01-01
        相关资源
        最近更新 更多