実行時にモードレスダイアログをモーダルに変換する
-
22-07-2019 - |
質問
2つの異なる方法(編集モードとプログラミングモード)で使用できるダイアログ(CDialog派生クラス)があります。
ダイアログがプログラミングモードで使用するために開かれている場合、メインビュー(ツールバーの種類)を変更するために使用されるモードレスダイアログです。編集モードで開いている場合、ユーザーはダイアログ自体の構成を変更できます。この場合はモーダルダイアログです。
今、それらはほとんど違いのない2つの異なるダイアログであり、ダイアログが欲しいだけで、ユーザーがダイアログのボタンを押すだけでプログラミングモードと編集モードを切り替えたいと思います。
そのため、実行時にモーダルダイアログでモードレスダイアログを変換する必要があります。それを実現する方法はありますか?
ありがとう。
解決
将来、誰かが似たようなことをすることに興味を持つかもしれないので、これが最終的に私がやった方法です:
メインフレームのこの2つの関数 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のソースを見ると、モーダルダイアログが技術的にはモーダルではないことがわかります。これを適切に機能させるために多くのことをいじる必要がありますが、基本的には「モーダル」ウィンドウの親を無効にし、「モーダル」ウィンドウが閉じたときに再び有効にする必要があります。
私は個人的にこれを行ったので、これはあなたのために働くかもしれませんが、あなたが何をしようとしているのか正確にはわかりません。