回 帖 发 新 帖 刷新版面

主题:如何定位多个弹出式菜单

这个问题是我看Charles Petzold《windows程序设计》10-9 POPPAD2.C所发现:

当窗口消息处理程序收到WM_INITMENUPOPUP消息后,书中靠LOWORD(lParam)值(弹出式菜单索引)来定位。但我测试发现:如果顶层菜单中又嵌套了弹出式菜单,这种方法就不行了。(书中程序或像记事本这种无嵌套的可以)

我想可以用GetMenu 、GetMenuItemInfo遂一得到弹出式菜单句柄并保存起来,当收到WM_INITMENUPOPUP消息后,用wParam(弹出式菜弹句柄)来和先前保存的菜单句柄比较以确定使用者是点击了哪一个弹出式菜单。

不知还有没有其它方法?[em1]

回复列表 (共3个回复)

沙发

这个我提出来再说一下楼主的漏洞:句柄是临时的内核对象,不可以保存。

板凳

[quote]句柄是临时的内核对象,不可以保存[/quote]
错,菜单句柄在菜单的生命周期内都是可以保存的.

回楼主:

没有.

3 楼

首先如果是你创建的当然可以,因为是编程人员赋予它生命期。但是,句柄没有一个确切的文档大家也知道的,至少在MSDN和微软的书籍中是没有的,所以它属于微软的内部实现。如果windows内核中对某一个资源更改了,这个更改是不会在微软的文档里显示的。如果是系统为我们创建的资源或者是其它,它的内部实现是对编程人员不可见的,就比如说HDC,很快就可以测试到HDC的更改。再比如说HMENU以前还是GDI的一部分而现在不是。在创建一个程序的时候,我们应该使用ID而不是句柄来标识一个资源或者是其它在程序中指定的东西。
[quote][quote]句柄是临时的内核对象,不可以保存[/quote]
错,菜单句柄在菜单的生命周期内都是可以保存的.

回楼主:

没有.[/quote]

我来回复

您尚未登录,请登录后再回复。点此登录或注册