什么时候任务管理器摧毁菜单,什么时候手动摧毁菜单

 

windows的任务管理器暗中破坏菜单窗口的规则其实并不复杂

  • 如果一个窗口被破坏,在窗口的菜单也被摧毁:
    •  menu bar获取方法 (Get­Menu /Set­Menu )
    •  the system menu获取方法 (Get­System­Menu )
  • 如果菜单被销毁,其子也被摧毁.
  • 如果你更换一个MIIM_SUBMENU子菜单,菜单是摧毁旧的
    .
  • 如果你传递bRevert = TRUE给GetSystemMenu获得的菜单句柄 ,那么旧的系统菜单被破坏,重新一个干净的系统菜单,在它的位置创建。

  上述情况以外,通过调用 Destroy­Menu   就摧毁窗口,随便你自己编程设定。

 

原来的问题,本来是有误解:

         如果旧的对象属于一个窗口类,我们摧毁了旧的对象,我们怎么知道,同一类的其他窗口都不会惹上麻烦?

 

 

有些人以为这里是每个窗口的类都是同样的菜单 ,但如果是这样的话, 一个程序就创建了两个相同的类窗口 一个窗口的菜单的修改会影响其他类。所以不可能是这样的。在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

你可能感兴趣的:(编程,windows,浏览器,System,任务,menu)