How to make CDialog inherit parent background color
Частенько бывает удобно встраивать один диалог в другой в качестве дочернего элемента управления. Все просто - ставим стили:
STYLE DS_CONTROL | WS_CHILD EXSTYLE WS_EX_CONTROLPARENT
и создаем окно вызовом
CDialog::Create
.
Одна из проблем - диалог не запрашивает у родителя цвет для своего фона. В результате
вложенный диалог другого цвета. Одно из решений - пробрасывать обработку сообщения
WM_CTLCOLOR
выше по иерархии окон:
struct AFX_CTLCOLOR { HWND hWnd; HDC hDC; UINT nCtlType; }; afx_msg HBRUSH CFontChooser::OnCtlColor(CDC *pDC, CWnd *pWnd, UINT nCtlColor) { if (GetStyle() & WS_CHILD) { AFX_CTLCOLOR ctl; ctl.hDC = pDC->GetSafeHdc(); ctl.hWnd = pWnd->GetSafeHwnd(); ctl.nCtlType = nCtlColor; return(reinterpret_cast<HBRUSH>(GetParent()->SendMessage(WM_CTLCOLOR, 0, reinterpret_cast<LPARAM>(&ctl)))); } return(__super::OnCtlColor(pDC, pWnd, nCtlColor)); }
Проблемка здесь в том, что WM_CTLCOLOR
эмулируется средствами MFC.
Для этого используется локальная для библиотечного cpp-файла структурка AFX_CTLCOLOR
.
Которую пришлось сдублировать у себя в коде...
2 коммент.:
Страшно подумать, сколько сил уходит на такого рода ньюансы GUI, которые отсутствуют, или решаются более прозрачно в веб-разработке...
Да, хорошие программы внутри страшные. Плата за это все - скорость.
Отправить комментарий