使用自定义图形在Win32 API中设置按钮文本颜色

问题描述 投票:0回答:1

我想使用Common Controls和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上找到的另一篇文章:How can I change the background color of a button WinAPI C++但是它们仅显示如何设置背景颜色,而不显示文本颜色。

有人可以帮我吗?

我想使用Common Controls&Win32 API创建某种暗模式按钮。我想使用自定义绘图来设置按钮的背景和文本颜色。至于背景...

c++ c winapi button common-controls
1个回答
0
投票

您只需要在调用SetTextColor之前的某个位置,使用SetTextColor功能设置文本颜色:

© www.soinside.com 2019 - 2024. All rights reserved.