设置子窗口的文本颜色
Setting text color of child window
我正在尝试更改静态控件的文本/背景颜色。我可以通过以下方式做到这一点:
// This is the 'main' window
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
hInst = hInstance;
HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW &~WS_MAXIMIZEBOX | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
CW_USEDEFAULT, 0, 1035, 764, nullptr, nullptr, hInstance, nullptr);
...
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
case WM_CTLCOLORSTATIC:
{
MessageBox( NULL, "CTLCOLORSTATIC called", "", MB_OK );
HDC hdcStatic = (HDC)wParam;
SetTextColor(hdcStatic, RGB(200, 200, 20));
SetBkColor(hdcStatic, RGB(10, 10, 10));
return (INT_PTR)CreateSolidBrush(RGB(30, 30, 30));
}
default:
return DefWindowProc( hWnd, message, wParam, lParam );
}
但是,如果我将窗口放在另一个窗口中,则子控件文本/背景颜色将保持默认值:
// This is the 'parent' window, which resides in the 'main' window
HWND parent = CreateWindowEx
(
0,
_TEXT("STATIC"),
"",
WS_TABSTOP | WS_VISIBLE | BS_SOLID | WS_CLIPCHILDREN,
10, 10, 500, 500,
hwnd,
NULL,
(HINSTANCE)GetWindowLong(hwnd, GWLP_HINSTANCE),
NULL
);
// This is the 'child' window which resides in the 'parent' window
HWND child = CreateWindowEx
(
0,
_TEXT("STATIC"),
"SubItem",
WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_SOLID,
10, 10, 100, 100,
parent,
NULL,
(HINSTANCE)GetWindowLong(parent, GWLP_HINSTANCE),
NULL
);
总而言之,我有 3 个窗口:
HWND hwnd; // the 'main' application window (color changes fine)
HWND parent; // the 'parent/container' window which is inside the 'main' window (color changes fine)
HWND child; // the 'child' window which is inside the 'parent' window (color DOES NOT change)
即使我将 MessageBox 放在WM_CTLCOLORSTATIC中,我也会看到每次绘制子项时都会触发它,但颜色不会为子项更改,而只会为父项更改颜色。
据我了解,我需要在主窗口过程中处理消息,但我并不完全清楚如何做到这一点。 如果我将 (HWND)lParam 与子级 HWND 进行比较,它们是相同的(在默认开关情况下),所以我可以在"默认"部分获得引用,但我不确定我应该如何从那里处理它。
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
case WM_CTLCOLORSTATIC:
{
if ((HWND)lParam == child )
MessageBox( NULL, "Reference Match for CTLCOLORSTATIC", "", MB_OK ); // <-- THIS NEVER TRIGGERS
}
....
default:
if ((HWND)lParam == child )
MessageBox( NULL, "Reference Match for DEFAULT", "", MB_OK ); // <-- THIS DOES TRIGGER
return DefWindowProc( hWnd, message, wParam, lParam );
}
return 0;
}
我将一个窗口放在另一个窗口中的原因是我可以在父窗口中使用WS_CLIPCHILDREN属性(以防子窗口移动/滚动)。
WM_CTLCOLORSTATIC
由静态控件发送到其父窗口,而不是顶级窗口。
hwndMain: WM_CTLCOLORSTATIC for hwnd1
|
--hwnd1: WM_CTLCOLORSTATIC for hwnd2 (You might have to subclass hwnd1)
|
--hwnd2
您也在泄漏画笔,请在创建窗口时将画笔从CreateSolidBrush
存储在某个地方,并在窗口被破坏时将其删除。
通过阅读 MSDN 文档,我知道一个函数SetWindowsLongPtr
,其参数GWLP_WNDPROC
可以为窗口过程设置新地址。
这个函数可以改变子窗口的文本颜色和背景颜色,也就是说可以触发WM_CTLCOLORSTATIC
。
但是经过测试,我发现它对辅助窗口无效,也就是说它不能改变父窗口的文本颜色。
我也查阅了很多信息,很少有与三层窗口相关的文件。
所以,我认为要解决这个问题,让三个窗口都改变文本的颜色,你可能要自己重写WndProc
,但这非常复杂,涉及很多事情。
编辑:如果您只需要更改文本颜色和背景颜色 的静态控件,您可以自定义控件,以便 处理其所有操作。
希望对您有所帮助。
- 通过样式表仅在QTabWidget中应用文本颜色一个特定选项卡
- 控制台中文本颜色异常
- 文本颜色 QPlainTextEdit QT
- 更改悬停在Gtkbutton的文本颜色
- 如何将控制台输出的文本颜色更改为红色,但如果从Powershell或CMD运行,背景将保持相同的颜色
- 设置子窗口的文本颜色
- 更改数组中元素的文本颜色
- 尝试选择文本颜色
- MFC Rich编辑控件2.0文本颜色
- 无法更改 Visual Studio 2010 中输出的文本颜色和文本背景
- 使用 conio.h 更改文本颜色时出错
- Mouseover SDL2时更改文本颜色
- 为qlineedit设置了背景图像时,如何在qlineedit中设置文本颜色
- 如何从qplaintExtedIt获取文本颜色
- 自定义图形列表视图项目不更改文本颜色
- 直接在.png加载的cimage上绘制时,将文本颜色设置为
- 静态文本颜色
- QMenu:为特定 QAction 设置文本颜色
- 如何更改代码块中的文本颜色和控制台颜色
- Win32:设置富编辑的默认字体和文本颜色