【问题标题】:How to create Modern Menus in Win Api?如何在 Win Api 中创建现代菜单?
【发布时间】:2011-07-03 10:17:57
【问题描述】:

现代菜单我指的是使用 MFCWindows Forms(MenuStrips) 制作的菜单。我知道这是可能的,因为我已经看到一些使用它的应用程序是在 Windows Api 中开发的。 Win32++ 库 中也有此功能,MFC 和 WinForms 只是 Win Api 包装器,因此如果它们包含现代菜单,Win Api 也必须包含它们。但我的问题是... 如何直接在 Windows Api 中制作菜单条? 它是否包含在 CommonControls 中?还是我必须自己实施?如果是,那怎么办?需要示例代码,但不是必需的。

菜单有点像这样

【问题讨论】:

  • Windows API 不是 C 或 C++ 特定的。
  • @DeadMG 我知道。我只是使用标签bec。我认为 C/C++ 人可能比使用其他高级语言的人更了解 WInAPi。
  • 所以您找到了一个可以生成您想要的菜单类型的应用程序?尝试在 EXE 上使用 Dependency Walker 来查看它使用了哪些 DLL 以及它依赖于那些 DLL 中的哪些函数。这应该为您提供有关如何创建菜单的重要线索。 dependencywalker.com
  • 它们早在 2001 年就很现代。它们今天看起来非常过时。
  • @David,如果你去年一整年都在使用 gtk+ 和 winapi 等低级 gui 库并使用 内联汇编

标签: winforms winapi mfc


【解决方案1】:

MFC 和 Winforms 使用非常相似的方法来实现这些自定义菜单。他们从 ToolBar/ToolStrip 类中的通用支持开始,并将它们专门用于菜单栏/项目类。

您可以在 vc/atlmfc/src/mfc 中找到 MFC 实现。 afxtoolbarxxx.cpp 源代码文件大约有 24,000 行 C++ 代码。菜单类特化在 afxmenuxxx.cpp 中,另外几千行源代码。

您可以从参考源中获取 Winform 类的源代码。 ToolStripxxx.cs 源代码文件大约有 40,000 行 C# 代码。菜单类特化在 Menuxxx.cs 中,另外还有几千行源代码。

两者都使用了各自框架中提供的大量支持类,如窗口包装和图像/文本渲染支持等基本内容。很难猜出他们抽了多少。

这样的数字大约超出了大多数程序员认为可以重写自己的数量级。您当然可以通过削减功能做得更好,MFC 和 Winforms 实现都有很多花里胡哨。 Winforms 更是如此,这是它拥有如此多源代码的根本原因。然而,添加这种功能支持的目的是提供一个您可以使用而不是尝试替换的类库。推荐。

【讨论】:

    【解决方案2】:

    MFC 和 WinForms 只是 Win Api 包装器,因此如果它们包含现代菜单,Win Api 也必须包含它们

    这不是真的。基本菜单处理代码存在于 Win32 代码库(基本上是 user32.dll)中,这使您能够创建、绘制和处理消息以使菜单工作,但它们是非常基本的菜单(只是纯文本)。 MFC 像其他人一样通过调用 Win32 函数和处理消息来工作,但它使用自定义绘图例程来增加它们的外观。这正是其他所有图书馆的做法。唯一的另一种方法是自己绘制整个菜单(它只是另一个窗口),绘制任何图标,在鼠标移过它时处理突出显示,处理按钮点击等等,这都是浪费时间如果你可以让 Win32 做到这一点。

    因此,如果您想要这样的菜单,您要么必须自己编写代码,要么使用其他人编写的库。就这么简单。

    【讨论】:

    • 您可以通过在行前加上 > 来创建块引用(就像电子邮件引用通常起作用一样)。我已经编辑了您的答案以进行演示。
    • Windows 菜单 API 支持绘制图标。
    • @David,您能否发布一个包含一些教程/参考/文档/任何其他内容的链接?我不知道该怎么做。
    【解决方案3】:

    您可能必须自己实现它,或者使用一些 3rd 方实现。

    见:How can i change the appearance of Windows 7 menus?

    【讨论】:

      【解决方案4】:

      http://www.winprog.org/tutorial/simple_window.html你会找到关于window api编程教程的一切

      【讨论】:

        【解决方案5】:

        您需要一个第三方库,例如 CodeJock's Extreme Toolkit

        如果您负担不起预算,您可能想挖掘Code Project 以获得一些免费源代码。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-12-24
          • 2010-11-06
          • 1970-01-01
          • 1970-01-01
          • 2016-06-29
          • 2012-12-21
          • 2014-07-27
          相关资源
          最近更新 更多