【问题标题】:Why does Window geometry change when migrating from VS2010 to VS2017?为什么从 VS2010 迁移到 VS2017 时 Window 几何形状会发生变化?
【发布时间】:2018-01-06 13:52:06
【问题描述】:

我有一个大型 Win API C++ 应用程序,我最近从 Visual Studio 2010 迁移到 2017。应用程序现在可以编译、链接和运行,但我发现窗口边框比以前大了大约 2 个像素。

这是一个问题,因为我们很久以前使用 100% 自己的代码实现了停靠窗口。尽管使用 GetSystemMetrics 等从操作系统中检索所有尺寸,但事实证明这需要一些更具体的对齐。在开发(针对 Windows 2000)和稍后针对 Windows 7 重新定位时,花费了很多开发时间。此外,我们有一些小窗口,较厚的框架只会浪费空间。

所以我安装了 Windows SDK 7.1 并且经过一些调整后能够安装它。但我无法在项目设置中选择 7.1。在项目设置中键入会导致

错误 MSB8036:未找到 Windows SDK 7.1 版。

虽然我找到了一个名为:

C:\Program Files\Microsoft SDKs\Windows\v7.1

此外,当尝试重新定位项目时,SDK 7.1 未列出。 我做了很多谷歌搜索,发现 thisthat 但没有实质性的答案。 msdn 太可怕了。

问题(已过时,见下文):

  • 是否可以将 VC 2017 与 Windows 7 SDK 一起使用?如何?
  • 是否有其他方法可以让几何图形与 VC2010 一起使用?

编辑: 我不认为这是 Dialog border different after porting code from Visual Studio 6 to Visual Studio 2013 的副本,尽管该链接很有帮助。事实证明,GetSystemMetrics(SM_CYFRAME) 返回了不同的值。到目前为止,我还没有看到对此的实质性解释。请看我自己的答案和cmets。

让我更新问题: 为什么从VC2010升级到VC2017时GetSystemMetrics(SM_CYFRAME)返回的值会发生变化?

根本原因是什么?

【问题讨论】:

  • 只需重新定位您的项目以使用 Visual Studio 附带的 Windows 10 SDK。请注意,它仍然允许您为 Windows 7 构建应用程序。
  • 几何问题可能是由于您的代码或系统更改中的一些错误引起的,而不是错误的 SDK 版本。请注意,应用程序(通常)仍将执行相同的 API 调用,而不管用于构建它的 SDK。
  • 是否可以将 VC 2017 与 Windows 7 SDK 一起使用? - 当然可以。 如何? - 只需设置此 sdk 的 include 和 lib 路径
  • 这不是 dpiaware 的问题吗?
  • GetSystemMetrics 返回的指标和相关函数不是基于 SDK 的,它们是基于系统设置的。框架边框厚度或标题高度等内容可能因系统而异。您实际上应该在测试系统上将它们调整为不同的值,以查看您的应用程序是否可以正确处理几何变化。

标签: c++ visual-studio winapi visual-studio-2017


【解决方案1】:

是否可以将 VC 2017 与 Windows 7 SDK 一起使用?怎么样?

是的,但我怀疑这是解决您主要问题的方法。

是否有其他方法可以保持与 VC2010 一起使用的几何图形?

是的,只需将最低子系统版本更改为 Vista 之前的值,例如 5.01(适用于 Windows XP 32 位)。出于某种原因,5.1 也会产生相同的结果;生成的 EXE 将是相同的。

当 Win32 子系统版本为 6.0 或更高版本时,窗口边框大小会发生行为变化。 虽然我不知道 Microsoft 在哪里对此进行了记录。

如果你还在使用 Windows 7,那么在使用 Windows Basic 主题时差异也很明显,如下图所示:

RED SOFT ADAIR 添加的截图:

【讨论】:

  • Windows XP 的子系统版本是 5.01,而不是 5.1。
  • 非常感谢您的回答。我发现这可以在 Visual Studio 的链接器选项中的“最低要求版本”字段中进行设置。如果您不介意,我在您的答案中添加了屏幕截图。
【解决方案2】:

原来问题是这里描述的: https://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/eaae1445-264d-487f-aba1-52dfc8abdfe4/getsystemmetrics-difference-in-return-value-for-the-same-input?forum=windowssdk

GetSystemMetrics(SM_CXFRAME) 返回的值在 VS 2013 中发生了变化。

In VS2010 (Window 8.1) 
GetSystemMetrics(SM_CXFRAME); // 8 pixels 
In VS2013 (Window 8.1, same PC) 
GetSystemMetrics(SM_CYFRAME); // 4 pixels

在 VC2013 及更高版本中,将使用返回相同的结果

GetSystemMetrics(SM_CXFRAME) + GetSystemMetrics(SM_CXPADDEDBORDER);

我的窗户仍然具有相同的框架尺寸。我错过了解释根本原因。

我仍然不明白这是怎么发生的。据我了解,GetSystemMetrics 是 Windows 操作系统的一项功能。更改编译器时,此函数的行为有何不同?我猜这是 Windows SDK 的一部分?

顺便说一句,我发现我可以选择“Windows 7.1”作为平台工具集,但不能选择 SDK(正如我所想的那样)。

这一切都令人困惑。谁能指出SDK和Toolset之间的区别和联系?

编辑: 我做了一个小示例程序来证明这一点:

#include <windows.h>
#include <stdio.h>

int main(int argc, char *argv)
{
    printf("GetSystemMetrics(SM_CXFRAME) returns: %d\n", GetSystemMetrics(SM_CXFRAME));
    return 0;
}

用 VC2010 编译结果为“8”。

使用 VC2017 编译结果为“4”。

即使我在迁移到 VC2017 时为 SDK 选择“不升级”。 如果您不相信,请自行尝试。

如果您对此有更多见解 - 不客气。我给你500分赏金!

【讨论】:

  • 根据用于创作和编译源代码的 IDE,系统调用非常不太可能返回不同的值。我相当有信心,这是一个不同的问题。
  • 在这种情况下,“VCxxx”到底是什么? GetSystemMetrics 的结果不能依赖于此。但它可能取决于 - 您的应用程序是否支持 dpi
  • VC 代表 Visual Studio
  • @IInspectable。确实如此。查看我的更新答案 - 感谢所有贡献者!
  • 它不会是编译器。可能是清单之类的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-08
  • 2021-06-12
  • 2020-01-13
相关资源
最近更新 更多