Я делаю диалог средствами Windows. В диалоге есть Picture Control типа OwnerDraw c идентификатором IDC_COLOR_DISPLAY.
Для того, чтобы отрисовывать его с моим цветом, я добавил в MESSAGE MAP (мой диалог унаследован от CDialogImpl) следующий код:
if(uMsg==WM_CTLCOLORSTATIC && (HWND)lParam==(HWND)GetDlgItem(IDC_COLOR_DISPLAY))
{
HBRUSH T = CreateSolidBrush (RGB(_r(ResultColor),_g(ResultColor),_b(ResultColor)));
SetBkColor((HDC)wParam,RGB(_r(ResultColor),_g(ResultColor),_b(ResultColor)));
return (BOOL)(T);
}
где ResultColor — DWORD, содержащий информацию о цвете (в частности, при инициализации диалога выставляется в 0,0,0).
Однако при запуске диалога ничего там, где должен быть закрашенный прямоугольник, не отображается.
Что я делаю неправильно?
Добавлена разметка и табуляция — Кодт
08.11.07 13:45: Перенесено модератором из 'C/C++. Прикладные вопросы' — Кодт
Мне кажется, раз контрол создан как Owner Draw, то отрисовывать его надо в обработчике сообщения WM_DRAWITEM, для чего этот стиль и существует..
Однако проблема все же имеет место быть — почему Static-и со стилями SS_BLACKFRAME, SS_WHITEFRAME и т.п. не реагируют никаким образом на WM_CTLCOLORSTATIC?
Несмотря на то, что стиль у меня — ни тот, ни другой, тем не менее, не видно никакой реакции.
Как бы Вы меняли цвет этого контрола? Нужно ли для этого использовать SetBkColor или нужно просто возвращать вновь созданную кисть? Наконец, разве это не перекрывает друг друга?
Здравствуйте, SurvivorPhantom, Вы писали:
SP>Как бы Вы меняли цвет этого контрола?
Я бы для этого контрола написал примерно следующее:
if (uMsg==WM_DRAWITEM && wParam==IDC_COLOR_DISPLAY)
{
LPDRAWITEMSTRUCT pdis=(LPDRAWITEMSTRUCT)lParam;
if (pdis->itemAction==ODA_DRAWENTIRE)
{
// для иллюстрации это здесь, а вообще кисть надо бы создавать один раз (например при создании диалога)
HBRUSH hbr=CreateSolidBrush(RGB(255,0,0));
FillRect(lpDrawItemStruct->hDC,&lpDrawItemStruct->rcItem,hbr);
return TRUE;
}
return 0; //в случае если дело происходит в диалоге, иначе - вызов DefWindowProc
}
SP> ...разве это не перекрывает друг друга?
нет, не перекрывает: SetBkColor — устанавливает цвет фона текста, а возвращение кисти из WM_CTLCOLOR-сообщений — устанавливает фоновый цвет всего контрола, чтобы увидеть разницу поэкспериментируйте на простом Static-контроле.