MFCでモードレスなダイアログ作成

概要

久々にMFCアプリを作ったので,メモ.(個人的にアプリという響きは昭和生まれである事を忘れさせてくれるなんかがある)
モードレスとは,子ダイアログを立ち上げながら親の操作も出来る…かんじ.


以下,VisualStudio2008MFCダイアログベース.

はじめに

普通に子ダイアログを立ち上げる場合,子ダイアログのクラスをニューしてdoModal()する.
but,
それだと親ダイアログが固まり,時に思わしくない.そこでモードレス(モーレス?)を作ってみる.大体の流れは,


リソースに子ダイアログを追加,クラスを作る

メインダイアログの関数からクラスのポインタpDlgをニューし,pDlg->create()で表示させる

あといろいろ.


今回はメインダイアログのボタンから子ダイアログをモーダレスの立ち上げ/消去を行い,子ダイアログクラスの目盛の確保/破棄や表示はその都度行う.あと,子ダイアログからメインダイアログの関数も呼べるように.

関連研究(敬称・敬語略)

ネットやらで資料を探すと,作り方に少しばらつき.

http://www.ccad.sist.chukyo-u.ac.jp/~mito/ss/program/C/DialogBase/app/genDlg/index.htm

メインダイアログの関数内でメモリの確保,表示,破棄を行ってて素人好み.

http://www.hcn.zaq.ne.jp/no-ji/reseach/990615.htm

子ダイアログのコンストラクタに表示処理,また画面を消すときに"delete this;"など,使い勝手が良さそう(=むずい)
あと,モーダレスの表示,非表示をShowWindow()で行って,メモリはそのまま.

実装

ダイアログ,リソース追加

DialogのプロパティでVisibleをtrueにする.falseなら関数内でShowWindowする必要あり
あと今回は子ダイアログの生成/破棄を親からのみ出来るように,SystemMenuもfalseに変更.

表示

メインダイアログのメンバ変数に,子クラスのm_pDlgを持たせておいて,

m_pDlg = new CpDialog(this);
m_pDlg->Create(IDD_DIALOG2)


子クラスのコンストラクタにthisを渡しているのは,子から親のクラスを呼べるようにするため.



取り敢えずここまで.
公共放送の編集室で暇だったので,途中しっかり書いてみた.