想在在程序运行时动态的创建一个菜单项,比如点一个按钮以后,添加一个菜单项
请问怎么做这个菜单项的消息映射呢?怎么给这个菜单项一个ID号啊?没有ID号用classwizard不是没法做了么?手工在stringtable里面添加了ID,然后手工写消息映射的定义什么的倒是可以用,不过觉得不该这么麻烦吧?               
同样,对于按钮,动态创建一个按钮的话,那么这个按钮的消息印射如何动态来做,难道就真的只能是预留一个ID值和手工实现消息印射?

解决方案 »

  1.   

    在PreTranslateMessage()里处理好了
      

  2.   

    如果是固定的ID, 修改resource.h添加id,然后再在classwizard中添加消息还是很方便的。要不用ON_COMMAND宏手工添加。
    如果是动态ID,可以利用ON_COMMAND_RANGE宏或重载CWnd::OnCommand。
      

  3.   

    手工添加
    BEGIN_MESSAGE_MAP(CDevTreeView, CTreeView)
    //{{AFX_MSG_MAP(CDevTreeView)
    ..................................
    //}}AFX_MSG_MAP
    ON_COMMAND(ID_PADD_DEVNODE, OnAddDevNode)
    END_MESSAGE_MAP()
    //头文件中
    //{{AFX_MSG(CDevTreeView)
    //}}AFX_MSG
    afx_msg void OnAddDevNode();
      

  4.   

    你可以先定义一ID
    #define ID_XXX   45000
    然后每次你动态增加菜单时把菜单ID设成ID_XXX++
    如果动态加多个菜单可以用宏ON_COMMAND_RANGE来实现消息映射
    在头文件中
    //{{AFX_MSG(CDevTreeView)
    //}}AFX_MSG
    afx_msg void OnXXX( UINT nID );
    在cpp中影射消息ON_COMMAND_RANGE( ID_XXX, ID_XXX+2000, OnXXX )

    void OnXXX( UINT nID )
    {
    //nID为菜单ID}