我做了一个界面
其中右键菜单的一些功能与工具栏的菜单是相同的
想将工具栏对应菜单的图标加到右键菜单的前面
但是不知道该怎么价之前我只要将工具栏菜单的ID名与主菜单的ID名设为同样
则两者响应的消息就是同样的,而且工具栏菜单的图标会自动加到主菜单的前面
为什么右键菜单就是不可以而且我将右键菜单的ID名与主菜单取成同样,但他却不响应主菜单响应的命令
比如说,主菜单点击后弹出一个对话框,但右键菜单点击了没反应
请问这是什么问题?谢谢

解决方案 »

  1.   

    点击右键菜单没有反映 是因为你没有响应你的右键菜单的消息事件你在哪个类里面实现的右键菜单 就得在那个类里面添加右键菜单的消息响应函数
    比如你在 CYourDialog 里面弹出了右键菜单,就就应该把右键菜单的消息响应写在CYourDialog里面,而不能公用你的主菜单或者工具栏的消息响应。
      

  2.   

    to wanilyer(缘随影去)
        右键菜单的消息响应是不是用WM_CONTEXTMENU来实现的?
        而我要控制右键菜单是否变灰,要产生什么动作,也是在这里面控制的?to mynamelj(风之羽翼) 
        怎么设置右键菜单的父类?
        我找不到该用哪个函数哦,麻烦告诉我一下吧
        给右键添加图标是不是用SetMenuItemBitmaps来实现的?
        如果是的话,感觉很麻烦哦
      

  3.   

    WM_CONTEXTMENU 这个是用来弹出右键菜单了
    既然你的右键菜单已经弹出来了 没有必要这个了就是右键菜单上的按钮你要响应啊,比如你点击了一个右键菜单的一个按钮,它该干什么!
    它的响应和主菜单以及工具栏按钮是一样的 采用类向导,找到你弹出右键菜单的类,然后找到右键菜单上按钮的ID,在右边的messages 框框里面不是有COMMAND消息和 UPDATE_COMMAND_UI消息嘛?响应这两个消息,就能控制它是否变灰了。设置它的父类:
     
    pMenu->TrackPopupMenu(TPM_LEFTALIGN |TPM_RIGHTBUTTON, pt.x, pt.y, this);//把this改成你要设置的父类。this默认当前类为父类
      

  4.   

    //--------------------------------------------------------------
    // To show a popup menu on window
    //--------------------------------------------------------------
    BOOL ShowPopupMenu(CWnd* pWnd, UINT nID)
    {
    ASSERT(nID!=NULL && pWnd!=NULL);
    CMenu menu;
    CPoint pt;
    GetCursorPos(&pt);
    if(!menu.LoadMenu(nID))
    {
    TRACE0("Falied to load menu source.\n");
    return FALSE;
    }
    CMenu* pPopup = menu.GetSubMenu(0);
    ASSERT(pPopup != NULL);
    pWnd->SetForegroundWindow();
    return pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, pWnd);
    }写给函数你去调用,这样比较简单点.如果你要控制菜单的项目变灰你可以用EnableMenuItem这个函数去处理
      

  5.   

    加图标确实是用 SetMenuItemBitmaps 实现,你看看MSDN帮助里面 照着它的做 也不复杂啊。int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
       if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
          return -1;   // Load bitmaps from resource. Both m_CheckBitmap and m_UnCheckBitmap
       // are member variables of CMainFrame class of type CBitmap.
       ASSERT(m_CheckBitmap.LoadBitmap(IDB_CHECKBITMAP));
       ASSERT(m_UnCheckBitmap.LoadBitmap(IDB_UNCHECKBITMAP));   // Associate bitmaps with the "Test" menu item. 
       CMenu* mmenu = GetMenu();
       CMenu* submenu = mmenu->GetSubMenu(3);
       ASSERT(submenu->SetMenuItemBitmaps(ID_HELP_TEST, MF_BYCOMMAND, 
          &m_CheckBitmap, &m_UnCheckBitmap));   // ...
    }CMainFrame::~CMainFrame()
    {
       // Destroy the bitmap objects if they are loaded successfully 
       // in OnCreate().
       if (m_CheckBitmap.m_hObject)
          m_CheckBitmap.DeleteObject();   if (m_UnCheckBitmap.m_hObject)
          m_UnCheckBitmap.DeleteObject();
    }这是CSDN上的源代码。
      

  6.   

    CMenu*   m_menuPopup ;
    CMenu*   submenu ;
    CBitmap  m_menuBitmap;
    CPoint   m_cursorpos;
    GetCursorPos(&m_cursorpos);if (m_menuPopup.LoadMenu(IDR_TREE_MENU))

        m_menuBitmap.LoadBitmap( IDR_MAINFRAME );
        submenu = m_menuPopup.GetSubMenu(0);
        submenu->SetMenuItemBitmaps(0, MF_BYPOSITION, 
    &m_menuBitmap, &m_menuBitmap);
    }因为右键菜单的图标有很多是跟工具栏的图标相同的
    而我发现工具栏的图标是单独存在一个文件里面的
    我就想把工具栏的第一个图标设为右键第一个菜单的图标
    工具栏的第二个图标设为右键第二个菜单的图标
    上面的程序只实现了对右键第一个菜单的图标设置
    请问其他菜单的图标该如何设置?
      

  7.   

    submenu->SetMenuItemBitmaps(0, MF_BYPOSITION, 
    &m_menuBitmap, &m_menuBitmap);把第一个参数改(0)成其他菜单的位置就可以啦。
      

  8.   

    但是工具栏图标的位置怎么改呢
    怎么把工具栏图标的位置改成第二个?
    &m_menuBitmap是第一个图标哦
    我把它直接加1是有错的
      

  9.   

    发现用SetMenuItemBitmaps添加上去的图标好难看哦
    唉,决定还是不要右键图标了
    多谢两位的帮忙
    呵呵