c# winform程序.在控制面板中调整了DPI设置显示异常

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c# winform程序.在控制面板中调整了DPI设置显示异常相关的知识,希望对你有一定的参考价值。

更改了DPI设置后,文字放大.原先的窗体控件布局就乱套了.怎么才能解决这一问题?

问题分析:

         产生界面混乱的主要原因是,winform程序的坐标是基于点(Point)的,而Point又与DPI相关,具体就是

         一英寸 =72Points

一英寸 =  96pixels96DPI是windows的默认DPI,当它被用户更改后,可能就会导致界面与设计之初产生了错乱。

       在网上搜索相关资料后,试着将this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi 但是经实测后,发现仍然没有解决问题:有些界面甚至显示不全;有些控件甚至会被“截断”或完全不显示。

       原因是:默认情况下winfrom的Font单位是Point,最终显示在界面上的尺寸将根据DPI设置自动变化,可以表示为公式: Point / 72 * DPI = Pixel 按照MSDN的解释,上述设置比较适合关心程序的可视区域及控件文字在不同的DPI下总是显示设计时的大小,而不用关心程序界面的绝对大小的情况。

解决办法:

        后来想到web程序中的常用单位是像素(pixel),在不同的机器上也能很好地呈现网页布局。在winform程序中使用像素来定位即可解决。

        在winform中实现该计量单位,仅需要在Form的的构造函数中作如下设置即可:

[csharp] view plain copy
    private void InitializeComponent()                            //设定按字体来缩放控件              this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;              //设定字体大小为12px                   this.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Pixel, ((byte)(134)));    

        这样设置之后,在不同的DPI下,界面将整体缩放而不会凌乱,利用的就是DPI本身的特性。

参考技术A 在窗体加载的时候,在初始化里面加这句!!
private void InitializeComponent()

this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
//设定字体大小为12px
this.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Pixel, ((byte)(134)));
本回答被提问者采纳

C# WINFORM 控制调整大小和加载问题

【中文标题】C# WINFORM 控制调整大小和加载问题【英文标题】:C# WINFORM ,CONTROLS RESIZING AND LOADING PROBLEM 【发布时间】:2021-12-09 16:26:15 【问题描述】:

我已经构建了一个新应用程序,其中包含一些基本控件,例如功能区作为父级,其他页面作为子级 但正如您在 GIF 中看到的那样,我正面临 Forms 缓慢加载和调整大小的问题。 每次我打开这个表单时,它的控件都会调整 3 到 4 倍。 请问有什么解决办法?????? :( .

【问题讨论】:

您应该提供有关表单初始化/加载的更多信息 我仍然没有在编码中做任何事情。它的设计问题。但是没有开始编码。 你能在按钮的点击事件上写this.DoubleBuffered = true;吗(在功能区上),或者可能在用户控件的页面加载上? 【参考方案1】:

我得到了解决方案。

每次我点击时,父表单都会生成一个新表单,而前一个表单仍然存在并且没有关闭,因此一次打开了这么多相同的表单。

我试试这个解决方案,

    private void btnCompanysetup_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
    
        Form frm = new frmCompanySetup();

        if (Application.OpenForms.OfType<frmCompanySetup>().Count() == 1) 


            frm.BringToFront();
        
        
        if (Application.OpenForms.OfType<frmCompanySetup>().Count() == 0)
        


            frm.MdiParent = this;
            frm.Show();

        
          

         
    

感谢所有这些回复。

【讨论】:

以上是关于c# winform程序.在控制面板中调整了DPI设置显示异常的主要内容,如果未能解决你的问题,请参考以下文章

C# WinForm中截获Console输出

C#界面里的winform AutoScaleMode属性

C#界面里的winform AutoScaleMode属性

在winforms c#中自动调整项目/控件的大小显示错误

C# winform 程序自动适应显示器分辨率

在 WinForms c# 面板上绘制矩阵[x,y]