Tips7 ON_COMMAND_RANGE, ON_UPDATE_COMMAND_UI_RANGE

前のTips 次のTips


 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

 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が渡されるので、それを参照し処理を行います。

■ ON_UPDATE_COMMAND_UI_RANGE

 同じようにして、コマンドの更新ハンドラも連続する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  までメールをいただければ幸いです。