c#Winform窗體實際運行大小與size屬性設置不一致問題解決

問題:
將Winform窗體設計程序從臺式電腦拷貝到筆記本電腦後,剛開始運行,界面可以顯示完全,但後來出現界面顯示不完全問題,發現Winform窗體實際運行大小(QQ截圖)與size屬性設置不一致。
嘗試一:
認爲是誤設置了窗體的某個屬性,故與原來臺式電腦上Winform窗體屬性對比
結果:發現沒有區別,未找到問題所在
嘗試二:
嘗試通過窗體屬性設置如AutoSize、AutoScaleMode使窗體顯示完全。
發現設置AutoScaleMode時,Font和Dpi效果一樣,None和Inherit會使窗體控件間距變大,顯示更加不完全,一般設置AutoScaleMode=Font或Dpi;設置AutoSize爲True時,窗體實際運行大小(QQ截圖)與size屬性設置不一致,但窗體寬方向上顯示完全,高方向上狀態欄statusStrip被壓在panel控件下面無法顯示,將狀態欄statusStrip放到panel控件中則可以顯示完全(貌似把所有控件都放到一個panel中可以避免顯示不完全的現象?不懂)
結果:發現將AutoSize屬性設置爲true,並把狀態欄statusStrip(甚至所有控件都)放到一個panel中可以使界面顯示完全,但Winform窗體實際運行大小(QQ截圖)與size屬性設置不一致。
嘗試三:通過在Form_Load()中設置size更改窗體初始大小。(AutoSize=false;AutoScaleMode=Font)

            //size屬性設置爲1628*1062(界面恰好顯示完全);實際顯示1286*748(界面顯示不完全)
            Rectangle ScreenArea = System.Windows.Forms.Screen.GetWorkingArea(this);//GetWorkingArea()檢索顯示器的工作區(工作區是顯示器的桌面區域,不包括邊界、標題欄、任務欄、停靠窗口和停靠工具欄)
            int mywidth = this.Width; //Winform窗體寬度---872 
            int myheight = this.Height; //Winform窗體高度---506
            mywidth = ScreenArea.Width; //工作區寬度(不包括邊界,標題欄,任務欄,工具欄等) ---1280
            myheight = ScreenArea.Height; //工作區高度(不包括邊界,標題欄,任務欄,工具欄等) ---680
            this.Size = new Size(mywidth, myheight);

結果:
1、窗體初始加載位置不在屏幕中央,整體偏右下
2、寬邊的控件所在區域均在屏幕中,有一部分空白不在屏幕中,
在這裏插入圖片描述
高邊的狀態欄不在屏幕中。很奇怪
嘗試三:
修改Windows顯示設置中“縮放與佈局”-“更改文本、應用等項目大小”:由150%改爲100%(AutoSize=false;AutoScaleMode=Font)
在這裏插入圖片描述
結果:整個電腦字體、圖標變小。窗體可以完全正常顯示。
接着,將“更改文本、應用等項目大小”由100%恢復爲150%,仍然有和原來一樣的問題。
嘗試四:
修改AutoScaleMode屬性爲Dpi;Windows顯示設置中“縮放與佈局”-“更改文本、應用等項目大小”:由150%改爲100%(AutoSize=false;AutoScaleMode=Dpi)
結果:同嘗試三
接着,將“更改文本、應用等項目大小”由100%恢復爲150%,仍然有和原來一樣的問題。

接着,將vs關掉重啓,窗體可以完全正常顯示。神奇。。。

總結:通過在網絡上查找有關分辨率、Windows縮放與佈局的資料,終於發現原因在於:
VS在縮放與佈局設置爲非100%的時候,就會自動啓動DPI感知模式,以防止VS界面模糊,這將導致高DPI下(非100%縮放與佈局)設計的winform程序當拿到不同的縮放條件下運行時就會遇到界面變形或不一致的問題。
解決方法一:
在做程序的時候必須使用100%縮放,,否則在其他機器上容易出問題的。如果100%會讓字小的沒有辦法使用電腦,則需調整降低你自己電腦的分辨率,使其在100%縮放的情況下看得清。只有在100%縮放做好程序之後,再考慮不同DPI情況下 顯示不正常如何調整。參考19樓
解決方法二:
禁用VS的高DPI感知模式。
具體禁用方式如下
1、手動在註冊表中添加項(未嘗試成功)
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Image File Execution Options\devenv.exe]
“dpiAwareness”=dword:00000000

2、Bat一鍵處理(新建文本文件.txt 改後綴爲 bat,將下面代碼粘貼到文本文件裏保存,雙擊執行即可)
reg add"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT
\CurrentVersion\Image File Execution Options\devenv.exe" /v “dpiAwareness” /t REG_DWORD /d “0”
參考:解決VS在高DPI下設計出的Winform程序界面變形問題

最終,猜測出現原因是:
我的筆記本電腦的“更改文本、應用等項目大小”(DPI)爲150%,我在此環境下不小心手動修改了窗體的size,導致窗體變爲了在高DPI環境下設計的窗體,啓動了VS的DPI感知模式,使得界面變形,顯示不完全。
解決方法:(AutoSize=false;AutoScaleMode=Dpi)
1、關閉VS
2、將筆記本電腦的“更改文本、應用等項目大小”(DPI)爲100%
3、重新打開VS,嘗試修改Winform窗體的size並《啓動》(這樣C#部分纔會生成解決方案)運行窗體,完成後,關閉VS
4、將筆記本電腦的“更改文本、應用等項目大小”(DPI)爲150%
5、重新打開VS,直接《啓動》運行窗體(千萬不要修改Winform窗體的size)
發現窗體顯示大小與size一致。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章