首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AutoScaleMode.Font和动态添加的控件

AutoScaleMode.Font和动态添加的控件
EN

Stack Overflow用户
提问于 2010-02-20 03:21:05
回答 2查看 4.1K关注 0票数 2

我在应用程序中使用窗体字体大小正确缩放控件时遇到了一些问题。问题是窗体会动态添加控件来响应用户操作。在最初设置字体大小时,窗体上的任何控件都可以完美缩放,但后来添加的控件会出现问题。它们的字体可以正常缩放,但是它们的位置和大小不能正常缩放。要查看这一点,请使用一个空窗体创建一个简单的项目,并粘贴以下代码:

代码语言:javascript
复制
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        SplitContainer split = new SplitContainer();
        split.Dock = DockStyle.Fill;
        this.Controls.Add(split);

        // Group 1
        split.Panel1.Controls.Add(NewGroup());

        this.Font = new Font(this.Font.FontFamily, this.Font.Size * 2);

        // Group 2
        split.Panel2.Controls.Add(NewGroup());

        split.SplitterDistance = this.Width / 2;
    }

    public GroupBox NewGroup()
    {
        GroupBox groupBox = new GroupBox();
        groupBox.Size = new System.Drawing.Size(132, 92);
        groupBox.Text = "groupBox";
        groupBox.SuspendLayout();

        Label label = new Label();
        label.AutoSize = true;
        label.Location = new Point(6, 16);
        label.Text = "label";
        groupBox.Controls.Add(label);

        Button button = new Button();
        button.Location = new Point(6, 58);
        button.Size = new Size(93, 28);
        button.Text = "button";
        groupBox.Controls.Add(button);

        CheckBox checkBox = new CheckBox();
        checkBox.AutoSize = true;
        checkBox.Location = new Point(47, 16);
        checkBox.Text = "checkBox";
        groupBox.Controls.Add(checkBox);

        TextBox textBox = new TextBox();
        textBox.Location = new Point(6, 34);
        textBox.Size = new Size(120, 20);
        textBox.Text = "text";
        groupBox.Controls.Add(textBox);

        groupBox.ResumeLayout();

        return groupBox;
    }
}

您可以在添加的第二个分组框中看到我所说的效果。如何才能在初始大小更改后添加控件以正确缩放?

更新

如果我将第二个NewGroup调用改为如下所示:

代码语言:javascript
复制
        GroupBox group = NewGroup();
        split.Panel2.Controls.Add(group);
        group.Scale(new SizeF(2.0f, 2.0f));

结果几乎是正确的。在许多情况下,它往往会偏离一两个像素,并且在复杂的形式中,这开始变得更加明显。我真的需要在控件之间保持尽可能一致的缩放,所以我想避免这种方法。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-26 20:53:03

问题是,必须在窗体上放置所有控件之后才能调用AutoScaleMode=AutoScaleMode.Font。在设置AutoScaleMode之后放置的所有控件都将从自动缩放中忽略。通常,设计者将自动缩放模式的设置放在InitializeComponents()-Method中,因此在InitializeComponents()-Method之后创建的每个控件都属于忽略类别。只需从InitializeComponents()-Method中删除该行,并将其替换为表单构造函数的末尾。

(即使这个问题很老,答案也可能会对其他人有所帮助)

票数 9
EN

Stack Overflow用户

发布于 2013-10-30 22:06:20

我认为你应该这样做-使用Graphics.DpiX和Graphics.DpiY来获得当前的dpi,然后将它除以你的默认dpi (通常是96),并将动态添加的控件的位置和大小值相乘,这些值在这个比率下看起来不正确。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2298958

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档