同一个程序在两台机器上运行,一台正常另一台界面发生错乱,通过咨询同事发现原来是发生错乱的那台机器更改Window缺省DPI。
在网上搜索了一下资料,原来产生界面混乱的主要原因是,winform程序的坐标是基于点(Point)的,而Point又与DPI相关,具体就是
一英寸 =72Points
一英寸 = 96pixels 96DPI是windows的默认DPI,当它被用户更改后,可能就会导致界面与设计之初产生了错乱。
知道了原来就好办了,办法一,将windows设置改回缺省设置,办法二,改程序,继续问度娘...
网上有人说将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本身的特性。
注:在实际应用中,我发现部分第三方控件不支持AutoScaleMode = Font这种模式,就只能设置成AutoScaleMode = Dpi了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统