Как установить шрифт и цвет для заголовка группового поля с помощью Win32 - PullRequest
2 голосов
/ 15 ноября 2009

Я застрял с WIN32 (нет .NET или что-либо еще)

Ответы [ 3 ]

3 голосов
/ 15 ноября 2009

WM_CTLCOLORSTATIC был правильным способом управления цветом заголовка группового блока.

Однако это больше не работает: если ваше приложение использует манифест для включения библиотеки comctl версии 6, элемент управления Groupbox больше не отправляет WM_CTLCOLORSTATIC своему родителю для получения кисти. Если ваши диалоговые элементы управления выглядят некрасиво, квадратно и серо - как элементы управления Windows 95, то у вас не включены стили xp, и вы можете управлять цветом групповых блоков. Но это ужасная жертва! : P

Далее, большинство стандартных элементов управления отправляют WM_CTLCOLORxxx сообщения своим родителям (диалогу) для управления их рисованием. Единственный способ идентифицировать элементы управления - это посмотреть их идентификаторы элементов управления. Вот почему назначение элементов управления идентификатора, который указывает, что этому элементу управления требуется определенный цвет или шрифт, является хорошей идеей. Т.е. не используйте IDC_STATIC для элементов управления, которым нужен красный текст. Установите для них IDC_DRAWRED или какой-нибудь выдуманный идентификатор.

Не используйте GetDlgItem(hwndDlg,IDC_ID) == hwndCtl, чтобы проверить, является ли сообщение WM_CTLCOLOR правильным элементом управления: GetDlgItem просто вернет дескриптор первого элемента управления в диалоговом окне с указанным идентификатором, что означает, что будет окрашен только один элемент управления.

case WM_CTLCOLORSTATIC:
  if(GetWindowLong( (HWND)lParam, GWL_ID) == IDC_RED)
    return MakeControlRed( (HDC)wParam );

Вам всегда * нужно возвращать HBRUSH из сообщения WM_CTLCOLORxxx - даже если вы действительно просто хотите «подделать» передаваемый HDC. Если вы не вернете правильную кисть из своего диалогового процесса, тогда окно диалогов Процедура будет думать, что вы вообще не обработали сообщение, и передаст его в DefWindowProc, который сбросит все сделанные вами изменения в HDC. Вместо создания кистей в режиме ожидания в системе есть кеш кистей для рисования стандартных элементов пользовательского интерфейса: GetSysColorBrush

Конечно, вам НЕ всегда нужно возвращать ЕДУ. Если у вас включен стиль темы xp в вашем приложении, вам иногда разрешается возвращать нуль: - потому что диалоги темы xp имеют разноцветный фон (особенно на элементах управления вкладками), возвращая кисть syscolor, вы получите уродливые серые поля на более светлом фоне: - в этих конкретных случаях менеджер диалогов позволит вам вернуть ноль и НЕ сбрасывать ваши изменения в DC.

1 голос
/ 15 ноября 2009

Я думаю WM_CTLCOLORSTATIC уведомление может быть то, что вы ищете.

0 голосов
/ 15 ноября 2009

Ну, вы устанавливаете шрифт, используя обычный способ установки шрифтов управления. Отправьте сообщение WM_SETFONT при инициализации вашего окна, используя HFONT, который вы создали с помощью CreateFont. например,

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;<br>
    SetBkColor(hDC, GetSysColor(COLOR_BTNFACE));
    SetTextColor(hDC, RGB(0, 0xFF, 0));
    SetBkMode(hDC, TRANSPARENT);<br>
    return (INT_PTR)CreateSolidBrush(GetSysColor(COLOR_BTNFACE));<br>
}
break;

Хотя вам действительно нужно создать сплошную кисть только один раз и удалить ее, когда диалоговое окно исчезнет, ​​потому что у вас будет утечка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...