Скрыть главное окно MFC, пока модальный диалог активен? - PullRequest
4 голосов
/ 02 апреля 2012

У меня есть родное приложение C ++ MFC.Он имеет главное окно на основе CWnd, и пользовательское действие может создать модальное диалоговое окно.Пока диалог активен, я хочу, чтобы главное окно исчезло, диалоговое окно было видимым, а значок главного окна остался на панели задач.

Как мне это сделать?

Если я скрываю главное окно (ShowWindow (SW_HIDE)), значок панели задач исчезает.Если я сверну главное окно (SW_MINIMIZE), значок останется.Однако, поскольку диалоговое окно принадлежит главному окну, оно также скрывает диалоговое окно.

После того, как диалоговое окно создано, нажатие на значок панели задач делает диалоговое окно видимым.Естественно, я не хочу требовать, чтобы пользователь сделал это.

Даже если я вставлю ShowWindow (SW_SHOW) в обработчик диалога OnInit, диалоговое окно остается невидимым.Spy ++ показывает, что его видимый бит установлен.То же самое верно, если я добавлю SetWindowActive в OnInit.

Меня не интересует изменение дизайна пользовательского интерфейса.Пока диалог активен, пользователь взаимодействует только с ним, и ему ничего не интересно в главном окне.Поэтому главное окно должно исчезнуть.

Использование Windows VS2005 под WinXP32.

Ответы [ 4 ]

1 голос
/ 11 июня 2012

В OnInitDialog добавьте следующие коды

//Set windows size zero, the windows disappear.
MoveWindow(0,0,0,0);

//If you want it invisible on taskbar. add following codes.
DWORD dwStyle = GetWindowLong(GetSafeHwnd(), GWL_EXSTYLE);
dwStyle &=~WS_EX_APPWINDOW;   
dwStyle |= WS_EX_TOOLWINDOW;     
SetWindowLong(GetSafeHwnd(), GWL_EXSTYLE, dwStyle);
1 голос
/ 02 апреля 2012

Ну, в блоке кода, где вы создаете диалоговое окно и показываете его модальным, вы можете делать все, что захотите, с главным окном вашего приложения (показывать / скрывать), пока вы делаете окно рабочего стола родителем вашего окна. диалог. Обычно конструктор для CDialog и производных принимает аргумент по умолчанию NULL для родительского окна, в котором фреймворк заменяет AfxGetMainWnd (). Вместо этого передайте CWnd :: GetDesktopWindow () в качестве родителя вашего диалога, и тогда вы, вероятно, сможете скрыть главное окно. Тем не менее, у вас все еще могут быть проблемы с панелью задач - но я позволю кому-то еще дать подсказки, так как я ничего не знаю об этом.

0 голосов
/ 21 мая 2012

Возможно, вы можете изменить размер главного окна до действительно небольшого размера и всегда держать его позади модального диалога.

0 голосов
/ 03 апреля 2012

Вы боретесь с ОС. Модальный диалог по определению отключает, но не скрывает «главное» (родительское) окно. Если вы хотите другое окно, создайте второе, но не говорите ОС, чтобы оно воспринималось как модальное диалоговое окно над первым окном.

...