1

我想使用通用控件和 Win32 API 创建某种暗模式按钮。

我想使用自定义绘图来设置按钮的背景和文本颜色。

至于背景,它似乎工作正常,但我不知道如何设置文本颜色。

这是我所做的(在窗口处理程序函数中):

LRESULT CALLBACK WindowHandler(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    static HBRUSH defaultbrush = NULL;
    static HBRUSH hotbrush = NULL;
    static HBRUSH selectbrush = NULL;

    switch (msg)
    {
    case WM_CREATE:
    {
        HWND button = CreateWindowA("Button", "Click Me", WS_VISIBLE | WS_CHILD,
            10, 10, 80, 30, hwnd, (HMENU)1, NULL, NULL);
        if (!button)
        {
            MessageBoxA(NULL, "Button Creation Failed!", "Error!", MB_ICONEXCLAMATION);
            exit(EXIT_FAILURE);
        }
        break;
    }
    case WM_NOTIFY:
    {
        LPNMHDR some_item = (LPNMHDR)lParam;

        if (some_item->idFrom == 1 && some_item->code == NM_CUSTOMDRAW)
        {
            LPNMCUSTOMDRAW item = (LPNMCUSTOMDRAW)some_item;

            if (item->uItemState & CDIS_SELECTED)
            {
                //Select our color when the button is selected
                if (selectbrush == NULL)
                    selectbrush = CreateSolidBrush(0x383838);

                //Create pen for button border
                HPEN pen = CreatePen(PS_INSIDEFRAME, 0, RGB(0, 0, 0));

                //Select our brush into hDC
                HGDIOBJ old_pen = SelectObject(item->hdc, pen);
                HGDIOBJ old_brush = SelectObject(item->hdc, selectbrush);

                Rectangle(item->hdc, item->rc.left, item->rc.top, item->rc.right, item->rc.bottom);

                //Clean up
                SelectObject(item->hdc, old_pen);
                SelectObject(item->hdc, old_brush);
                DeleteObject(pen);

                //Here is the problem:
                DrawTextA(item->hdc, "Click Me", -1, &item->rc, DT_CENTER | DT_VCENTER);
                return CDRF_SKIPDEFAULT;
            }
            else
            {
                if (item->uItemState & CDIS_HOT) //Our mouse is over the button
                {
                    //Select our color when the mouse hovers our button
                    if (hotbrush == NULL)
                        hotbrush = CreateSolidBrush(0x474747);

                    HPEN pen = CreatePen(PS_INSIDEFRAME, 0, RGB(0, 0, 0));

                    HGDIOBJ old_pen = SelectObject(item->hdc, pen);
                    HGDIOBJ old_brush = SelectObject(item->hdc, hotbrush);

                    Rectangle(item->hdc, item->rc.left, item->rc.top, item->rc.right, item->rc.bottom);

                    SelectObject(item->hdc, old_pen);
                    SelectObject(item->hdc, old_brush);
                    DeleteObject(pen);

                    //Here too:
                    DrawTextA(item->hdc, "Click Me", -1, &item->rc, DT_CENTER | DT_VCENTER);
                    return CDRF_SKIPDEFAULT;
                }

                //Select our color when our button is doing nothing
                if (defaultbrush == NULL)
                    defaultbrush = CreateSolidBrush(0x383838);

                HPEN pen = CreatePen(PS_INSIDEFRAME, 0, RGB(0, 0, 0));

                HGDIOBJ old_pen = SelectObject(item->hdc, pen);
                HGDIOBJ old_brush = SelectObject(item->hdc, defaultbrush);

                Rectangle(item->hdc, item->rc.left, item->rc.top, item->rc.right, item->rc.bottom);

                SelectObject(item->hdc, old_pen);
                SelectObject(item->hdc, old_brush);
                DeleteObject(pen);

                //And also here:
                DrawTextA(item->hdc, "Click Me", -1, &item->rc, DT_CENTER | DT_VCENTER);
                return CDRF_SKIPDEFAULT;
            }
        }
        return CDRF_DODEFAULT;
        break;
    }
    case WM_DESTROY:
        DeleteObject(defaultbrush);
        DeleteObject(selectbrush);
        DeleteObject(hotbrush);
        PostQuitMessage(0);
        break;
    }
    return DefWindowProcA(hwnd, msg, wParam, lParam);
}

我尝试关注我在 Stack Overflow 上找到的另一篇文章: 如何更改按钮 WinAPI C++ 的背景颜色 但它们只显示如何设置背景颜色,而不是文本颜色。

任何人都可以帮我吗?

4

1 回答 1

1

您只需要SetTextColor在调用之前的某处使用该函数设置文本颜色DrawText()

    //...
    SetTextColor(item->hdc, RGB(0,255,0)); // For green text, but use any COLORREF value.
    DrawTextA(item->hdc, "Click Me", -1, &item->rc, DT_CENTER | DT_VCENTER);
    return CDRF_SKIPDEFAULT;

您可能还需要将背景模式设置为TRANSPARENT,以保持先前绘制的颜色:

    SetBkMode(item-hdc, TRANSPARENT);
于 2020-06-05T23:20:55.343 回答