在 createwindow(...) 之后,如何给窗口一个颜色?

Posted

技术标签:

【中文标题】在 createwindow(...) 之后,如何给窗口一个颜色?【英文标题】:After createwindow(...), how to give the window a color? 【发布时间】: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)?我找不到这么直接的方法,所以我来到了这里。我不知道怎么画,如果我需要自己做这个 【参考方案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); // 一个红色窗口类背景

【讨论】:

以上是关于在 createwindow(...) 之后,如何给窗口一个颜色?的主要内容,如果未能解决你的问题,请参考以下文章

CreateWindow函数问题

CreateWindow 找不到窗口类

visual c++中如何用CreateWindow函数创建状态栏

用createwindow 为啥没窗口出来???

关于VC++ Createwindow的用法

win32界面程序开发,自制一个会自动销毁的提示框