菜单,菜单,又见菜单..

netsky 2000-03-29 12:23:00
我做了一右键菜单,在mouseup中
pop->EnableMenuItem(IDR_MENUBTN, MF_ENABLED and MF_BYCOMMAND and MF_BYPOSITION );

pop->TrackPopupMenu(TPM_LEFTALIGN and TPM_LEFTBUTTON and TPM_RIGHTBUTTON ,point.x,point.y,this);
弹出成功,函数执行也成功。但:

在ON_UPDATE_COMMAND_UI中
有pCmdUI->Enable(FALSE);

奇怪的是,在菜单弹出时,该语句没有得到执行。
而在菜单消失时,却调用了该条语句。不知道为什么?
该菜单是DLL中的菜单。

肯请各位高手指点。

...全文
284 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
坎坷的菜贩 2000-03-30
  • 打赏
  • 举报
回复
不要在WM_LBUTTONUP中调用TrackPopupMenu,而应在WM_CONTEXTMENU调用.
wilson2000 2000-03-30
  • 打赏
  • 举报
回复
右键菜单的弹出应该由wm_contextmenu消息维护,她的坐标不用编成窗口坐标,非常方便
Kenny 2000-03-30
  • 打赏
  • 举报
回复
我做过一个菜单控件窗口。发现WM_UPDATE_COMMAND_UI是主框架窗口的OnIdlUpdateCommandUI函数执行时发出的。需要update command state的窗口,在WndProc函数中处理CN_UPDATE_COMMAND_UI消息(或CN_COMMAND_UI or CN_COMMAND, i'm not sure now), 此消息是在WM_UPDATE_COMMAND_UI消息之前发送的。一般的窗口不处理此消息,控制弹出菜单的窗口需自行处理该消息。而此时主框架窗口的对象指针被传了进来。在控制消息的过程中,你得逐个菜项去UpdateCommandState,调用方法:自己声明一个CCmdUI对象state,把菜单项的信息放进来,然后state.DoUpdate(pTarget, bDisableIfNoHandler), 其中pTarget和bDisableIfNoHandler是CN_UPDATE_COMMAND_UI消息传进来的。在state.DoUpdate()完成过程中,会触发WM_UPDATE_COMMAND_UI消息。当然,此消息的触发不光是菜单,更还会有ToolBar等所有具有发出WM_COMMAND消息的对象触发的。而UpdateCommandState不会由CMenu的对象自行动作。最后得说一下WM_INITPOPUPMENU会触发一个OnIdlUpdateComamndUI动作。这就是说,既使在TrackPopupMenu执行前就有OnUpdateCommandUI被执行到,如果没有你其控制窗口的配合,也不会改变菜单项的状态。

以上方法实在太复杂,也太难描述清楚,但你可以用勾子勾得所有菜单弹出后的消息(就是你所说的象DoModal()之后的所有消息)。用以下语句:
HHOOK hMsgHook = ::SetWindowsHookEx(WH_MSGFILTER,//这里可以是其它值,根据你自己的需要
MenuInputFilter, NULL, AfxGetApp()->m_nThreadID);
pWndMsgWillBeHandled->PostMessage(WM_INITMENUPOPUP, (WPARAM)pMenuBePopup->GetSafeHmenu(),MAKELONG(iPos, bSysMenu)); //iPos = 0
DWORD comm = ::TrackPopupMenu(pMenuBePopup->GetSafeHmenu(),
TPM_LEFTALIGN and TPM_NONOTIFY and TPM_RETURNCMD,
leftCoordinateOfScreen,
topCoordinateOfScreen,
0,
pWndMsgWillBeHandled->GetSafeHwnd(),
NULL);
pWndMsgWillBeHandled->PostMessage(WM_COMMAND, comm);
::UnhookWindowsHookEx(hMsgHook);

消息勾子函数:
LRESULT CALLBACK MenuInputFilter(int code, WPARAM wParam, LPARAM lParam)
{
return (
YourOnMenuInput( *((MSG*)lParam) )
) ? TRUE : CallNextHookEx(hMsgHook, code, wParam, lParam);
}

当然,你的hMsgHook最好是全局变量,在YourOnMenuInput(MSG*)中,你可以处理一切消息。

netsky 2000-03-29
  • 打赏
  • 举报
回复
右键菜单不响应ON_UPDATE_COMMAND_UI?
我的程序却响应了:(。只是在菜单消失之后响应,而我想在菜单拉出之前就要控制。
Kenny 2000-03-29
  • 打赏
  • 举报
回复
在TrackPopupMenu调用前,向程序的主框架窗口发送一条WM_INITMENUPOPUP消息,用PostMessage, 具体格式要看帮助中的WM_INITMENUPOPUP。
Jackzhu 2000-03-29
  • 打赏
  • 举报
回复
右键菜单不响应ON_UPDATE_COMMAND_UI,如果你想控制右键菜单状态,在弹出前控制
Sniper 2000-03-29
  • 打赏
  • 举报
回复
ON_UPDATE_COMMAND_UI可以对弹出窗口用吗?
Jackzhu 2000-03-29
  • 打赏
  • 举报
回复
TracePopupMenu()相当于DoModal()
无法设置菜单状态
Sniper 2000-03-29
  • 打赏
  • 举报
回复
在TracePopupMenu()调用之后直接进行控制不行吗?

16,470

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