WIN32 button背景色问题

经多方尝试,在使用c++开发windows应用程序中(不使用mfc,单纯用win32 api),想要改变按钮的背景色是一个很蛋疼的问题。

查询了msdn,找到如下说明:

在绘制按钮之前,会将 WM _ CTLCOLORBTN 消息发送到按钮的父窗口。 父窗口可以更改按钮的文本和背景色。 但是,仅所有者描述的按钮会响应处理此消息的父窗口。

仅所有者描述的按钮就是自绘按钮,如果不是自绘按钮则这个消息没啥用。但我创建自绘按钮了还需要用这个消息么??自己写代码绘制就行了。

网上查到的背景色修改代码:

case WM_CTLCOLORBTN:
                if((HWND)lParam==hwndBtn&&wParam==1)
                {
                    HWND hbn = (HWND)lParam;
		            HDC hdc = (HDC)wParam;
		            RECT rc;
		            TCHAR text[64];

	            	GetWindowText(hbn, text, 63);
	            	GetClientRect(hbn, &rc);
	            	SetTextColor(hdc, RGB(0, 0, 0));
	            	SetBkMode(hdc, TRANSPARENT);
		            DrawText(hdc, text, _tcslen(text), &rc, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
                    return (INT_PTR)CreateSolidBrush(RGB(0, 0, 255));
                }
                break;

其原理就是带BS_OWNERDRAW样式的按钮绘制前会向父窗口发送WM _ CTLCOLORBTN消息,在响应此消息时将自定义的画刷当做返回值返回应用程序,也即是其父窗口,父窗口会使用此画刷来绘制按钮背景,很不好用。

建议使用自绘按钮来实现相关功能。

Windows API中,如果你想要给一个Button子控件填充背景色,你需要使用CreateWindowEx函数创建窗口,并通过SetWindowLong或SetWindowStyleEx设置窗口样式来实现实体外观的自定义。这里是一个简单的示例,假设我们想在一个对话框上创建一个带背景色Button: ```cpp #include <windows.h> #include <commctrl.h> // 引入对话框控件头文件 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_CREATE: { HINSTANCE hInstance = GetModuleHandle(NULL); // 创建对话框模板 DWORD dwExStyles = WS_EX_CLIENTEDGE; // 添加一些基本样式 DWORD dwStyles = WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON; // Button样式 // 设置按钮的颜色 - 这里用的是RGB值 HBRUSH brush = CreateSolidBrush(RGB(255, 0, 0)); // 红色背景 SendMessage(hWnd, WM_SETBKCOLOR, 0, (LPARAM)brush); // 将颜色设置为按钮背景 // 使用CreateWindowEx创建对话框并添加按钮 HWND button = CreateWindowEx( dwExStyles, "BUTTON", // 控件类名 "My Button", // 文本 dwStyles, 0, 0, 100, 50, // 宽高位置 hWnd, // 对话框句柄 NULL, // 参数 hInstance, NULL ); // 注册对话框消息处理函数 SetWindowLong(button, GWL_WNDPROC, (LONG_PTR)WndProc); // 清理HBRUSH DeleteObject(brush); return 0; } // ... 其他消息处理... } return DefWindowProc(hWnd, message, wParam, lParam); } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { WNDCLASS wc = {0}; wc.lpfnWndProc = WndProc; wc.hInstance = hInstance; wc.lpszClassName = L"MyWindowClass"; if (!RegisterClass(&wc)) { return 0; } HWND hWnd = CreateWindow(wc.lpszClassName, L"My Dialog", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 640, 480, NULL, NULL, hInstance, NULL); ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值