Преобразуйте немодальный диалог в модальный во время выполнения - PullRequest
8 голосов
/ 04 августа 2009

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

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

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

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

Спасибо.

Ответы [ 3 ]

11 голосов
/ 06 августа 2009

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

Я использую эти две функции основного кадра: 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();
}

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

2 голосов
/ 04 августа 2009

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

1 голос
/ 05 августа 2009

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

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

...