Win32设置静态文本和按钮颜色、字体

⌚Time: 2023-01-18 19:46:51

👨‍💻Author: Jack Ge

创建字体


hFont = CreateFont(-16, -9, 0, 0, 0,

                FALSE,//斜体

                FALSE,//下划线

                FALSE,//删除线

                DEFAULT_CHARSET,

                OUT_CHARACTER_PRECIS,

                CLIP_CHARACTER_PRECIS,

                DEFAULT_QUALITY,

                FF_DONTCARE,

                "幼圆"

                );

在窗体销毁时释放字体


    case WM_DESTROY:

        DeleteObject(hFont);

        PostQuitMessage(0);

        return 0;

设置控件的字体,通过发送消息WM_SETFONT设置静态文本0和1的字体




        SendMessage(GetDlgItem(hwnd,IDC_STATIC_0), WM_SETFONT, (WPARAM)hFont, NULL);

        SendMessage(GetDlgItem(hwnd,IDC_STATIC_1), WM_SETFONT, (WPARAM)hFont, NULL);

设置静态文本颜色,在窗体过程函数的WM_CTLCOLORSTATIC消息响应中处理


LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

    switch (uMsg)

    {

    ...

        case WM_CTLCOLORSTATIC://静态文本颜色

        {

            //获取设备上下文

            HDC hdcStatic = (HDC)wParam;

            //判断是是哪个静态控件

            if((HWND)lParam == GetDlgItem(hwnd,IDC_STATIC_0)){

                //静态文本0的颜色设置

                //文本颜色

                SetTextColor( hdcStatic, RGB(222, 0,0) );

                //文本背景色

                SetBkColor( hdcStatic, RGB(0,156,222) );

                //画刷色

                HBRUSH hBrush = CreateSolidBrush( RGB(222,156,83) );

                //返回画刷

                return (INT_PTR)hBrush;

            }else{//其它静态文本控件

                //设置背景透明

                SetBkMode(hdcStatic, TRANSPARENT);

                //文本颜色

                SetTextColor( hdcStatic, RGB(222, 222,0) );

                //文本背景色

                SetBkColor( hdcStatic, RGB(0,156,83) );

                //返回画刷

                return (LRESULT)GetStockObject(NULL_BRUSH);

            }

            //返回一个正常窗体背景颜色的画刷

            return (BOOL)CreateSolidBrush (GetSysColor(COLOR_WINDOW));

        }

    }

    

    return DefWindowProc(hwnd, uMsg, wParam, lParam);

}

SetTextColor设置的是文本的颜色,SetBkColor设置的是文本的背景色,SetBkMode可设置文本透明。返回的画刷决定文本控件的背景颜色

通过GetStockObject或者CreateSolidBrush可以得到画刷

GetStockObject的参数可以是以下默认的画刷


BLACK_BRUSH

黑色画笔。

DKGRAY_BRUSH

深灰色画笔。

DC_BRUSH

纯色画笔。 默认颜色为白色。 可以使用 SetDCBrushColor 函数更改颜色。 有关详细信息,请参见“备注”部分。

GRAY_BRUSH

灰色画笔。

HOLLOW_BRUSH

空心画笔 (等效于NULL_BRUSH) 。

LTGRAY_BRUSH

浅灰色画笔。

NULL_BRUSH

null 画笔 (等效于HOLLOW_BRUSH) 。

WHITE_BRUSH

白色画笔。

BLACK_PEN

黑色触笔。

DC_PEN

纯色笔颜色。 默认颜色为黑色。 可以使用 SetDCPenColor 函数更改颜色。 有关详细信息,请参见“备注”部分。

NULL_PEN

null 触笔。 null 笔不绘制任何内容。

WHITE_PEN

白色触笔。

ANSI_FIXED_FONT

Windows 固定间距 (单空间) 系统字体。

ANSI_VAR_FONT

Windows 可变间距 (比例空间) 系统字体。

DEVICE_DEFAULT_FONT

设备依赖字体。

DEFAULT_GUI_FONT

用户界面对象(如菜单和对话框)的默认字体。 不建议使用DEFAULT_GUI_FONT或SYSTEM_FONT来获取对话框和窗口使用的字体;有关详细信息,请参阅备注部分。

默认字体为 Tahoma。



OEM_FIXED_FONT

原始设备制造商 (OEM) 依赖固定间距 (单空间) 字体。

SYSTEM_FONT

