工具条上有按钮ID_BUTTON_BLACK,ID_BUTTON_BLUE,ID_BUTTON_RED1,ID_BUTTON_YELLOW,ID_BUTTON_RED,ID_BUTTON_GREEN;
//消息映射
    BEGIN_MSG_MAP(CBandToolBarCtrl)
        MESSAGE_HANDLER(OCM_COMMAND, OnCommand)
OCM_COMMAND_ID_HANDLER(ID_BUTTON_BLACK, OnButtonBlack)
OCM_NOTIFY_CODE_HANDLER(TBN_DROPDOWN, OnToolbarDropDown)
        NOTIFY_CODE_HANDLER(TTN_NEEDTEXT, OnToolbarNeedText)
        COMMAND_ID_HANDLER(ID_MENUPOPUP_CONFIG, OnConfig)
COMMAND_ID_HANDLER(ID_MENUPOPUP_OPTION2, OnAbout)
        MESSAGE_HANDLER(WM_SIZE, OnSize)
        MESSAGE_HANDLER(WM_MENUSELECT, OnMenuSelect)
        DEFAULT_REFLECTION_HANDLER()
// handle the rebar chevron messages, does not require reflection
ALT_MSG_MAP(1)
COMMAND_ID_HANDLER(ID_BUTTON_BLACK, OnButtonBlack)
NOTIFY_CODE_HANDLER(TBN_DROPDOWN, OnToolbarDropDown)
END_MSG_MAP()
//////////////////////////////////////////
LRESULT CBandToolBarCtrl::OnToolbarDropDown(int /*idCtrl*/, LPNMHDR pnmh, BOOL& bHandled)
{
    NMTOOLBAR* ptb = (NMTOOLBAR *) pnmh;
    if ((ptb->iItem == ID_BUTTON_BLACK || ptb->iItem == ID_BUTTON_BLUE|| ptb->iItem == ID_BUTTON_RED1
|| ptb->iItem == ID_BUTTON_YELLOW|| ptb->iItem == ID_BUTTON_RED|| ptb->iItem == ID_BUTTON_GREEN))
    {
        SetFocus();

RECT rc;
    CToolBarCtrl tbar(pnmh->hwndFrom);
    BOOL b = tbar.GetItemRect(tbar.CommandToIndex(ptb->iItem), &rc);
    ATLASSERT(b);
    tbar.MapWindowPoints(HWND_DESKTOP, (POINT *)&rc, 2);

    CMenu menuPopup;
        
switch(ptb->iItem)
        {
        case ID_BUTTON_BLACK :
            menuPopup.LoadMenu(IDR_MENU_POPUP);//这是加载的菜单资源
            break;
        case ID_BUTTON_BLUE :
            menuPopup.LoadMenu(IDR_MENU_POPUP_2);//这是加载的菜单资源
            break;
        case ID_BUTTON_RED1 :
            menuPopup.LoadMenu(IDR_MENU_POPUP_3);
            break;
        case ID_BUTTON_YELLOW :
            //当点击这项的时候想用代码成一个下拉菜单
              如果生成了下拉菜单,各菜单项怎么来实现消息映射呢???
              能不能生成一个展开式的菜单项
break;
        case ID_BUTTON_RED :
            //当点击这项的时候想用代码成一个下拉菜单
              如果生成了下拉菜单,各菜单项怎么来实现消息映射呢???
              能不能生成一个展开式的菜单项
    break;
        case ID_BUTTON_GREEN :
            //当点击这项的时候想用代码成一个下拉菜单
              如果生成了下拉菜单,各菜单项怎么来实现消息映射呢???
              能不能生成一个展开式的菜单项 break;
        };
::TrackPopupMenu(menuPopup.GetSubMenu(0), TPM_LEFTALIGN | TPM_RIGHTBUTTON, rc.left, rc.bottom , 0, *this, NULL);
        bHandled = true;
        return 0;
    }
bHandled = false;
    return 0;
}

