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

aviad1

我想使用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);
}

我尝试遵循在堆栈溢出上找到的另一篇文章:我如何更改按钮WinAPI C ++的背景颜色,但是它们仅显示如何设置背景颜色,而不显示文本颜色。

有人可以帮我吗?

阿德里安·摩尔

您只需要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);

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用 Win32 API 向另一个应用程序添加自定义边框

来自分类Dev

如何在Win32 C ++中的工具栏按钮上动态添加自定义图像?

来自分类Dev

更改按钮WIN32上的文本颜色

来自分类Dev

在Swift中的绘图类中设置自定义RGB颜色

来自分类Dev

在Swift中的绘图类中设置自定义RGB颜色

来自分类Dev

在 swift 4 中更改自定义绘图的颜色

来自分类Dev

Win32 API:如何在编辑控件中更改部分文本的颜色

来自分类Dev

Win32 API:如何在编辑控件中更改部分文本的颜色

来自分类Dev

如何使用WIN32 API for C ++更改文本的颜色和大小?

来自分类Dev

如何在有角度的材质中定义自定义主题以控制按钮文本的颜色?

来自分类Dev

使用自定义属性值在模板中设置颜色

来自分类Dev

使用自定义属性值在模板中设置颜色

来自分类Dev

GetGuiResources WIn32 API使用

来自分类Dev

GetGuiResources WIn32 API使用

来自分类Dev

在PhpStorm中设置自定义颜色

来自分类Dev

(C ++)使用g ++返回“对WinMain @ 16的未定义引用”的Win32 API示例代码

来自分类Dev

使用Win32 C ++和钩子从应用程序中的按钮获取文本

来自分类Dev

在原始Win32中使用C设置按钮图标

来自分类Dev

C ++如何使用Win32 API通过线程从文本框中获取文本

来自分类Dev

将自定义颜色的按钮设置为禁用的样式

来自分类Dev

Win32自定义绘制树视图控件

来自分类Dev

使用自定义绘图标题时,`plotly.subplots`中的注释会中断

来自分类Dev

自定义多个rootlocus绘图颜色(灰色标度)Matlab

来自分类Dev

如何设置自定义文本突出显示颜色

来自分类Dev

如何在JFace向导(Java)中的按钮上设置自定义文本

来自分类Dev

如何使用Slack API为Slack上的按钮设置颜色

来自分类Dev

如何使用自定义控件在UILabel中部分设置文本颜色变化的动画?

来自分类Dev

Android:使用标签版式的样式设置自定义视图的文本颜色

来自分类Dev

在C ++中使用Win32 Api在任务栏中设置NOTIFY ICON

Related 相关文章

  1. 1

    使用 Win32 API 向另一个应用程序添加自定义边框

  2. 2

    如何在Win32 C ++中的工具栏按钮上动态添加自定义图像?

  3. 3

    更改按钮WIN32上的文本颜色

  4. 4

    在Swift中的绘图类中设置自定义RGB颜色

  5. 5

    在Swift中的绘图类中设置自定义RGB颜色

  6. 6

    在 swift 4 中更改自定义绘图的颜色

  7. 7

    Win32 API:如何在编辑控件中更改部分文本的颜色

  8. 8

    Win32 API:如何在编辑控件中更改部分文本的颜色

  9. 9

    如何使用WIN32 API for C ++更改文本的颜色和大小?

  10. 10

    如何在有角度的材质中定义自定义主题以控制按钮文本的颜色?

  11. 11

    使用自定义属性值在模板中设置颜色

  12. 12

    使用自定义属性值在模板中设置颜色

  13. 13

    GetGuiResources WIn32 API使用

  14. 14

    GetGuiResources WIn32 API使用

  15. 15

    在PhpStorm中设置自定义颜色

  16. 16

    (C ++)使用g ++返回“对WinMain @ 16的未定义引用”的Win32 API示例代码

  17. 17

    使用Win32 C ++和钩子从应用程序中的按钮获取文本

  18. 18

    在原始Win32中使用C设置按钮图标

  19. 19

    C ++如何使用Win32 API通过线程从文本框中获取文本

  20. 20

    将自定义颜色的按钮设置为禁用的样式

  21. 21

    Win32自定义绘制树视图控件

  22. 22

    使用自定义绘图标题时,`plotly.subplots`中的注释会中断

  23. 23

    自定义多个rootlocus绘图颜色(灰色标度)Matlab

  24. 24

    如何设置自定义文本突出显示颜色

  25. 25

    如何在JFace向导(Java)中的按钮上设置自定义文本

  26. 26

    如何使用Slack API为Slack上的按钮设置颜色

  27. 27

    如何使用自定义控件在UILabel中部分设置文本颜色变化的动画?

  28. 28

    Android:使用标签版式的样式设置自定义视图的文本颜色

  29. 29

    在C ++中使用Win32 Api在任务栏中设置NOTIFY ICON

热门标签

归档