【问题标题】:Panning a drawing from a panel in C#从 C# 中的面板平移绘图
【发布时间】:2015-08-25 18:14:31
【问题描述】:

我有一个绘图应用程序,我使用Graphic 对象来绘制一个矩形、圆形和一些线条。该应用程序具有缩放功能,但我试图让平移工作但找不到最佳解决方案。

public partial class Form1 : Form
{
    protected Point clickPosition;
    protected Point scrollPosition;
    protected Point lastPosition;
    public Form1()
    {
        InitializeComponent();
        SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true);
        AutoScroll = true;
        AutoScrollMinSize = new Size(0, 0);
    }
    float zoom = 100f;
    private void panel1_Paint(object sender, PaintEventArgs e)
    {

        Graphics g = e.Graphics;
        g.ScaleTransform(zoom, zoom);
        g.SmoothingMode = SmoothingMode.AntiAlias;

        // some demo drawing:
        Rectangle rect = panel1.ClientRectangle;
        g.DrawEllipse(Pens.Firebrick, rect);
        using (Pen pen = new Pen(Color.DarkBlue, 4f)) 
            g.DrawLine(pen, 22, 22, 88, 88);
    }

    private void trackBar1_Scroll(object sender, EventArgs e)
    {
        zoom = trackBar1.Value / 10f;
        panel1.Invalidate();
    }

    protected override void OnMouseDown(MouseEventArgs e)
    {
        clickPosition.X = e.X;
        clickPosition.Y = e.Y;
    }

    protected override void OnMouseUp(MouseEventArgs e)
    {
        Cursor = Cursors.Default;
        lastPosition.X = AutoScrollPosition.X;
        lastPosition.Y = AutoScrollPosition.Y;
    }

    protected override void OnMouseMove(MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            Cursor = Cursors.Hand;
            scrollPosition.X = clickPosition.X - e.X - lastPosition.X;
            scrollPosition.Y = clickPosition.Y - e.Y - lastPosition.Y;
            AutoScrollPosition = scrollPosition;
            panel1.Invalidate();
        }
    }

    private void Viewer_MouseDown(object sender, MouseEventArgs e)
    {
        OnMouseDown(e);
    }

    private void Viewer_MouseMove(object sender, MouseEventArgs e)
    {
        OnMouseMove(e);
    }

    private void Viewer_MouseUp(object sender, MouseEventArgs e)
    {
        OnMouseUp(e);
    }
}

这是我到目前为止所拥有的,缺少两件事的代码是使用AutoScrollMinSize 更新最小尺寸和AutoScrollPosition 获取最新位置,问题是两者都可以与DrawImage 和@987654326 一起使用@ 而且我不确定在我的情况下如何让它与线条图和圆圈一起使用。也出于某种原因,我的AutoScrollPosition 对于xy 始终为0。 任何想法,或者是否有其他方法来创建平移效果

【问题讨论】:

    标签: c# winforms zooming pan


    【解决方案1】:

    平移可以使用与缩放相同的技巧:平移用于绘图的Graphics对象!

    只需在您的应用程序中添加一个(或垂直平移两个)数字,例如 offSetX and offsetY。您可以使用TrackbarNumericUpDown 或任何其他方式来控制它..

    现在添加这一行 translates(平移)Graphics 对象绘制的所有内容,之前 ScaleTransform

    g.TranslateTransform(offSetX , offSetY);
    

    这会将所有像素向右或向左向上或向下移动这么多像素..

    请注意,这包括 Graphics 对象绘制的所有内容,包括它绘制的所有图像。

    但是如果你有一个BackgroundImage,这不会移动。要移动它们,你应该使用两个 Panels:一个panelFrame和一个更大的AutoSize panelCanvas 嵌套在框架面板中,并通过使用滚动条在其中移动..

    【讨论】:

      猜你喜欢
      • 2015-11-19
      • 2011-07-27
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 2019-05-03
      • 2011-12-01
      相关资源
      最近更新 更多