在 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(...) 之后,如何给窗口一个颜色?的主要内容,如果未能解决你的问题,请参考以下文章