本ページは公開が終了した情報の複製であり、掲載時点での情報です。本ページに記載されている内容について各所に問い合わせることはご遠慮下さい。
サポート技術情報

[MSVC] ダイアログバーのプログラミングテクニック

文書番号: 403831

最終更新日: 2004/04/27


この資料は以下の製品について記述したものです。


概要

この資料は、MFC のダイアログバーのプログラミングテクニックについて、いくつか の方法を紹介したものです。

詳細

<QUESTION 1>

ダイアログバーにボタンを貼りつけたがグレー表示で選択状態にならない。

<ANSWER 1>

これはメニューなどと同じでメッセージ処理関数を用意し、メッセージをマップ
しないとアクティブにはなりません。大抵は親であるフレームウィンドウでマップ
します。

<QUESTION 2>

VBX のボタンを貼りつけ、ダイアログバーの親であるフレームウィンドウにメッ
セージマップでボタンが押されたときの処理を記述したが、まだ選択状態にならない。

<ANSWER 2>

VBX の場合は、さらにコマンド UI も追加しなければなりません。その中で CCmdUI:: Enable() を呼び出します。ただし、このコマンド UI は ClassWizard から設定する ことはできません。手作業で追加します。
  <例>
  BEGIN_MESSAGE_MAP(CMainFrame,...
        ON_VBXEVENT(VBN_CLICK, IDC_COMMAND3D1, OnClick...
        ON_UPDATE_COMMAND_UI(IDC_COMMAND3D1, OnUpdateVBX)
  END_MESSAGE_MAP()
  void CMainFrame::OnUpdateVBX(CCmdUI* pCmdUI) {
         pCmdUI->Enable(TRUE); // これで VBX ボタンがアクティブになる
  }

<QUESTION 3>

今度はスクロールバーを貼りつけ、フレームウィンドウに ON_HSCROLL のメッセージ マップを用意したのだが、スクロールバーをクリックしてもメッセージがこない。

<ANSWER 3>

スクロールバーは、そのスクロールバーを操作された時のメッセージを自分の親コント ロールに送ります。ですからこの場合は CDialogBar クラスのオブジェクトに送られて しまうのです。そして  CDialogBar クラスにはそのメッセージを自分の親ウィンドウ に送る仕組みはありません。どうしてもフレームウィンドウでメッセージを処理した いのであれば、CDialogBar の派生クラスを用意し、その中の OnHScroll/OnVScroll() メッセージ処理関数で、親フレームウィンドウに WM_H/VSCROLL メッセージを送るよう にします。
  <例>
  void CMyDlgBar::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar){
        // 親ウィンドウに WM_HSCROLL メッセージを送る
        GetParentFrame()->SendMessage(WM_HSCROLL, (WPARAM)nSBCode,
                        (LPARAM)MAKELONG(nPos, pScrollbar->GetSafeHwnd()));
        // ↑このメッセージ形式は 16Win 用なので 32Win の場合はそれ用の形にすること
        CDialogBar::OnHScroll(nSBCode, nPos, pScrollBar);
  }

<QUESTION 4>

「ダイアログバー作成」メニューを作り、動的にメニューを作るようなアプリを
作成したが、メニューを選択してもダイアログバーが表示されない。戻り値は正しい。 ShowWindow() を呼び出してもみたがダメ。

<ANSWER 4>

CDialogBar::Create() でダイアログバーが作成された時は、そのサイズは元に
なるダイアログリソースの大きさではなく0×0の大きさです。通常の大きさで表示 されるのは親のフレームウィンドウがリサイズされた時になります。ですから Create() 呼び出し後に親ウィンドウがリサイズされるような状況を作ることで回避できます。
  <例>
  void CMainFrame::OnMenu1() {
        myDlgBar.Create( this, IDD_DIALOG1, CBRS_LEFT, ID_XXX);
        RecalcLayout(); // この関数でサイズ計算がされる
  }

詳細

  • Visual C++ は、米国 Microsoft Corporation の商標です。

Keywords: KBHOWTO VC10 VC15 VC20 KB403831
Technology: kbAudDeveloper kbvc150 kbVC32bitSearch kbVCsearch

inserted by FC2 system