ダイアログ関係

Last-modified: 2007-10-24 (水) 23:25:54

ベースはVC++6です。

ダイアログを表示する

  1. リソースエディタで、挿入>ダイアログでダイアログのFormを追加。プロパティなどでIDを編集。
  2. ダイアログのリソースを表示して、その上で適当にダブルクリック。
  3. MFC ClassWizardが立ち上がって、「クラスの追加」を聞いてくるので、新規クラスの作成を選択。
  4. クラス情報を入力してクラスを作成(CTestDialogとでもしておく)。基本クラスはデフォルトで良いけど、拡張のクラスがあるならそっちでも良いよ。
  5. ダイアログクラス(CTestDialog)ができているので、適当にボタン押下のイベントを起こして
    CTestDialog dlg;
    int ret;
    ret = dlg.DoModal();
  6. で一応表示ができる

ダイアログにメニューを追加

一番単純なやつ

  1. ダイアログに紐付けたいメニューをあらかじめ作成しておく
  2. リソースエディタでダイアログを表示する。右クリックでプロパティを出す。
  3. プロパティにあるメニュー項目は通常空欄だが、ここに表示したいメニューIDを選択してやる。
  4. レイアウトのテストだと表示されないが、ビルドすればちゃんとメニューが出ます。

ダイアログにステータスバーを追加しよう

  1. CStatusBarかCStatusBarCtlを使う。取りあえず、ここではCStatusBarCtlを使うよ。
    CStatusBarとCStatusBarCtlは継承関係が違うね。
    CStatusBarCtlはCWndから、CStatusBarはCWnd>CControlBar>CStatusBarだな。むう。
    まあ、置いておこうか。
  2. 取りあえず、ダイアログボックスの大きさは固定とする。
    // ヘッダーで変数を宣言
    CStatusBarCtl m_ctlStatusBar;
// OnInitDialogあたりでCreateを行う
m_wndStatusBar.Create(
     WS_CHILD | WS_VISIBLE ,
     CRect(0, 0, 0, 0),
     this,
     AFX_IDW_STATUS_BAR
 );
  1. 取りあえず。これでダイアログの一番下にステータスバーができている。

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イベントを拾って、そのままステータスバーにそのイベントを通知してやると、OK
      if (::IsWindow(this->m_wndStatusBar.GetSafeHwnd()))
       {
         this->m_wndStatusBar.SendMessage(WM_SIZE, (WPARAM)nType,
                                              MAKELPARAM(cx, cy));
       }
      んだけど、指定しなくてもWN_SIZEを飛ばせば変更されるようだな。わからんねぇ。
    • ダイアログが大きさ可変の場合、SBARS_SIZEGRIPを追加すると、ステータスバーの端っこにサイズ変更グリッドがでます