Есть ли способ определить минимизацию диалога из элемента управления, который находится в диалоге?
Я использую сообщение окна ON_WM_SIZE
который должен быть вызван с типом SIZE_MINIMIZED
когда диалог свернут.
BEGIN_MESSAGE_MAP(CEditT, CEdit)
ON_WM_SIZE()
END_MESSAGE_MAP()
void CEditT::OnSize(UINT nType, int cx, int cy)
{
CEdit::OnSize(nType, cx, cy);
switch(nType)
{
case SIZE_MINIMIZED:
m_backgroundRedraw = TRUE;
}
}
Однако этот метод никогда не вызывается, когда диалог свернут. Мне нужно отследить эту минимизацию, чтобы правильно перерисовать мой контроль прозрачностью, когда он восстанавливается снова.
Сначала найдите родительский диалог в вашем контроле, используя
CWnd *parent = GetParent();
HWND hWnd = parent->GetSafeHwnd(); // get its window handle
BOOL dlgMinimized = IsMinimized(hWnd); // get min. state
API документируется как:
BOOL WINAPI IsIconic(
_In_ HWND hWnd
);
Ссылка Вот.
IsMinimized — это макрос, определенный в windowsx.h и соответствующий IsIconic, как это описано в Microsoft.
Я бы предложил другой метод. Перехватите тип SIZE_MAXIMIZED nType в вашем методе Dialog OnSize () и сохраните это состояние в переменной-члене. Затем вы можете проверить это у детей, настроив обработчик сообщений WM_USER + XXX в диалоговом окне, чтобы ответить текущим значением.
На этом этапе вам нужно отправить SendMessage (WM_USER + XXX, …) из части кода вашего дочернего элемента управления, которая фактически вызывается, чтобы он мог выполнить какую-то задачу. Чтобы увидеть, какие сообщения отправляются в / из ребенка, я бы проверил с помощью spy ++.
Это не должно быть так сложно. Вы должны перехватить сообщение WM_SYSCOMMAND на уровне диалога. Это сообщение обрабатывает минимизацию событий. Затем просто вызовите открытый метод элемента управления в ответ на это событие.