在 C# 中从面板平移绘图

Panning a drawing from a panel in C#

我有一个绘图应用程序,我使用 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 获取最新位置,问题是两者都可以使用DrawImageImages 我不确定在我的情况下如何让它与线条图和圆圈一起工作。同样出于某种原因,我的 AutoScrollPosition 对于 xy 始终为 0。 任何想法,或者是否有其他方法来创建平移效果

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

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

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

g.TranslateTransform(offSetX , offSetY);

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

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

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