文書番号: 403831
最終更新日: 2004/04/27
この資料は以下の製品について記述したものです。
- Microsoft(R) Visual C++(TM) Development System Standard Edition forWindows(R) Version 1.0 (以下 Visual C++ 1.0)
- Microsoft(R) Visual C++(TM) Development System Professional Edition forWindows(R) Version 1.0 (以下 Visual C++ 1.0)
- Microsoft(R) Visual C++(TM) Development System for Windows(R) Version 1.5(以下 Visual C++ 1.5)
- Microsoft(R) Visual C++(TM) Development System and Tools
概要
この資料は、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(); // この関数でサイズ計算がされる
}
Keywords: KBHOWTO VC10 VC15 VC20 KB403831
Technology: kbAudDeveloper kbvc150 kbVC32bitSearch kbVCsearch