Цвет текста и шрифт в MessageBox

Возникла необходимость изменить шрифт и цвет текста в стандартном MessageBox. Спецыально выделил жырным, чтобы не предлагали создавать свой уютненький класс, подобный MessageBox'у. Изменение шрифта я сделал. Я хукаю момент создания диалога, и в нем создаю нужный шрифт и назначаю его для Статик-текста MessageBox'а. Примерно это выглядит так:

  1. HHOOK SysHook = SetWindowsHookEx&; WH_CBT, &;HOOKPROC&;SysMsgProc, hInst, 0 &;;
  2. MessageBox&; strMessage, strTitle &;;
  3. UnhookWindowsHookEx&; SysHook &;;

И собственно сама хук-функцыя:

  1. LRESULT WINAPI SysMsgProc&; int nCode, WPARAM wParam, LPARAM lParam &;
  2.     if&; nCode == HCBT_ACTIVATE &;
  3.     &;
  4.         LOGFONT lfLogFont; &;+ наплнение структуры&;
  5.         HFONT hFont = CreateFontIndirect&; &lfLogFont &;;
  6.         HWND hText = GetDlgItem&; &;HWND&;wParam, 0x0000FFFF &;; &;0x0000FFFF - получен опытным путем - идентификатор статиктекста&;
  7.         SendMessage&; hText, WM_SETFONT, &;WPARAM&;hFont, 0 &;;
  8.  
  9.     &;
  10.     return CallNextHookEx&; SysHook, nCode, wParam, lParam&;;

Шрифт меняется. Осталось изменить его цвет. И вот с этим возникла проблема. Кто знает как? У меня следующая мысль. Играться надо с сообщением WM_CTLCOLORSTATIC. Нсколько я понимаю, оно посылается родительскому окну самим текстом. То есть, в моей хук-функцыи можно получыть контекст hDC = GetDC( (HWND)hText ). Далее можно послать сообщение SendMessage( (HWND)wParam, WM_CTLCOLORSTATIC, (WPARAM)hDC, (LPARAM)hText ). Первый параметр - это хэндл самого окна MessageBox. В третий пересылаем контекст, а в четвертый хэндл статиктекста. И вот теперь, возникает желание как-то отловить это сообщение и изменить цвет. Но как - не знаю. Плюс, сообщение WM_CTLCOLORSTATIC можно посылать только в пределах одного потока. Не совсем понятно, моя хук-функцыя к какому потоку будет относится - MessageBox'а или к диалогу, который вызывает этот бокс?

Собственно, если есть какие соображение по этому поводу - поделитесь, очень надо (=

Последняя правка: ср, 25/01/2012 - 04:17
Submitted by Otinagi on

Комментарии

http://msdn.microsoft.com/en-us/library/bb787524(v=vs.85).aspx

"A static control, or an edit control that is read-only or disabled, sends the WM_CTLCOLORSTATIC message to its parent window when the control is about to be drawn. By responding to this message, the parent window can use the specified device context handle to set the text and background colors of the static control."

внизу пример, думаю этого вполне достаточно обойтись без хуков

Submitted by MaxImuS on

Этого было не достаточно. То, что писать в самом обработчыке сообщения я знаю, мне надо было как-то его перехватить. В любом случае, спасибо за помощь и с задачей я справился. Я в хук функции добавил обработку кода для nCode == HCBT_CREATEWND и в нее указал свою функцыю окна где и обрабатывал все сообщения MessageBox - WM_INITDIALOG, WM_CTLCOLORSTATIC. В итоге даже посылать отдельно собщение WM_CTLCOLORSTATIC не пришлось, ибо оно посылается статиком при первом отображении. В идиале, можно даже окошко это в форме ромашки сделать, если уж больно приспичет (:

Submitted by Otinagi on

GameDev.by