高dpi下,Vb.net調整控制元件位置的小經驗 boy8199/3vdo/club
最近寫了一個捕快TXT網文采集軟體,結果發現在DPI不同的情況下,軟體佈局會變形. 找了半天原因才發現是DPI的問題,預設系統的dpi是96(100%)
現在顯示器的螢幕比較大,所以好多人會把 顯示放大到125%或150% 導致程式控制元件變形.
解決方案1\禁止軟體跟隨系統的dpi變化, \
(1)這是摘抄了一個方法.不一定對
<application xmlns="urn:schemas-microsoft-com:asm.v3"> <windowsSettings> <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings/">true</dpiAware> </windowsSettings> </application>
(2)禁用方法: autosalemode=none 關閉各個控制元件的自動尺寸模式
2\ 就是 讓軟體跟隨dpi自動變化, 把 autosalemode= 設定為DPI, 讓控制元件跟隨dpi進行自動調整. 因為該屬性預設是根據font變化的,所以會變形.
但是即使設定了autosalemode=dpi ,依然有不少控制元件會變化, 這裡好像有一個bug,有時控制元件會變形 有時不會變形,沒有規律.
經過對比實驗發現, 要使用 talelayoutpanel來進行控制元件佈局,這樣能讓大多數控制元件自我進行調整.
個別不能自我調整的控制元件(比如靠右鎖定的控制元件),我用下面的程式碼進行了調整.
1 ''' <summary> 2 ''' ' 根據DPI 調整個別控制元件的位置和大小 3 ''' </summary> 4 ''' <param name="DefaultDPI">預設dip設定為96</param> 5 Private Sub AdjustControlsForDpiChange(Optional DefaultDPI As Single = 96.0!) 6 ' 獲取當前窗體的 DPI 7 Dim currentDpiX As Single = Me.CreateGraphics().DpiX 8 Dim currentDpiY As Single = Me.CreateGraphics().DpiY 9 10 If currentDpiX <> DefaultDPI OrElse currentDpiY <> DefaultDPI Then 11 12 ' 計算縮放比例 13 Dim scaleX As Single = currentDpiX / DefaultDPI 14 Dim scaleY As Single = currentDpiY / DefaultDPI 15 16 pnlKaiCaiMianBan.Width = CInt(pnlKaiCaiMianBan.Width * scaleX) 17 pnlKaiCaiMianBan.Left = Me.Width - pnlKaiCaiMianBan.Width
end sub