C++ 如何在winapi中正确设置文本颜色
我将手柄包装在一个小部件类中,这样前景色、背景色和光标就可以随车行驶了 我很难弄清楚如何设置静态控件的前景(文本)颜色。我可以更改前景色,但背景色与窗口颜色不匹配,或者窗口颜色正确,但文本颜色不正确 这里是我所拥有的,这里的控件是静态控件,但窗口上也有编辑控件:C++ 如何在winapi中正确设置文本颜色,c++,winapi,win32gui,C++,Winapi,Win32gui,我将手柄包装在一个小部件类中,这样前景色、背景色和光标就可以随车行驶了 我很难弄清楚如何设置静态控件的前景(文本)颜色。我可以更改前景色,但背景色与窗口颜色不匹配,或者窗口颜色正确,但文本颜色不正确 这里是我所拥有的,这里的控件是静态控件,但窗口上也有编辑控件: case WM_CTLCOLOREDIT: case WM_CTLCOLORSTATIC: widget = Widget::find((HWND)lParam); // find a widget from handle
case WM_CTLCOLOREDIT:
case WM_CTLCOLORSTATIC:
widget = Widget::find((HWND)lParam); // find a widget from handle
if (widget)
{
COLORREF color = widget->color();
HBRUSH bg = widget->background(); // may be nullptr if none set (use default window bg)
SetBkMode((HDC)wParam, TRANSPARENT);
SetTextColor((HDC)wParam, color);
// try 1: always return the background, even if nullptr
// result: correct foreground color, incorrect background color (white)
return (INT_PTR)bg;
// try 2: only return the background if set, else default to DefWindowProcW(...)
// result: incorrect foreground color (black), correct background color
if (bg) return (INT_PTR)bg;
break;
// try 3: if no background, ask for parent's background
// result: both foreground and background are correct,
// however, every control has the same background color (the main window's),
// but some controls I want to have their default
// (i.e. edit controls have a white background by default)
while (!bg && widget)
{
widget = widget->parent();
if (widget) bg = widget->background();
}
return (INT_PTR)bg;
}
可以在不设置背景的情况下设置前景(文本)颜色吗?我并不总是知道背景色是什么(当background()
返回null ptr时),我希望使用控件的默认值
或者,我是否采取了完全错误的方法
我不熟悉Win32 API和GUI编程。WM\u CTLCOLOREDIT的文档说,如果应用程序处理此消息,它必须返回画笔句柄。系统使用笔刷绘制编辑控件的背景。。必须您不能返回null。@JonathanPotter太棒了。但它并没有真正回答这个问题。当我不知道背景色是什么时,如何更改文本颜色?这也是为什么尝试#2调用
SetTextColor
然后让默认处理程序选择画笔(但实际上没有更改文本颜色)如果要更改文本颜色,则必须知道背景颜色。这就是API的工作方式。您可能可以使用DefWindowProc(hWnd、uMsg、wParam、lParam)
来获取默认画笔,但您需要在设置文本颜色之前调用它(并保存其结果)。或者只需使用GetSysColorBrush(COLOR\u WINDOW)
,这是我认为控件默认使用的颜色。您可以通过DefWindowProc直接返回默认系统颜色。当然,您可以通过CreateSolidBrush创建自定义笔刷句柄,并在需要时返回它。