Converter um diálogo modal para modal em tempo de execução
-
22-07-2019 - |
Pergunta
Eu tenho um diálogo (CDialog derivados classe) que pode ser usado de duas maneiras diferentes (modo de edição e programação).
Quando o diálogo é aberto a ser utilizado no modo de programação é uma caixa de diálogo modal que ele é usado para modificar a vista principal (tipo de uma barra de ferramentas). Quando está aberto no modo de edição, o usuário pode alterar a configuração do próprio diálogo e, neste caso, é um diálogo modal.
Agora eles são dois diálogos diferentes com algumas diferenças e eu gostaria de ter apenas de diálogo quiser e deixar a mudança de usuário entre a programação Modo e edição premindo apenas um botão na caixa de diálogo.
Então eu preciso converter o modal de diálogo em um modal de diálogo e vice-versa durante a execução. Existe uma maneira de achive isso?
Graças.
Solução
Como talvez alguém poderia estar interessado em fazer algo semelhante no futuro, esta é a maneira que eu finalmente fiz isso:
Eu uso isso duas funções do quadro principal:. CMainFrame::BeginModalState()
e CMainFrame::EndModalState()
O problema com estas funções é o mesmo que com a desativação janela pai. A janela que você quer fazer modal também fica desativado. Mas a solução é fácil, basta re-habilitar a janela depois de chamar 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();
}
Obrigado por sua ajuda.
Outras dicas
Isso não pode ser feito facilmente sem fechar e reabrir o diálogo. Em seguida, você pode chamar ShowWindow ou DoModal conforme o caso.
Isso não é correto. Isso pode ser feito, se você olhar na fonte de MFC você vai perceber que é diálogos modais não são tecnicamente ainda modal. Você vai ter que fazer um monte de mucking para fazer este trabalho corretamente, mas basicamente você só tem que desativar o pai de 'modal' janela, e reativá-lo quando o 'modal' fecha a janela.
Eu tenho feito isso pessoalmente para isso pode funcionar para você, embora eu não sou exatamente certo o que você está tentando fazer.