如何在Win Api中创建现代菜单?

时间:2011-07-03 10:17:57

标签: winforms winapi mfc

通过现代菜单我指的是使用 MFC Windows窗体(MenuStrips)制作的菜单。我知道有可能因为我看到一些使用它的应用程序是在Windows Api中开发的。它也在 Win32 ++库中完成,而MFC和WinForms只是Win Api包装器,所以如果它们包含现代菜单,Win Api也必须包含它们。但我的问题是...... 如何直接在Windows Api中制作menustrip?它是否包含在 CommonControls 中?或者我必须自己实施吗?如果是这样呢?需要示例代码,但不是必需的。

菜单有点像这样

enter image description here

5 个答案:

答案 0 :(得分:2)

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

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

您可以从Reference source获取Winform类的源代码。 ToolStripxxx.cs源代码文件大约有40,000行C#代码。菜单类专业化在Menuxxx.cs中,是另外几千个源代码行。

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

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

答案 1 :(得分:1)

  

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

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

因此,如果您希望菜单看起来像这样,您必须自己编写代码,或使用其他人编码的库。就这么简单。

答案 2 :(得分:0)

您可能必须自己实施,或使用第三方实施。

请参阅:How can i change the appearance of Windows 7 menus?

答案 3 :(得分:0)

转到http://www.winprog.org/tutorial/simple_window.html,您将找到有关window api编程教程的所有内容

答案 4 :(得分:0)

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

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