因为想在CStatic中响应右键点击,然后弹出菜单,所有自定义了一个CStatic。
响应右键点击的代码
void CPlayStatic::OnRButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CMenu Menu;
Menu.LoadMenuA(IDR_MENU_RBCLICK);
CMenu* pPop=Menu.GetSubMenu(0);
ClientToScreen(&point);
pPop->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,point.x,point.y,this);
CStatic::OnRButtonDown(nFlags, point);
}
然后再对话框中想响应对于菜单子项的单击,但是一直不能响应,不知道为什么
消息映射
ON_COMMAND(IDM_START,OnMenuStart)
void CVideoDlg::OnMenuStart()
{
MessageBox("1");
}

解决方案 »

  1.   

    试试这个
    pPop->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,point.x,point.y,NULL);
      

  2.   

    void CPlayStatic::OnUpdateStart(CCmdUI *pCmdUI)
    {
    // TODO: 在此添加命令更新用户界面处理程序代码
    CMenu Menu;
    Menu.LoadMenuA(IDR_MENU_RBCLICK);
    CMenu* pPop=Menu.GetSubMenu(0);
    pCmdUI->m_pMenu=pPop;
    pCmdUI->m_nIndexMax=pPop->GetMenuItemCount();
    pCmdUI->m_pMenu->EnableMenuItem(IDM_START,MF_BYCOMMAND|MF_GRAYED);
    }
    这个怎么不能改变菜单的样式呢?
      

  3.   

    我右键点击是写在一个继承自CStatic的自定义类里面的。
    void CPlayStatic::OnRButtonDown(UINT nFlags, CPoint point)
    CPlayStatic是我自定义的一个静态框
      

  4.   

    这个我知道,你程序中应该定义过这个静态框的一个变量,类似CPlayStatic m_Static;所以右键单击消息会响应CPlayStatic中的OnRButtonDown。
      

  5.   

    但是我有十多个CPlayStatic的对象,就是不知道怎么判断到底是哪个一被右键点击了。
      

  6.   

    pPop->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,point.x,point.y,this);
    最后一个参数
    pWnd 标识拥有弹出菜单的窗口。该窗口接收来自菜单的所有WM_COMMAND消息 
      

  7.   

    void CPlayStatic::OnRButtonDown(UINT nFlags, CPoint point) 
    {     
    // TODO: 在此添加消息处理程序代码和/或调用默认值
    int temp = GetDlgCtrlID();//取得右键单击的Static ID
    if (temp == IDC_STATIC1)//仅当静态控件为IDC_STATIC1时弹出菜单
    {
    CMenu Menu;     
    Menu.LoadMenu(IDR_MENU1);     
    CMenu* pPop=Menu.GetSubMenu(0);     
    ClientToScreen(&point);     
    pPop->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,point.x,point.y,this);     
    CStatic::OnRButtonDown(nFlags, point);
    }
    }
      

  8.   

    如果赋值为NULL就不会弹出菜单,只有在静态框中处理消息,然后发送消息给对话框了,还有请问一下怎么改变菜单为GRAYED或者ENABLED呢,我调用EnableMenuItem()都是失败
      

  9.   

    与其这样,还不如给CPlayStatic加一个函数
    void AllowMenu(CWnd* pHandler, UINT menu_id)
    {
    m_bAllow = true;
    m_idMenu = menu_id;
    m_pMsgHandler = pHandler;
    }
      

  10.   

    如果想让主窗口知道是哪个static,可以在OnRButton哪里加一句
    m_pMsgHandler->PostMessage(WM_FROM_ME, GetDlgCtrlID(), 0);
    父窗口响应这个消息就行了
    ON_MESSAGE(WM_FROM_ME, OnMe)
      

  11.   

    改变菜单样式不是在这里,直接在
        CMenu Menu;
        Menu.LoadMenu(IDR_MENU_RBCLICK);
        CMenu* pPop=Menu.GetSubMenu(0);
        pPop->EnableMenuItem(...);
        ClientToScreen(&point);
        pPop->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,point.x,point.y,m_pMsgHandler);
    即可