为什么从VS2010迁移到VS2017时窗口几何会发生变化?

时间:2018-01-06 13:52:07

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

我有一个大型的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太可怕了。

问题(obsolet,见下文):

  • 是否可以将VC 2017与Windows 7 SDK一起使用?怎么样?
  • 是否有可能采用不同的方法来保持VC2010使用的几何图形?

修改: 我不认为这是Dialog border different after porting code from Visual Studio 6 to Visual Studio 2013的重复,尽管链接非常有用。事实证明,GetSystemMetrics(SM_CYFRAME)返回了不同的值。到目前为止,我没有看到实质性的解释。请看我自己的答案和评论。

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

根本原因是什么?

2 个答案:

答案 0 :(得分:2)

  

是否可以在Windows 7 SDK中使用VC 2017?怎么样?

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

  

是否有可能采用不同的方法来保持VC2010使用的几何图形?

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

当Win32子系统版本为6.0或更高版本时,窗口边框大小会有行为更改。虽然我不知道Microsoft已经记录了这一点。

Prove that Subsystem version matters

如果您仍然使用Windows 7,则在使用Windows Basic主题时差异也很明显,如此屏幕截图所示:

Diff subsystem diff border

由RED SOFT ADAIR添加的屏幕截图: enter image description here

答案 1 :(得分:1)

原来问题是这里描述的: 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进行编译会产生&#34; 8&#34;。

使用VC2017进行编译会导致&#34; 4&#34;。

即使我选择&#34;也不要升级&#34;迁移到VC2017时的SDK。 如果你不相信 - 试试自己。

如果您对此有任何更多见解 - 欢迎您。我给你500点赏金!