Сделать сфокусированный немодальный диалог самым верхним
Итак, у меня есть мой главный диалог, который вызывает немодальные диалоги через эту функцию (это старый код проекта):
void MyClass::ShowDialog(CDialog* dialog)
{
if (!IsWindow(dialog->m_hWnd))
{
return;
}
int nCmdshow1 = dialog->IsWindowVisible() ? SW_HIDE : SW_SHOW;
dialog->ShowWindow( nCmdshow1 );
}
Проблема: все поддиалоги остаются поверх моего основного диалога.
Желаемое поведение: какой бы фокус ни был (все они немодальные), будь то главный диалог или поддиалоги, я хочу, чтобы это был самый верхний диалог. Спасибо!
Примечание: я уже пробовал в моем главном диалоге OnInitDialog()
эти, но не работали:
1. SetWindowPos(&this->wndTop,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
2.SetWindowPos(&this->wndTopMost,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
РЕДАКТИРОВАТЬ
Кроме того, поддиалоги создаются следующим образом:m_subDlg1->Create( SubDlg1::IDD, this );
1 ответ
Пока есть связь владельца между двумя окнами. владелец окна никогда не может быть поверх собственного окна.
Окна в отношениях владелец, родитель, потомок всегда ведут себя одинаково. Окно "владелец / ребенок" всегда находится над родителем / владельцем.
Если вы хотите разорвать это, вы должны разорвать отношения владелец / ребенок. Пусть все диалоговые окна не имеют владельца... чем они могут свободно перемещаться.
Но: я буду ожидать, что ваша программа не ведет себя лучше. Еще хуже. Пользователь может искать окна, которые находятся глубоко внизу под другими окнами. И они никогда не окажутся впереди, когда ваша программа станет активной.
Смотрите описание родительских / дочерних / собственных окон здесь. Также эта статья может быть полезной.
Редактировать: проблема в том, что внутренне MFC устанавливает главное окно как владельца, если родитель не указан. Только звонок BOOL Wnd::CreateDlgIndirect(LPCDLGTEMPLATE lpDialogTemplate, CWnd* pParentWnd, HINSTANCE hInst)
позволяет оставить pParentWnd NULL.
Таким образом, вы можете создать окно как обычно, но использовать SetParent(NULL) после того, как оно было создано. Опять МФЦ АССЕРТЫ это. Таким образом, вы можете использовать функцию API и дескриптор вашего диалога.