用CWnd实现菜单的逻辑遇到一个问题

hurryboylqs 2013-10-15 01:21:32
觉得CWnd自绘任意形状稍微自由点,因此用CWnd模拟了菜单的逻辑
现在遇到的问题是当弹出窗口后,鼠标点到其他非菜单窗口以外的窗口时,菜单就应该隐藏或者
销毁,我是用SetCapture的方式,但是这有个缺点就是会影响点别的窗口的鼠标按下消息
而Windows的CMenu是不会影响的,就是比如我在菜单意外的地方点鼠标左键,那么CMenu就立即消失并且鼠标
左键在别的窗口这个动作仍然生效,而我用CWnd模拟的就做不到这个,可能说的有点啰嗦不知道大家明白了没。
就差这个其他都比较满意了。
...全文
210 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
schlafenhamster 2013-10-16
  • 打赏
  • 举报
回复
“楼上不明白意思,” 是你不明白 我的 意思 吧?
hurryboylqs 2013-10-16
  • 打赏
  • 举报
回复
用CMenu搞定了,懒得整
hurryboylqs 2013-10-15
  • 打赏
  • 举报
回复
楼上不明白意思,你自己弄个就知道了,另外CMenu能绘制出这样的效果吗?可以的话就懒得

就是外框CMenu能绘出来否
schlafenhamster 2013-10-15
  • 打赏
  • 举报
回复
或者在 父窗口的::OnLButtonDown(UINT nFlags, CPoint point)中 检查: { if (m_Menu.IsWindowVisible()) 。。。。。
schlafenhamster 2013-10-15
  • 打赏
  • 举报
回复
使用mouseleave
hurryboylqs 2013-10-15
  • 打赏
  • 举报
回复
试了,也不生效
luoyz520 2013-10-15
  • 打赏
  • 举报
回复
引用 7 楼 hurryboylqs 的回复:
[quote=引用 6 楼 luoyz520 的回复:] [quote=引用 5 楼 hurryboylqs 的回复:] [quote=引用 4 楼 luoyz520 的回复:] 如果你的菜单不是那么复杂的话,比如没有其它控件,那么菜单项的文字和背景可以用画上去的形式,这样菜单这个窗口没有其它控件的话,弹出窗口就SetCapture,点左键或者右键,判断点击的区域是不是在菜单上面,不是的话就ReleaseCapture并销毁菜单。 我也刚做了一个类似的,如果菜单上还有其它控件的话,暂时没想到好的方法。
菜单上没有其他控件,SetCapture有点问题,鼠标左键或者右键会不生效,但CMenu那个会生效点在外面其他窗口还是有反应[/quote]SetCapture后,第一次点击要先判断点击是否在菜单内,不是的话要先ReleaseCapture并销毁菜单这个窗口,然后才可以再继续点击其它窗口。[/quote] 是的,但是CMenu那个你点外面任何窗口都会有响应,我们这个CWnd模拟的只有销毁菜单这个窗口之后才能继续点外面的窗口,有点小遗憾呢,跟CMenu的行为有点不一致[/quote]那是不是可以再发一条WM_LBUTTONDOWN消息给主窗口去处理呢?
hurryboylqs 2013-10-15
  • 打赏
  • 举报
回复
引用 6 楼 luoyz520 的回复:
[quote=引用 5 楼 hurryboylqs 的回复:] [quote=引用 4 楼 luoyz520 的回复:] 如果你的菜单不是那么复杂的话,比如没有其它控件,那么菜单项的文字和背景可以用画上去的形式,这样菜单这个窗口没有其它控件的话,弹出窗口就SetCapture,点左键或者右键,判断点击的区域是不是在菜单上面,不是的话就ReleaseCapture并销毁菜单。 我也刚做了一个类似的,如果菜单上还有其它控件的话,暂时没想到好的方法。
菜单上没有其他控件,SetCapture有点问题,鼠标左键或者右键会不生效,但CMenu那个会生效点在外面其他窗口还是有反应[/quote]SetCapture后,第一次点击要先判断点击是否在菜单内,不是的话要先ReleaseCapture并销毁菜单这个窗口,然后才可以再继续点击其它窗口。[/quote] 是的,但是CMenu那个你点外面任何窗口都会有响应,我们这个CWnd模拟的只有销毁菜单这个窗口之后才能继续点外面的窗口,有点小遗憾呢,跟CMenu的行为有点不一致
luoyz520 2013-10-15
  • 打赏
  • 举报
回复
引用 5 楼 hurryboylqs 的回复:
[quote=引用 4 楼 luoyz520 的回复:] 如果你的菜单不是那么复杂的话,比如没有其它控件,那么菜单项的文字和背景可以用画上去的形式,这样菜单这个窗口没有其它控件的话,弹出窗口就SetCapture,点左键或者右键,判断点击的区域是不是在菜单上面,不是的话就ReleaseCapture并销毁菜单。 我也刚做了一个类似的,如果菜单上还有其它控件的话,暂时没想到好的方法。
菜单上没有其他控件,SetCapture有点问题,鼠标左键或者右键会不生效,但CMenu那个会生效点在外面其他窗口还是有反应[/quote]SetCapture后,第一次点击要先判断点击是否在菜单内,不是的话要先ReleaseCapture并销毁菜单这个窗口,然后才可以再继续点击其它窗口。
hurryboylqs 2013-10-15
  • 打赏
  • 举报
回复
引用 4 楼 luoyz520 的回复:
如果你的菜单不是那么复杂的话,比如没有其它控件,那么菜单项的文字和背景可以用画上去的形式,这样菜单这个窗口没有其它控件的话,弹出窗口就SetCapture,点左键或者右键,判断点击的区域是不是在菜单上面,不是的话就ReleaseCapture并销毁菜单。 我也刚做了一个类似的,如果菜单上还有其它控件的话,暂时没想到好的方法。
菜单上没有其他控件,SetCapture有点问题,鼠标左键或者右键会不生效,但CMenu那个会生效点在外面其他窗口还是有反应
luoyz520 2013-10-15
  • 打赏
  • 举报
回复
如果你的菜单不是那么复杂的话,比如没有其它控件,那么菜单项的文字和背景可以用画上去的形式,这样菜单这个窗口没有其它控件的话,弹出窗口就SetCapture,点左键或者右键,判断点击的区域是不是在菜单上面,不是的话就ReleaseCapture并销毁菜单。 我也刚做了一个类似的,如果菜单上还有其它控件的话,暂时没想到好的方法。
白衣的逆袭 2013-10-15
  • 打赏
  • 举报
回复
我觉得菜单还是用CMenu类比较好吧,CWnd弹出的窗口要麻烦一些吧
hurryboylqs 2013-10-15
  • 打赏
  • 举报
回复
点击位置下得窗口无动作,我的菜单是隐藏了
Eleven 2013-10-15
  • 打赏
  • 举报
回复
你的意思是当菜单弹出以后,点击窗口中其它地方,点击位置下得窗口无动作还是你的菜单没有隐藏/销毁?

15,978

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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