MessageBox 在 C++ 中有两种不同的样式? (Windows)

MessageBox has 2 different styles in C++? (Windows)

不久前,我发现标准 Windows 消息框有 2 个不同的 styles/looks。有趣的是,即使消息框具有完全相同的 program/code,您也可能会得到样式 1 或样式 2。

你可以清楚地看到,样式上有一些差异,但是它们背后的代码是完全一样的:

#include <Windows.h>

// inside DllMain
MessageBoxA(0, "MessageBoxA", "Message Box Style ...", MB_ICONINFORMATION);

您肯定想知道我是如何用相同的代码得到两个不同的 results/styles 的?我制作了一个非常基本的 DLL,它在进程中 loaded/injected 之后立即显示一个消息框。在大多数情况下,如果您在控制台应用程序中加载 DLL,您将看到样式 1。另一方面,如果您在 GUI 应用程序中加载 DLL(使用 window),您可能会看到样式 2。

我想问你为什么会这样,为什么会有两种不同的风格?是否可以始终强制消息框采用指定样式?我个人更喜欢样式 2,因为它看起来更现代,所以我希望我的消息框始终采用样式 2,但是如何?

第一种风格是兼容 Windows 95-2000 之前的新 XP“luna”主题。没有清单(嵌入在 EXE 或外部文件中)Win32 API 将使用旧样式。这是为了与旧程序兼容,这些程序可能会使用旧的 3D 样式呈现自己的控件。恕我直言,旧的 3D 风格更好。您可以看到按钮何时被按下等。顺便说一句,首先 Windows (v1.0, 2.0) 使用类似于“新”平面样式,因为大多数显示器都是低分辨率的单色并且不可能绘制 3D 阴影。

https://docs.microsoft.com/en-us/windows/win32/controls/cookbook-overview

它们是不同的 commctrl 版本,但截至 2022 年,没有必要不使用更新的样式,现在没有人会以旧系统为目标。

将其放入 cpp:

#if defined _WIN64
#pragma comment(linker, "/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#else
#pragma comment(linker, "/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
#endif

然后你就得到了新的样式。