系统字体。 默认情况下,系统使用系统字体绘制菜单、对话框控件和文本。 不建议使用DEFAULT_GUI_FONT或SYSTEM_FONT来获取对话框和窗口使用的字体;有关详细信息,请参阅备注部分。

默认系统字体为 Tahoma。



SYSTEM_FIXED_FONT

固定间距 (单空间) 系统字体。 此库存对象仅用于与低于 3.016 位 Windows 版本兼容。

DEFAULT_PALETTE

默认调色板。 此调色板由系统调色板中的静态颜色组成。

CreateSolidBrush的参数通过RGB宏指定返回画刷的颜色


HBRUSH CreateSolidBrush(

  [in] COLORREF color

);

CreateSolidBrush的参数也可以通过GetSysColor可以得到系统预定义的颜色


DWORD GetSysColor(

  [in] int nIndex

);

返回值

类型:DWORD



该函数返回给定元素的红色、绿色、蓝色 (RGB) 颜色值。

系统预定义的颜色


COLOR_3DDKSHADOW

21

三维显示元素的暗影。

Windows 10或更高版本:不支持此值。



COLOR_3DFACE

15

三维显示元素和对话框背景的人脸颜色。

COLOR_3DHIGHLIGHT

20

三维显示元素的突出显示颜色 (面向光源的边缘。)

Windows 10或更高版本:不支持此值。



COLOR_3DHILIGHT

20

三维显示元素的突出显示颜色 (面向光源的边缘。)

Windows 10或更高版本:不支持此值。



COLOR_3DLIGHT

22

面向光源的边缘的三维显示元素的浅色 (。)

Windows 10或更高版本:不支持此值。



COLOR_3DSHADOW

16

三维显示元素的阴影颜色 (面向面向光源的边缘) 。

Windows 10或更高版本:不支持此值。



COLOR_ACTIVEBORDER

10

活动窗口边框。

Windows 10或更高版本:不支持此值。



COLOR_ACTIVECAPTION

2

活动窗口标题栏。

关联的前景色 COLOR_CAPTIONTEXT。



如果启用了渐变效果,则指定活动窗口标题栏的颜色渐变中的左侧颜色。



Windows 10或更高版本:不支持此值。



COLOR_APPWORKSPACE

12

多个文档界面的背景色 (MDI) 应用程序。

Windows 10或更高版本:不支持此值。



COLOR_BACKGROUND

1

桌面设备。

Windows 10或更高版本:不支持此值。



COLOR_BTNFACE

15

三维显示元素和对话框背景的人脸颜色。 关联的前景色 COLOR_BTNTEXT。

Windows 10或更高版本:不支持此值。



COLOR_BTNHIGHLIGHT

20

三维显示元素的突出显示颜色 (面向光源的边缘。)

Windows 10或更高版本:不支持此值。



COLOR_BTNHILIGHT

20

三维显示元素的突出显示颜色 (面向光源的边缘。)

Windows 10或更高版本:不支持此值。



COLOR_BTNSHADOW

16

三维显示元素的阴影颜色 (面向面向光源的边缘) 。

Windows 10或更高版本:不支持此值。



COLOR_BTNTEXT

18

按下按钮上的文本。 关联的背景色COLOR_BTNFACE。

COLOR_CAPTIONTEXT

9

标题、大小框和滚动条箭头框中的文本。 关联的背景色COLOR_ACTIVECAPTION。

Windows 10或更高版本:不支持此值。



COLOR_DESKTOP

1

桌面设备。

Windows 10或更高版本:不支持此值。



COLOR_GRADIENTACTIVECAPTION

27

活动窗口标题栏的颜色渐变中的右侧颜色。 COLOR_ACTIVECAPTION指定左侧颜色。 将SPI_GETGRADIENTCAPTIONS与 SystemParametersInfo 函数一起使用,以确定是否启用了渐变效果。

Windows 10或更高版本:不支持此值。



COLOR_GRADIENTINACTIVECAPTION

28

非活动窗口标题栏的颜色渐变中的右侧颜色。 COLOR_INACTIVECAPTION指定左侧颜色。

Windows 10或更高版本:不支持此值。



COLOR_GRAYTEXT

17

