Duilib菜单,如果鼠标没有经过菜单,鼠标点击其他地方,菜单不会关闭

simple 2021-04-22 05:41:44
如题,增加了duilib菜单,菜单显示后,如果鼠标没有到菜单上面去,点击其他地方的时候,菜单不会关闭;
但菜单显示后,鼠标经过菜单(没有其他操作),点击其他地方,菜单关闭;
菜单关闭是CMenuWnd接收了WM_LBUTTONDOWN消息,如果操作者不是自己,则关闭菜单;
以上问题跟踪后发现,如果鼠标经过了菜单,则会收到WM_LBUTTONDOWN消息,否则不会有WM_LBUTTONDOWN消息,实在不知道原因,求各位大侠指教;
...全文
1556 点赞 收藏 9
写回复
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
simple 05-24
研究了在非主屏幕显示菜单的问题,主要是在计算菜单的时候,计算菜单位置(主菜单、子菜单)的获取屏幕信息就行了。

	MONITORINFO oMonitor = {}; 
	oMonitor.cbSize = sizeof(oMonitor);
	//::GetMonitorInfo(::MonitorFromWindow(*this, MONITOR_DEFAULTTOPRIMARY), &oMonitor);
	::GetMonitorInfo(::MonitorFromPoint(pt, MONITOR_DEFAULTTONEAREST), &oMonitor);
	CDuiRect rcWork = oMonitor.rcWork;
注意,pt是菜单的坐标,在前面就已经计算出来了,接下来就是计算菜单宽高和菜单具体的位置了。
回复
调试下代码看就知道了,不知道你用的是那个版本的duilib,分支挺多的,多屏显示器的话要获取显示器信息EnumDisplayMonitors可以枚举,GetMonitorInfo可以获取到对应信息
回复
simple 04-23
顺便问一下,在分屏显示菜单如何判断,因为坐标都是使用主屏计算的,导致在分屏要显示菜单的时候,菜单总是在主屏显示,这个还没有去研究,看有没有方向。
回复
simple 04-23
引用 2 楼 mmcanyu 的回复:
还有一个,失去焦点关闭菜单。
昨天下班的时候想到了KillFocus,但发现会导致无法弹出子菜单; 回去的时候想是否可以做点处理,今天早上试了一下果然可以,判断如果不是操作的不是菜单则关闭,现在可以了。 SetForegroundWindow在调整菜单宽高的时候就用了,但结果是一样的。但还是谢谢了。
回复
simple 04-23
引用 6 楼 mmcanyu 的回复:
话说你怎么还在研究duilib的菜单
用的是其自带的menu,都是在xml里面写好的,而我是动态创建的,改了不少。。
回复
simple 04-23
引用 5 楼 hurryboylqs 的回复:
调试下代码看就知道了,不知道你用的是那个版本的duilib,分支挺多的,多屏显示器的话要获取显示器信息EnumDisplayMonitors可以枚举,GetMonitorInfo可以获取到对应信息
弄完其他再来弄这个
回复
mmcanyu 04-23
话说你怎么还在研究duilib的菜单
回复
mmcanyu 04-22
还有一个,失去焦点关闭菜单。
回复
zgl7903 04-22
试试弹出菜单前先调用 SetForegroundWindow
回复
发动态
发帖子
界面
创建于2007-09-28

1.5w+

社区成员

VC/MFC 界面
申请成为版主
社区公告
暂无公告