簡體   English   中英

從VS2010遷移到VS2017時,為什么窗口幾何形狀會發生變化?

[英]Why does Window geometry change when migrating from VS2010 to VS2017?

我有一個大型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。 我做了很多谷歌搜索,發現了這個 但沒有實質性的答案。 msdn太可怕了。

問題(已淘汰,請參閱下文):

  • 可以將VC 2017與Windows 7 SDK一起使用嗎? 怎么樣?
  • 是否有其他方法可以保留VC2010所使用的幾何圖形?

編輯 :我不認為這是對話框邊框的重復,但是從Visual Studio 6到Visual Studio 2013移植代碼后 ,鏈接卻有所不同。 事實證明,為GetSystemMetrics(SM_CYFRAME)返回了不同的值。 到目前為止,我還沒有看到實質性的解釋。 請查看我自己的答案和評論。

因此,讓我更新一下問題 :從VC2010升級到VC2017時,為什么GetSystemMetrics(SM_CYFRAME)返回的值會更改?

根本原因是什么?

可以將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添加: 在此處輸入圖片說明

原來,問題所在如下所述: https : //social.msdn.microsoft.com/Forums/windowsdesktop/en-US/eaae1445-264d-487f-aba1-52dfc8abdfe4/getsystemmetrics-difference-in-return-value -用於最相同的輸入?論壇= windowssdk

VS 2013更改了為GetSystemMetrics(SM_CXFRAME)返回的值。

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點賞金!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM