WinForms控件.Scale方法

3
下面的代码展示了一个小型的WinForms应用程序,其中包含一个简单的控件,它绘制了一个圆形。我正在尝试理解Control.Scale方法的行为。
如果我像代码中所示从Main方法中调用Control的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);
    }
}
1个回答

5
Scale() 方法并不是用于此目的的。它是一个帮助方法,用于实现 AutoScaleMode 属性。当您的控件由窗体的 InitializeComponent() 方法创建时,会使用 SuspendLayout() 暂停缩放。这就是为什么在构造函数中它没有任何效果的原因。当窗体句柄创建时,AutoScaleMode 属性值被应用,这会取消您应用的任何缩放。
我认为您在 OnPaint 方法中寻找的是 e.Graphics.ScaleTransform()。它不会缩放控件,而是缩放绘图。如果您真的想要缩放控件,只需更改其 Size 属性即可。

谢谢。这个方法的MS文档(http://msdn.microsoft.com/en-us/library/ms158413.aspx)说:“Scale方法按指定的缩放因子缩放控件。如果ScaleChildren属性为true,则还会递归缩放所有子控件。在内部,此方法调用ScaleControl来缩放每个控件。”没有提到AutoScaleMode。.NET文档的首选位置是哪里?看起来MSDN不是那个地方。 - I. J. Kennedy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接