如何使用Win32设置组框标题的字体和颜色

时间:2009-11-15 09:42:41

标签: winapi

我遇到了WIN32(没有.NET或任何管理过的)

3 个答案:

答案 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;

虽然你真的应该只创建一次实心画笔并在对话框消失时删除它,因为你最终会泄漏。