Hungry Mind , Blog about everything in IT - C#, Java, C++, .NET, Windows, WinAPI, ...

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 коммент.:

coderoid комментирует...

Страшно подумать, сколько сил уходит на такого рода ньюансы GUI, которые отсутствуют, или решаются более прозрачно в веб-разработке...

Chabster комментирует...

Да, хорошие программы внутри страшные. Плата за это все - скорость.

Отправить комментарий

Copyright 2007-2011 Chabster