MFCではクラスウィザードを使って、メニューコマンドとそのハンドラ(処理関数)を
簡単に結び付ることが出来ます。それらの情報は cpp ファイルにある BEGIN_MESSAGE_MAP,
END_MESSAGE_MAP 内の、//{{AFX_MSG_MAP と //}}AFX_MSG_MAP との間に ON_COMMAND マクロ
を使って実装されます。
クラスウィザードではコマンドとコマンドハンドラを1対1に対応づけすることしか出来ませんが、
ON_COMMAND_RANGE マクロを使えば、連続するID番号を持つコマンドをひとつのハンドラに結び付る
ことができ、コードの記述量を減らすことが可能です。
ON_COMMAND_RANGE は、最初の2つの引数でコマンドの範囲を、第3引数でメッセージハンドラ 関数を指定します。
ON_COMMAND_RANGE( id1, id2, memberFxn )
ON_COMMAND_RANGE で指定するメッセージハンドラは、引数にコマンドIDをもちます。 これは、ヘッダファイルで、//}}AFX_MSG の次あたりに、以下のように宣言します。
.h ファイル: .... //}}AFX_MSG afx_msg void OnXXX(UINT); // ON_COMMAND_RANGE 用のメッセージハンドラ .....
次に .cpp ファイルで ON_COMMAND_RANGE でメッセージマップに登録します。クラスウィザード は ON_COMMAND_RANGE をサポートしていないので、//}}AFX_MSG_MAP の次あたりに記述します。
.cpp ファイル: .... BEGIN_MESSAGE_MAP(CViviView, CView) ON_WM_CONTEXTMENU() //{{AFX_MSG_MAP(CViviView) ON_...() // クラスウィザードにより管理されるハンドラたち ..... //}}AFX_MSG_MAP ON_COMMAND_RANGE(ID_XXX_0, ID_XXX_9, OnXXX) // 追加する行 ..... END_MESSAGE_MAP()
この例では、ID_XXX_0 から ID_XXX_9 の間のコマンドIDがハンドラ OnXXX で処理されることに なります。
最後にコマンドハンドラを記述します。
void CViviView::OnXXX(UINT nID) { ..... }
引数で、コマンドIDが渡されるので、それを参照し処理を行います。
同じようにして、コマンドの更新ハンドラも連続するIDを持つ複数のコマンドに対応できます。 ただし、更新ハンドラへはコマンドIDが直接渡されないので、CCmdUI* pCmdUI を参照します。
"msdev\mfc\include\AFXWIN.H": class CCmdUI // simple helper class { public: // Attributes UINT m_nID; UINT m_nIndex; // menu item or other index .... };
なので、
void CViviView::OnUpdateXXX(CCmdUI* pCmdUI) { int x = pCmdUI->m_nID - ID_XXX_0; // コマンドIDの相対値 ..... }
のように更新ハンドラを記述します。
前のTips 次のTips 津田伸秀 のホームページに戻る。
Last Updated on 4-Sep-1996, Copyright (c) 1996 by Nobuhide Tsuda, All Right Reserved.
このホームページに関するご質問、ご要望、バグレポート等は
Nobuhide_Tsuda@jsn.justnet.or.jp
までメールをいただければ幸いです。