2009-08-04 2 views
8

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

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

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

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

Спасибо.

ответ

11

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

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

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

1

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

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

+0

Что вы имеете в виду при отключении/включении родителя? Я уже пытался вызвать GetParent() -> EnableWindow (FALSE)/GetParent() -> EnableWindow (TRUE), но это не сработало, потому что мой диалог также отключен. Родительское окно - это основной кадр, который я не знаю, если это актуально. BTW: Я хочу, чтобы открыть диалоговое окно модели (Create/ShowWindow), когда пользователь нажимает кнопку, диалог становится модальным. Если пользователь снова нажимает кнопку, диалог снова становится немодальным. –

Смежные вопросы