高dpi下,Vb.net调整控件位置的小经验

 高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

 

posted on 2024-03-12 19:59  boy8199  阅读(28)  评论(0编辑  收藏  举报