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. Которую пришлось сдублировать у себя в коде...

Russian mentality

Вот что такое Россия с точки зрения охраны секретных сведений?

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

Взять хоть эту гостиницу. К каждому приезжающему отношение сверхбдительное: извольте документы на прописку, да по какой надобности изволили прибыть, да нельзя ли получить телеграфное подтверждение от командирующей инстанции. Военный порт, неприступная крепость! Горничная баба Катя в первую же отлучку обшарила весь багаж, аж носовые платки перебрала (это Зепп установил по приставшему к батисту длинному полуседому волосу). То ли тетка в морской контрразведке подрабатывает, то ли просто энтузиастка — под предлогом патриотической бдительности удовлетворяет женское любопытство. И что же? Довольно было угостить пожилую фрау чаем, выслушать рассказ о нелегкой женской доле, самому посетовать на горькую судьбину вдовца с шестью крошками на руках (имелись и фотокарточки крошек, а как же) — и сделалась Катюша верной союзницей. Стала называть «сынком», все секреты выложила — и про полового Мишку, который филер, и про обязательную «лепортацию» о каждом постояльце. А всё потому что Зепп стал для нее свой.

Своим в России можно всё, правила написаны для чужих. Поэтому и законы здесь не более чем условность, удобная для сильных и досадная для слабых. Недаром сакральный лозунг русских — «жить по правде». Но правда-то у каждого своя. Это право, то бишь закон, для всех общий, а общее — оно заведомо не свое.

Именно здесь, на стыке общего и своего, казенного и личного, угадывалась замочная скважина. Только Зепп никак не мог нащупать ее отмычкой.

Copyright 2007-2011 Chabster