高dpi下,Vb.net調整控制元件位置的小經驗

boy8199發表於2024-03-12

高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

相關文章