windows的任务管理器暗中破坏菜单窗口的规则其实并不复杂
- 如果一个窗口被破坏,在窗口的菜单也被摧毁:
- menu bar获取方法 (
GetMenu
/SetMenu
) - the system menu获取方法 (
GetSystemMenu
)
- menu bar获取方法 (
- 如果菜单被销毁,其子也被摧毁.
-
如果你更换一个MIIM_SUBMENU子菜单,菜单是摧毁旧的.
- 如果你传递bRevert = TRUE给GetSystemMenu获得的菜单句柄 ,那么旧的系统菜单被破坏,重新一个干净的系统菜单,在它的位置创建。
上述情况以外,通过调用 DestroyMenu
就摧毁窗口,随便你自己编程设定。
原来的问题,本来是有误解:
如果旧的对象属于一个窗口类,我们摧毁了旧的对象,我们怎么知道,同一类的其他窗口都不会惹上麻烦?
有些人以为这里是每个窗口的类都是同样的菜单 ,但如果是这样的话, 一个程序就创建了两个相同的类窗口, 一个窗口的菜单的修改会影响其他类。所以不可能是这样的。在Windows 95,打开两个浏览器窗口,并设置成不同的视图。这两个窗口现在有不同的菜单:其中一人有一个弹出旁边的大图标菜单项,然而其他有菜单项弹出 “详细信息”。
当你注册这个窗口类的时候,你要传你设计菜单。但是你要根据下面的模板做:
WNDCLASS wc;
...
wc.lpszMenuName = MAKEINTRESOURCE(...);
当前还没有菜单,到你想要一个菜单的时候,只需说明如何创建一个菜单。当你创建一个这个类的窗口,窗口管理器通过执行初始化等效的菜单
SetMenu(hwnd, LoadMenu(pWndClass->hInstance,
pWndClass->lpszMenuName));
系统菜单以同样的方式 :每个窗口开始了一个默认的系统菜单,当你调用GetSystemMenu 设置bRevert = FALSE,你就会得到一个到该系统菜单句柄
你可以修改你想要的内容 ,而不会影响任何其他菜单。系统菜单有不足的地方,你可以通过传递bRevert
= true来询问窗口管理器破坏当前的系统菜单,或者换一个新的默认的系统菜单。
原文链接、:http://blogs.msdn.com/b/oldnewthing/archive/2010/05/27/10016004.aspx