已禁用) 文本的灰显 (。 如果当前显示驱动程序不支持纯灰色,则此颜色设置为 0

COLOR_HIGHLIGHT

13

在控件中选择的项 () 。 关联的前景色COLOR_HIGHLIGHTTEXT。

COLOR_HIGHLIGHTTEXT

14

在控件中选择的项 () 的文本。 关联的背景色COLOR_HIGHLIGHT。

COLOR_HOTLIGHT

26

超链接或热跟踪项的颜色。 关联的背景色COLOR_WINDOW。

COLOR_INACTIVEBORDER

11

非活动窗口边框。

Windows 10或更高版本:不支持此值。



COLOR_INACTIVECAPTION

3

非活动窗口标题。

关联的前景色COLOR_INACTIVECAPTIONTEXT。



如果启用了渐变效果,则指定非活动窗口标题栏的颜色渐变中的左侧颜色。



Windows 10或更高版本:不支持此值。



COLOR_INACTIVECAPTIONTEXT

19

非活动标题中的文本颜色。 关联的背景色COLOR_INACTIVECAPTION。

Windows 10或更高版本:不支持此值。



COLOR_INFOBK

24

工具提示控件的背景色。 关联的前景色COLOR_INFOTEXT。

Windows 10或更高版本:不支持此值。



COLOR_INFOTEXT

23

工具提示控件的文本颜色。 关联的背景色COLOR_INFOBK。

Windows 10或更高版本:不支持此值。



COLOR_MENU

4

菜单背景。 关联的前景色COLOR_MENUTEXT。

Windows 10或更高版本:不支持此值。



COLOR_MENUHILIGHT

29

当菜单显示为平面菜单时,用于突出显示菜单项的颜色 (请参阅 SystemParametersInfo) 。 突出显示的菜单项带有COLOR_HIGHLIGHT。

Windows 2000、Windows 10或更高版本:不支持此值。



COLOR_MENUBAR

30

当菜单显示为平面菜单时菜单栏的背景色, (请参阅 SystemParametersInfo) 。 但是,COLOR_MENU继续指定菜单弹出窗口的背景色。

Windows 2000、Windows 10或更高版本:不支持此值。



COLOR_MENUTEXT

7

菜单中的文本。 关联的背景色COLOR_MENU。

Windows 10或更高版本:不支持此值。



COLOR_SCROLLBAR

0

滚动条灰色区域。

Windows 10或更高版本:不支持此值。



COLOR_WINDOW

5

窗口背景。 关联的前景颜色COLOR_WINDOWTEXT和COLOR_HOTLITE。

COLOR_WINDOWFRAME

6

窗口框架。

Windows 10或更高版本:不支持此值。



COLOR_WINDOWTEXT

8

窗口中的文本。 关联的背景色COLOR_WINDOW。


按钮颜色设置

按钮在创建时需要设置BS_OWNERDRAW属性


    CreateWindow("button",

                "button",

                WS_CHILD | WS_VISIBLE|BS_OWNERDRAW,

                250,60, 100, 30,

                hwnd,

                (HMENU)IDC_BUTTON_0,

                ((LPCREATESTRUCT)lParam)->hInstance,

                NULL);

对WM_CTLCOLORBTN消息的响应中可以设置按钮的颜色


    case WM_CTLCOLORBTN://按钮颜色

        {

            //得到控件句柄

            HWND hBtn = (HWND)lParam;

            //设备上下文

            HDC hdc = (HDC)wParam;

            RECT rc;

            char text[64] = {0};

            //获取按钮文字

            GetWindowText(hBtn,text,sizeof(text)-1);

            //获取按钮区域

            GetClientRect(hBtn,&rc);

            //如果按钮是按下状态设置一种颜色

            if(SendMessage(hBtn, BM_GETSTATE, NULL, NULL) & BST_PUSHED){

                //文本颜色

                SetTextColor(hdc,RGB(0,255,255));

                //文本背景透明

                SetBkMode(hdc,TRANSPARENT);

                //绘制按钮文字

                DrawText(hdc,text,strlen(text),&rc,DT_CENTER|DT_VCENTER|DT_SINGLELINE);

                //返回画刷背景色

                return (INT_PTR)CreateSolidBrush(RGB(61, 89, 171));

            }else{//按钮非按下状态的颜色

                //文本颜色

                SetTextColor(hdc,RGB(255,255,255));

                //文本透明

                SetBkMode(hdc,TRANSPARENT);

                //绘制文字

                DrawText(hdc,text,strlen(text),&rc,DT_CENTER|DT_VCENTER|DT_SINGLELINE);

                //返回画刷背景色

                return (INT_PTR)CreateSolidBrush(RGB(161, 89, 171));

            }

        }

        return 0;

g++编译参数 -mwindows取消控制台背景-lgdi32连接gdi32库


g++ a0118.cpp -lgdi32 -mwindows