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创建自定义笔刷句柄,并在需要时返回它。