我遇到了WIN32(没有.NET或任何管理过的)
答案 0 :(得分:3)
WM_CTLCOLORSTATIC是控制组合框标题颜色的正确方法。
但是,它不再有效:如果您的应用程序使用清单包含版本6 comctl库,则Groupbox控件不再将WM_CTLCOLORSTATIC
发送到其父级以获取画笔。如果您的对话框控件看起来很丑,方形和灰色 - 就像Windows 95控件一样,那么您没有启用xp样式,您可以控制组框的颜色。但这是一个可怕的牺牲! :P
接下来,大多数标准控件将WM_CTLCOLORxxx
消息发送到其父级(对话框)以控制其绘制。识别控件的唯一方法是查找其控件ID - 这就是为控件分配一个标识符,指示该控件需要特定颜色或字体的原因是个好主意。即不要将IDC_STATIC
用于需要红色文本的控件。将它们设置为IDC_DRAWRED
或某些ID。
不要使用GetDlgItem(hwndDlg,IDC_ID) == hwndCtl
来测试WM_CTLCOLOR
消息是否用于正确的控件:GetDlgItem将只返回具有特定Id的对话框上第一个控件的句柄,这意味着只有一个控件将被涂上。
case WM_CTLCOLORSTATIC:
if(GetWindowLong( (HWND)lParam, GWL_ID) == IDC_RED)
return MakeControlRed( (HDC)wParam );
你总是需要从WM_CTLCOLORxxx消息中返回一个HBRUSH - 即使你真的只是想要'篡改'传入的HDC。如果你没有从对话框proc中返回一个有效的画笔,那么对话窗口过程会认为你根本没有处理消息并将其传递给DefWindowProc - 这将重置你所做的HDC的任何更改。
系统没有创建画笔,而是备用画笔缓存来绘制标准的ui元素:GetSysColorBrush
当然,您并不总是需要返回HBRUSH。如果您在应用程序中启用了xp主题样式,则有时可以返回null: - 因为xp主题对话框具有不同颜色的背景(特别是在选项卡控件上),返回syscolor画笔会在较亮的背景上产生丑陋的灰色框: - 在这些特定情况下,对话管理器将允许您返回null,而不是重置DC中的更改。
答案 1 :(得分:1)
我认为WM_CTLCOLORSTATIC notification可能就是您所追求的目标。
答案 2 :(得分:0)
您可以使用设置控制字体的常规方式设置字体。使用您使用CreateFont创建的HFONT在窗口初始化中发送WM_SETFONT消息。 e.g。
SendDlgItemMessage(hDlg, IDC_STATIC, WM_SETFONT, (WPARAM)hFont, TRUE);
然后指出你需要使用WM_CTLCOLORSTATIC通知来设置实际颜色。
case WM_CTLCOLORSTATIC: if(GetDlgItem(hDlg, IDC_STATIC) == (HWND)lParam) { HDC hDC = (HDC)wParam;
SetBkColor(hDC, GetSysColor(COLOR_BTNFACE)); SetTextColor(hDC, RGB(0, 0xFF, 0)); SetBkMode(hDC, TRANSPARENT);
return (INT_PTR)CreateSolidBrush(GetSysColor(COLOR_BTNFACE));
} break;
虽然你真的应该只创建一次实心画笔并在对话框消失时删除它,因为你最终会泄漏。