Windows上的Mac风格菜单,系统范围

时间:2010-03-05 11:56:42

标签: windows user-interface winapi desktop

我是Mac用户和Windows用户(曾经有一段时间我曾是Amiga用户)。我更喜欢Mac(和Amiga)采用(/采用)的屏幕菜单栏,我想为Windows编写可以提供此功能的东西(和工作)与现有的应用程序)。

我知道这有点野心勃勃,特别是因为它只是一个痒痒的项目,并且由于家庭成长,我几乎没有空闲时间。几年后我一直看着它并得出结论认为这很困难,但那是在StackOverflow之前;)

我认为我需要做这样的事情才能达到预期的效果:

  • 创建应用程序,该应用程序将成为位于所有其他窗口之上的自定义菜单栏。自定义菜单必须提供替换标准Win32窗口菜单的所有功能。没关系,它只是一个表现得像菜单栏的应用程序。

  • 它会不断枚举窗口以查找正在创建/销毁的窗口。它会枚举子窗口集合以查找菜单栏。

  • 它会构建一个菜单,代表窗口中的菜单选项。

  • 它会隐藏窗口中的菜单栏,并将所有直接子窗口向上移动相应的像素数量。它也会缩短窗户高度。

  • 它会捕获应用程序发送到其菜单的所有消息,以相应地调整自定义菜单。

  • 它会不断轮询当前活动的窗口,因此可以在必要时切换菜单。

  • 当菜单命中时,它会使用真实菜单子控件的hwnd将消息发布到窗口。

就是这样!容易,嗯?不,可能不是。

我非常感谢Win32大师提出的关于从哪里开始,想法,陷阱以及是否有可能的想法的建议。我白天不是Win32 C ++程序员,但我已经完成了一些时间,我不介意通过MSDN平台SDK文档挖掘...

(我还有另一个想法,就是在多显示器设置中为每个屏幕创建一个任务栏并显示桌面的活动窗口 - 但我认为我可以在托管代码中执行此操作并为自己节省大量工作)。

2 个答案:

答案 0 :(得分:3)

顶级Mac菜单和Windows方法之间的真正区别不仅在菜单中: - 菜单如何用于破解打开的MDI应用程序。

在Windows中,MDI应用程序(如开发工作室和办公室)将所有文档窗口托管在应用程序框架窗口中。在Mac上,没有每个应用程序框架窗口,所有文档窗口与其他应用程序中的所有其他文档窗口共享桌面。

缺乏对传统MDI应用程序进行深度返工以将文档窗口移到桌面上的能力,尝试(无论多么高贵)获取桌面菜单似乎注定是一种没有实际用途或实用性的新奇事物

对于Mac和Windows(以及Linux)上的窗口管理器的当前状态,所有事情都被考虑了,相当沮丧:浏览器中标签页面的内容实际上是应用程序开发人员绝望的行为,他们没有得到这样的东西作为标准窗口管理器的一部分 - 这是我认为标签真正属于的地方。为什么notepad ++有一组标签,chrome和firefox,以及Internet Explorer(是的,我已经知道可以运行所有4个),以及开发工作室对接视图,各种绘图程序。

它只是对现代多文档界面应该是什么样的不同解释。

答案 1 :(得分:0)

典型窗口上的菜单栏是窗口的非客户区域的一部分。它是在WndProc获取WM_NCPAINT消息并将其传递给DefWindowProc时绘制的,这是User32.dll的一部分 - 核心窗口管理器代码。

在同一条消息中绘制的其他内容?标题,窗口边框,最小/最大/关闭框。这些都是在处理单个消息时绘制的。因此,为了隐藏应用程序的菜单,您必须接管此消息的处理,这意味着更改 user32.dll的行为。隐藏菜单意味着您负责绘制非客户区域的所有

所有这些元素的外观 - 标题,边框等随着每个主要版本的Windows而变化。所以你也必须追逐它。

这只是一个这个想法中十几个难以逾越的问题。即便是微软也可能无法解决此问题,他们可以访问user32.dll的源代码!

对于屏幕顶部的每个应用程序的回显菜单来说,这将是一项相当困难的工作,即使这是一项几乎不可能完成的工作。当弹出菜单时,会有很多与应用程序的交互,在此期间菜单可以(并且经常)被更改。应用程序在绘制之前更改菜单项的状态是非常。因此,您不仅要复制菜单的外观,还要复制整个消息流与应用程序的交互。

你要做的就是一次完成十几个不可能完成的工作,如果你试一试,你可能会学到很多,但你永远不会让它工作。