WinForms Control.Scale方法

I. *_*edy 3 controls winforms

下面的代码显示了一个小型WinForms应用程序,其中包含一个绘制圆圈的简单控件.我试图了解该Control.Scale方法的行为.

如果我在Control from Main上调用Scale方法,如代码所示,它会正确缩放.但是,如果我改为从Circle的构造函数调用Scale,则不会发生缩放.

我在这里的困惑无疑表明我对Scale应该做什么有很大的误解.任何人都可以开导我吗?

using System;
using System.Windows.Forms;
using System.Drawing;

class Program
{
    [STAThread]
    public static void Main()
    {
        var circle = new Circle(Color.Orange)
        {
            Size = new Size(23, 23),
            Location = new Point(50, 50)
        };
        circle.Scale(new SizeF(3.0f, 3.0f));      //  <-- scaling here works

        var form = new Form();
        form.Controls.Add(circle);

        Application.Run(form);
    }
}

class Circle : Control
{
    public Circle(Color color)
    {
        ForeColor = color;
        // Scale(new SizeF(3.0f, 3.0f));     //  <-- scaling here DOESN'T work
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        e.Graphics.FillEllipse(new SolidBrush(ForeColor), ClientRectangle);
    }
}
Run Code Online (Sandbox Code Playgroud)

Han*_*ant 5

Scale()方法并不意味着这样做.它是实现AutoScaleMode属性的辅助方法.当您的控件由窗体的InitializeComponent()方法创建时,使用SuspendLayout()暂停缩放.这就是为什么它对你的构造函数没有影响.创建表单句柄时应用AutoScaleMode属性值.这会取消您应用的任何缩放.

我认为你在OnPaint方法中寻找e.Graphics.ScaleTransform().它不会缩放控件,它会缩放绘图.如果您确实想要扩展控件,那么只需更改其Size属性即可.