2009-08-04 25 views
8

2つの異なる方法(エディションモードとプログラミングモード)で使用できるダイアログ(CDialog派生クラス)があります。実行時にモードレスダイアログをモーダルに変換

ダイアログがプログラミングモードで使用できるように開いているときは、メインビュー(ツールバーの種類)の変更に使用されるモードレスダイアログです。編集モードで開いている場合、ユーザはダイアログ自体の設定を変更することができ、この場合はモーダルダイアログです。

今のところ2つの異なるダイアログがありますが、ダイアログがほしいと思うだけで、ダイアログのボタンを押すだけでプログラミングモードとエディションモードを切り替えることができます。

したがって、モーダルダイアログでモーダルダイアログを変換する必要があります。また、その逆も実行時に変換する必要があります。それを達成する方法はありますか?

ありがとうございました。

答えて

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)を呼び出そうとしましたが、これも機能しませんでした。 親ウィンドウは、これが適切かどうかわからないメインフレームになります。 ところで:私がしたいのは、モードレスダイアログ(Create/ShowWindow)を開いたときにユーザーがボタンを押すとダイアログがモーダルになります。ユーザーがボタンをもう一度押すと、ダイアログは再びモードレスになります。 –