ベースはVC++6です。
ダイアログを表示する
- リソースエディタで、挿入>ダイアログでダイアログのFormを追加。プロパティなどでIDを編集。
- ダイアログのリソースを表示して、その上で適当にダブルクリック。
- MFC ClassWizardが立ち上がって、「クラスの追加」を聞いてくるので、新規クラスの作成を選択。
- クラス情報を入力してクラスを作成(CTestDialogとでもしておく)。基本クラスはデフォルトで良いけど、拡張のクラスがあるならそっちでも良いよ。
- ダイアログクラス(CTestDialog)ができているので、適当にボタン押下のイベントを起こして
CTestDialog dlg; int ret; ret = dlg.DoModal();
- で一応表示ができる
ダイアログにメニューを追加
一番単純なやつ
- ダイアログに紐付けたいメニューをあらかじめ作成しておく
- リソースエディタでダイアログを表示する。右クリックでプロパティを出す。
- プロパティにあるメニュー項目は通常空欄だが、ここに表示したいメニューIDを選択してやる。
- レイアウトのテストだと表示されないが、ビルドすればちゃんとメニューが出ます。
ダイアログにステータスバーを追加しよう
- CStatusBarかCStatusBarCtlを使う。取りあえず、ここではCStatusBarCtlを使うよ。
CStatusBarとCStatusBarCtlは継承関係が違うね。
CStatusBarCtlはCWndから、CStatusBarはCWnd>CControlBar>CStatusBarだな。むう。
まあ、置いておこうか。 - 取りあえず、ダイアログボックスの大きさは固定とする。
// ヘッダーで変数を宣言 CStatusBarCtl m_ctlStatusBar;
// OnInitDialogあたりでCreateを行う
m_wndStatusBar.Create(
WS_CHILD | WS_VISIBLE ,
CRect(0, 0, 0, 0),
this,
AFX_IDW_STATUS_BAR
);
- 取りあえず。これでダイアログの一番下にステータスバーができている。
Createの引数
CStatusBarCtl.Create()は
BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );
なんだけど、
- 一番最後のnIDが適当で良いみたい。でも、宣言からして、省略はできない。
悩んだ末、CStatusBarの方のデフォルトのID(AFX_IDW_STATUS_BAR)を持ってきた。
まあ、1ダイアログ1ステータスバーだから問題ないでしょ。 - RECTは
なんか、上のように0,0,0,0でも問題なく表示できますね。何に使うんだろう……。
CStatusBarなんかでは、WindowのRect拾ってきて、いろいろ設定しないといけない感じなんだけど - dwStyleはね、
- WS_CHILD,WS_VISIBLEは必須です。
- 一番下に設置する場合、CCS_BOTTOMを追加
- ダイアログの大きさが可変の場合、ステータスバーまでこのままでは連動しないので、CCS_NOMOVEYを使う。
CCS_NOMOVEYを設定して、ダイアログのWM_SIZEイベントを拾って、そのままステータスバーにそのイベントを通知してやると、OKif (::IsWindow(this->m_wndStatusBar.GetSafeHwnd())) { this->m_wndStatusBar.SendMessage(WM_SIZE, (WPARAM)nType, MAKELPARAM(cx, cy)); }んだけど、指定しなくてもWN_SIZEを飛ばせば変更されるようだな。わからんねぇ。 - ダイアログが大きさ可変の場合、SBARS_SIZEGRIPを追加すると、ステータスバーの端っこにサイズ変更グリッドがでます
