从C#中的面板平移绘图

时间:2015-08-25 18:14:32

标签: c# winforms zoom pan

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

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来获取最新位置,问题是两者都可以用{{ 1}}和DrawImage我在我的案例中不确定如何使用线条图和圆圈。出于某种原因,我的Images始终为0 AutoScrollPositionx。 任何想法,还是有另一种方法来创建泛效果

1 个答案:

答案 0 :(得分:2)

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

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

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

g.TranslateTransform(offSetX , offSetY);

这将向右或向左,向上或向下移动所有像素的所有内容。

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

但如果你有BackgroundImage,这不会移动..要移动它们,你应该使用两个 PanelspanelFrame { {1}}和更大的AutoSize在框架面板中嵌套,并使用滚动条在其中移动..