WinForms不同的DPI布局

时间:2009-12-05 02:28:18

标签: c# .net winforms dpi font-size

以某种方式通过Visual Studio创建的表单和控件,设计器具有很强的自我扩展能力,具体取决于Windows的当前DPI /字体大小。我的UI的一部分是一个标签控件,其中包含动态页面和标签/输入,具体取决于用户的选择。创建这些时,它们使用的硬编码大小看起来适合96 DPI。

.Net中是否有自动方式来获取这些生成的控件并执行与设计器生成的控件相同的调整大小?我想避免自己扩展控件,因为这是旧代码不易维护。

3 个答案:

答案 0 :(得分:9)

嗯,通过迭代标签页的控件集合并将点和大小属性乘以缩放因子,技术上很容易。但是,一旦你开始考虑Dock和Anchor属性,这就变得非常棘手。

到目前为止,最简单的方法是让Form类缩放机器为您完成工作。在 Load事件运行之前,您需要将控件添加到选项卡页面。在构造函数中执行此操作。

快速提示以避免切换DPI设置以测试代码的痛苦:将其添加到表单构造函数以调用重新缩放逻辑:

protected override void OnLoad(EventArgs e) {
    this.Font = new Font(this.Font.FontFamily, this.Font.Size * 120 / 96);
    base.OnLoad(e);
}

答案 1 :(得分:0)

您是否尝试过AutoScaleMode属性?

答案 2 :(得分:0)

通过执行designer.cs所做的事情,我解决了同样的问题,在运行时根据需要创建了控件:

void CreateRuntimePanel()
{
    //instantiate controls here...

    //suspend layouts
    //begin inits

    this.SuspendLayout();

    //set control properties here

    //before adding any control to form's Controls collection, do this
    this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
    this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;

    //add controls to form's Controls collection here

    //resume layouts
    //end inits

    this.ResumeLayout(false);  
}