【问题标题】:ZOOM-IN & ZOOM-OUT 2D graphics C#放大和缩小 2D 图形 C#
【发布时间】:2018-01-12 14:05:04
【问题描述】:

我必须放大和缩小我在 winform 上绘制的 2D 图形的特定部分,例如(线、矩形、圆)。 我没有使用任何图片框,面板。 我创建了简单的程序来绘制圆圈并单击按钮尝试缩放 但它显示错误“参数无效” 在方法 Drawing()@Line-DeviceContext.Transform = mainViewTransform;

public Graphics DeviceContexct;
  public Matrix mainViewTransform = new Matrix();

    private void ScalingCircle_Paint( object sender, PaintEventArgs e )
            {
                Pen myPen = new Pen(Color.Blue, 1); 
                e.Graphics.DrawRectangle(myPen, 50, 50, 100, 100);           
                mainViewTransform.Scale(3, 2);
                DeviceContexct = e.Graphics;
            }
     private void Drawing(Graphics gr)
            {
                Pen myPen2 = new Pen(Color.Red, 1);
                DeviceContexct.Transform = mainViewTransform;
                DeviceContexct.DrawRectangle(myPen2, 50, 50, 100, 100);
            }
       private void button1_Click( object sender, EventArgs e )
            {
                Drawing(DeviceContexct);         

            }

【问题讨论】:

  • 如果您要问如何去做(或获取准备使用的代码),那么这是题外话。如果您编写的代码有特定问题,请在此处包含。
  • 我想要一些提示不是所有现成的代码实际上我没有找到任何合适的解决方案。面板和图片框等基础上有代码。
  • 你是在Paint事件中自己绘制那些对象吗?检查Graphics.ScaleTransform()Graphics.TranslateTransform()方法(比根据平移/缩放数据重新计算顶点要容易得多)

标签: c# .net winforms graphics


【解决方案1】:

我更喜欢使用 System.Drawing.Graphics 对象绘制位图。 然后,您可以使用带有“go.DrawImage(...)”的图形对象将位图直接绘制到您的 winforms 中并实际给它一个比例。

https://msdn.microsoft.com/en-us//library/ms142040(v=vs.110).aspx

【讨论】:

  • 缩放位图肯定会降低质量(重绘不需要的区域会影响性能)
【解决方案2】:

我得到了解决方案,谢谢你的帮助。

我只需要在按钮点击时调用刷新/无效等。

public partial class ScalingCircle : Form
{
    public Graphics DeviceContexct;
    // current transformation matrix of main view (offset & scaling)
    public Matrix mainViewTransform = new Matrix();

    public int scale = 1;

    public ScalingCircle()
    {
        InitializeComponent();
        DeviceContexct = Graphics.FromHwnd(this.Handle);
        DeviceContexct = this.CreateGraphics();
    }

    public void ScalingCircle_Paint(object sender, PaintEventArgs e)
    {
        DeviceContexct = e.Graphics;
        DeviceContexct.PageUnit = GraphicsUnit.Pixel;
        DeviceContexct.Transform = mainViewTransform;
        ScalingCircle1(scale);
    }

    private void ScalingCircle1(int x )
    {
        Pen myPen2 = new Pen(Color.Black, 1);
        DeviceContexct.Transform = mainViewTransform;

        Rectangle myRectangle = new Rectangle(50, 50, 100 * x, 100 * x);
        DeviceContexct.FillRectangle(new SolidBrush(Color.BurlyWood), myRectangle);
    }

    private void ScalingCircle_Load( object sender, EventArgs e )
    {
        this.ResizeRedraw = true;
      }

    private void button1_Click( object sender, EventArgs e )
    {
        scale += 5;
        this.Refresh();
    }

    private void button2_Click( object sender, EventArgs e )
    {
        if (scale > 1)
        {
            scale -= 5;
            this.Refresh();
        }
    }
}

【讨论】:

  • 不,这种方法有许多严重的缺点(即使您的任务与我们在这里看到的完全一样)。如果您愿意,请随时在 Code Review 上发布此代码。
  • 是的,您可以查看代码。 &如果有什么建议可以给我。 @Adriano Repetti
  • 我的意思是,你可以把它发到codereview.stackexchange.com。我不知道会审核它,但您可能会得到一些有用的反馈。如果你不会忘记包含完整的源代码(没有设计器生成的东西......)和应用程序应该做什么的描述。
【解决方案3】:

您可以为此使用转换。用于绘画的图形对象具有 System.Drawing.Drawing2D.Matrix 类型的 Transformation 属性。 Graphics 也有 ScaleTransform 方法。

我自己没用过,不过microsofts Chart就是这么干的。

https://msdn.microsoft.com/de-de/library/system.drawing.drawing2d.matrix(v=vs.110).aspx https://msdn.microsoft.com/de-de/library/system.drawing.graphics.scaletransform(v=vs.110).aspx

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-20
    • 1970-01-01
    • 1970-01-01
    • 2019-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多