モードレス ダイアログボックス


■ モードレス ダイアログボックスが初めての人のために
通常のモーダルダイアログボックスは、表示された時点で自分以外のウィンドウへのキーボードやマウスの入力ができなくなります。プログラム的に言うとダイアログボックスを開く関数から帰って来るまでの間です。簡単な例としてはメッセージを表示する AfxMessageBox()がそうです。
しかしプログラムによっては、ダイアログボックスを開いている間も、メインウィンドウを操作したいケースが有ります。例えば、メインウィンドウ動作中常に何かの情報を表示するダイアログボックスを表示したい等の場合が考えられます。こんな時に使用するのがモードレスダイアログボックスです。
■ モードレスダイアログの作成手順
これは、マニュアルにも書いてありますがわかりにくいのでコーディングレベルでまとめてみました。
1.まず、通常のダイアログと同様にダイアログエディターでダイアログボックスを作成します。例として IDを IDD_DLG1とします。この時、ダイアログの[プロパティ]で、 [その他のスタイル]中の [可視]をチェックします。
2.そしてクラスウィザードで、このダイアログを管理するクラスを作成します。例として CDlg1として、ファイル名は Dlg1.cppと Dlg1.hにします。
3.CDlg1に次の変数を追加します。(Dlg1.h)
CWnd* m_pParent; // for modeless.
int m_nID; // for modeless.
4.つぎに、CDlg1のコンストラクタ CDlg1()内に次の2行を追加します。(Dlg1.cpp)
m_pParent = pParent;
m_nID = CDlg1::IDD;
5.次にクラスウィザードで CDlg1に Create関数を追加します。そして、引数を消し以下の様に変更します。(Dlg1.cpp)
BOOL CDlg1::Create()
{
return CDialog::Create( m_nID, m_pParent);
}
ヘッダー内の宣言文も引数を消去します。(Dlg1.h)
■ 一般的な表示方法の例
上述した例の CDlg1を表示する例として、グローバル変数で CDlg1を扱う方法を示します。
まず、変数を指定します。
CDlg1* pDlg1 = new CDlg1;
表示は、
pDlg1->Create();
です。
消去は、
pDlg1->DestroyWindow();
です。

またモードレスダイアログ内のボタン等で、ダイアログを消去する場合は、
void->CDlg1::OnOK()
{
DestroyWindow();
}
最後に
delete pDlg1;
を忘れないで下さい。