Преобразование немодального диалога в модальное во время выполнения

StackOverflow https://stackoverflow.com/questions/1225931

  •  22-07-2019
  •  | 
  •  

Вопрос

У меня есть диалог (производный класс CDialog), который можно использовать двумя разными способами (режим редактирования и режим программирования).

Когда диалоговое окно открыто для использования в режиме программирования, это немодальное диалоговое окно, которое используется для изменения основного представления (своего рода панель инструментов).Когда он открыт в режиме редактирования, пользователь может изменить конфигурацию самого диалога, и в данном случае это модальный диалог.

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

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

Спасибо.

Это было полезно?

Решение

Поскольку, возможно, кому-то будет интересно сделать что-то подобное в будущем, я в конечном итоге сделал это следующим образом:

Я использую эти две функции основного кадра: CMainFrame::BeginModalState() и CMainFrame::EndModalState().

Проблема с этими функциями та же, что и с отключением родительского окна.Окно, которое вы хотите сделать модальным, также отключается.Но решение простое, просто снова включите окно после вызова BeginModalState.

void CMyDialog::MakeModal()
{
   //disable all main window descendants
   AfxGetMainWnd()->BeginModalState();

   //re-enable this window
   EnableWindow(TRUE);
}

void CMyDialog::MakeModeless()
{
   //enable all main window descendants
   AfxGetMainWnd()->EndModalState();
}

Спасибо за вашу помощь.

Другие советы

Это невозможно сделать легко без закрытия и повторного открытия диалога.Затем вы можете вызвать ShowWindow или DoModal по мере необходимости.

Это неправильно.Это можно сделать, если вы посмотрите исходный код MFC, вы поймете, что его модальные диалоги технически даже не модальны.Вам придется приложить немало усилий, чтобы это работало правильно, но по сути вам просто нужно отключить родительский элемент «модального» окна и снова включить его, когда «модальное» окно закроется.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top