高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

 

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。