解决方案 »

  1.   

    ON_COMMAND_RANGE(10228,10240,OnPenWidth)
    一种比较简单的方法就是试先定义你要动态加载的菜单的ID一个范围,然后在那个方法里区分来分别处理消息
      

  2.   

    etre(林荃) 
    这位兄台您能说得祥细一点吗??最好是有个例子或资料什么的,我没做过这方面的东西所以很手生.....
    感激不敬~~~~~~~~~
      

  3.   

    谢谢。是这样的
    数据库表里有两个字段1为ID,2为显示的文字
    ----------
    ID    NAME
    ----------
    1     第1项
    2     第2项
    3     第3项
    4     第4项
    5     第5项
    当点击ID_BUTTON_RED用上面那个表的内容生成一个下拉菜单......
      

  4.   

    增加一个
    BOOL CMainFrame::OnCommand(WPARAM wParam,LPARAM lParam)函数吧.
    {
    BOOL bRet=CMainBaseFrame::OnCommand(wParam, lParam);
    int nCode=HIWORD(wParam);
    UINT nID=LOWORD(wParam);//菜单项ID,这里你可以自己设置吧 if(bRet==FALSE&&nCode==0)
    if(nID==12341)
    {
    //自己处理
    }
    return bRet;
    }
      

  5.   

    假如我现在有一个数组
    CString str[10]={"Link1",
                     "Link2",
            "Link3",
    "Link4",
    "Link5",
    "Link6",
    "Link7",
    "Link8",
    "Link9",
    "Link10",
    };
    当我点击ID_BUTTON_RED的时候该怎么样来实现用这个数组来生成菜单呢???
      

  6.   

    哦,你是要如何生成菜单
    HMENU hSubPopMenu;
    hSubPopMenu=::CreatePopupMenu();
    ::AppendMenu(hSubPopMenu, MF_STRING, (UINT)11222,"test");
    ::AppendMenu(hSubPopMenu, MF_STRING, (UINT)11223,"test1");
    ::AppendMenu(hSubPopMenu, MF_STRING, (UINT)11224,"test2");
    ::AppendMenu(hSubPopMenu, MF_STRING, (UINT)11225,"test3");
    ::TrackPopupMenu(hSubPopMenu,TPM_LEFTALIGN | TPM_RIGHTBUTTON, rc.left, rc.bottom , 0, *this)
      

  7.   

    谢谢你
    我在处理消息的候不知道这个是怎么回事bRet=CMainBaseFrame::OnCommand(wParam, lParam);
    我的ONCOMMAND原型是
    MESSAGE_HANDLER(OCM_COMMAND, OnCommand)
    LRESULT OnCommand(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
    类定义是这样的
    class CBandToolBarCtrl : public CWindowImpl<CBandToolBarCtrl, CToolBarCtrl>
      

  8.   

    CToolBarCtrl
    CMainBaseFrame是基类,你改成CToolBarCtrl就可以了
    CToolBarCtrl::OnCommand(wParam, lParam);
      

  9.   

    会出现这样的错误
    error C2039: 'OnCommand' : is not a member of 'CToolBarCtrlT<class ATL::CWindow>'
      

  10.   

    BOOL bRet=CBandToolBarCtrl::OnCommand(NULL, wParam,lParam, bHandled);
    bHandled = FALSE;
    int nCode=HIWORD(wParam);
    UINT nID=LOWORD(wParam);//菜单项ID,这里你可以自己设置吧 if(bRet==FALSE&&nCode==0)
    if(nID==11222)
    {
    MessageBox(_T("asdf")); //自己处理
    }
    return bRet;
    我换成这样是不会编译错误了,可是点击菜单项跟本没得任何反应是怎么一回事呀!????????
    :(
      

  11.   

    一样的响应,只是你自己先根据你定义的菜单的ID映射一个函数就可以了.消息用ON_COMMAND_RANGE
      

  12.   

    根据数据库的内容生成也只是菜单显示出来的文字吧!但是这个ID还是要编码的时候确定下来的.上面的APPENDMENU就是一个方法.
    http://www.vckbase.com/document/viewdoc/?id=514BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
       //{{AFX_MSG_MAP(CMainFrame)
       // ... 
       //}}AFX_MSG_MAP
       ON_COMMAND_RANGE(ID_FILE_MENUITEM1, ID_FILE_MENUITEM3, OnFileMenuItems)
    END_MESSAGE_MAP()void CMainFrame::OnFileMenuItems(UINT nID)
    {
       ....//这里判断nID的值来做不同的响应,也就是一个函数响应不同的ID
    }
      

  13.   

    谢谢兄台的回复,因为我是用ATL做的一个DLL所以没有用到MFC,界面用的是WTL.
    在编译的时候出现error C2065: 'ON_COMMAND_RANGE' : undeclared identifier
    这是程序的一些消息映射
    BEGIN_MSG_MAP(CBandToolBarCtrl)
            MESSAGE_HANDLER(OCM_COMMAND, OnCommand)
            OCM_COMMAND_ID_HANDLER(ID_BUTTON_BLACK, OnButtonBlack)
            OCM_NOTIFY_CODE_HANDLER(TBN_DROPDOWN, OnToolbarDropDown)
            NOTIFY_CODE_HANDLER(TTN_NEEDTEXT, OnToolbarNeedText)
            COMMAND_ID_HANDLER(ID_MENUPOPUP_CONFIG, OnConfig)
            COMMAND_ID_HANDLER(ID_MENUPOPUP_OPTION2, OnAbout)
            MESSAGE_HANDLER(WM_SIZE, OnSize)
            MESSAGE_HANDLER(WM_MENUSELECT, OnMenuSelect)
            DEFAULT_REFLECTION_HANDLER()
    ALT_MSG_MAP(1)
            MESSAGE_HANDLER(OCM_COMMAND, OnCommand)
            COMMAND_ID_HANDLER(ID_BUTTON_BLACK, OnButtonBlack)
            NOTIFY_CODE_HANDLER(TBN_DROPDOWN, OnToolbarDropDown)
    END_MSG_MAP()这是动态生成的菜单代码
    menuPopup=::CreatePopupMenu();
       ::AppendMenu(menuPopup, MF_STRING, (UINT)11222,_T("test"));
                ::AppendMenu(menuPopup, MF_STRING, (UINT)11223,_T("test1"));
                ::AppendMenu(menuPopup, MF_STRING, (UINT)11224,_T("test2"));
                ::AppendMenu(menuPopup, MF_STRING, (UINT)11225,_T("test3"));
    这个时候我该怎么样来实现动态的消息映射呢???????????????????????????????
    各位过路的好心人帮帮忙,,,这个已经我郁闷N久了..........
      

  14.   

    这到底是怎么了???堂堂CSDN上面难不成没人知道吗???请各位大侠救救我这个郁闷的青年吧~~~