我有一个大型的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。 我做了很多谷歌搜索,发现this和that,但没有实质性答案。 msdn太可怕了。
问题(obsolet,见下文):
修改:
我不认为这是Dialog border different after porting code from Visual Studio 6 to Visual Studio 2013的重复,尽管链接非常有用。事实证明,GetSystemMetrics(SM_CYFRAME)
返回了不同的值。到目前为止,我没有看到实质性的解释。请看我自己的答案和评论。
所以让我更新问题:
从VC2010升级到VC2017时,为什么从GetSystemMetrics(SM_CYFRAME)
返回的值会发生变化?
根本原因是什么?
答案 0 :(得分:2)
是否可以在Windows 7 SDK中使用VC 2017?怎么样?
是的,但我怀疑这是解决您的主要问题的方法。
是否有可能采用不同的方法来保持VC2010使用的几何图形?
是的,只需将最小子系统版本更改为Vista之前的值,例如5.01(适用于Windows XP 32位)。出于某种原因,5.1也会产生相同的结果;得到的EXE将是相同的。
当Win32子系统版本为6.0或更高版本时,窗口边框大小会有行为更改。虽然我不知道Microsoft已经记录了这一点。
如果您仍然使用Windows 7,则在使用Windows Basic主题时差异也很明显,如此屏幕截图所示:
答案 1 :(得分:1)
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点赏金!