我在ActiveX控件中有个窗口,响应右键消息弹出一个右键菜单。可是为什么弹出来的菜单变灰了,鼠标样式变成了移动窗口的样式,可是同样的代码放到MFC下面就是正常的啊,谁能告诉我怎么回事,谢谢了。下面时弹出菜单的代码。void CVCapCtrlCtrl::OnRClick(NMHDR* pNMHDR,LRESULT* pResult)
{  
    CMenu menu,*pSubMenu;
    menu.LoadMenu(IDR_POPMENU);
    pSubMenu=menu.GetSubMenu(0);
    CPoint oPoint;
    GetCursorPos(&oPoint);
    pSubMenu->TrackPopupMenu(TPM_LEFTALIGN,oPoint.x,oPoint.y,this);
}在线等。

解决方案 »

  1.   

    最后一句改为
        pSubMenu->TrackPopupMenu(TPM_LEFTALIGN,oPoint.x,oPoint.y,AfxGetMainWnd());
    鼠标样式就正常了,但它还是灰的。郁闷,没人过来指导指导么?
      

  2.   


    应该不是这个问题吧,我在MFC里也没加响应函数的。不过我也试试。
      

  3.   

    我晕,貌似是ActiveX Control Test Container的问题,我把控件加到MFC对话框测试,右键菜单不是灰的,放到网页测试也不是灰的如果不是它的Bug,还请各位告诉我到底咋回事,本帖暂时不结。
      

  4.   

    再提个醒,也可能不是这个问题。楼主说在控件里面有一个窗口,姑且记做CWnd* InWnd; 
    问题在pSubMenu->TrackPopupMenu(TPM_LEFTALIGN,oPoint.x,oPoint.y,AfxGetMainWnd()); 这个函数上:
    从这个函数在MSDN上的解释看不出东西来,我找到了下面的这个函数:
    BOOL TrackPopupMenu( HMENU hMenu,  UINT uFlags, int x, int y, int nReserved, HWND hWnd,  HWND prcRect);
    我想这两个函数应该功能是一样的,只是参数和作用域上不同罢了。
    MSDN对这个函数的HWND hWnd参数是这样解释的:
    hWnd
    [in] Handle to the window that owns the shortcut menu. This window receives all messages from the menu. The window does not receive a WM_COMMAND message from the menu until the function returns. If you specify TPM_NONOTIFY in the uFlags parameter, the function does not send messages to the window identified by hWnd. However, you must still pass a window handle in hWnd. It can be any window handle from your application. 
    从这段描述可以看出来,这个窗口句柄将处理你菜单的所有消息,而且这个窗口可以是你工程里面的其他任何窗口。
    但是,如果你把菜单消息发送的窗口和你处理菜单消息的窗口弄的不一样了,就会出现菜单灰色的问题。
    比如说: 你把所有的菜单处理事件放在InWnd类里面去处理,然后你给TrackPopupMenu传CVCapCtrlCtrl类指针就会出问题。
    因为菜单消息的处理TrackPopupMenu交给了CVCapCtrlCtrl窗口去完成,结果你的处理函数没有在CVCapCtrlCtrl窗口里面,那你的菜单就是灰的。如果你将菜单消息的处理函数都放在了InWnd里面,那你应该写成:pSubMenu->TrackPopupMenu(TPM_LEFTALIGN,oPoint.x,oPoint.y,InWnd );
    你放在CVCapCtrlCtrl类里面来处理菜单消息,那你就应该写成:pSubMenu->TrackPopupMenu(TPM_LEFTALIGN,oPoint.x,oPoint.y,this );
    如果写成pSubMenu->TrackPopupMenu(TPM_LEFTALIGN,oPoint.x,oPoint.y,AfxGetMainWnd()); 处理函数应该写在什么地方我也不太清楚,是不是应该写在CVCapCtrlApp类里面啊? 反正不能是InWnd或CVCapCtrlCtrl类里面。这个问题其实在MFC其他应用程序里面也会出现,如果在CMainFrame里面处理菜单消息,你传View类指针,那菜单就是灰色的。