【问题标题】:C#: Why does this not zoom using the mouse as center?C#:为什么不以鼠标为中心进行缩放?
【发布时间】:2011-05-15 16:53:18
【问题描述】:

我正在尝试制作一个可以缩放和平移的画布。平移工作,但在鼠标位置缩放将不起作用。

编辑:这几乎可行。然而,缩放的中心略有偏移......

这是缩放的代码:

  public partial class Form1 : Form
    {

        PointF mouseDown;

        float newX;
        float newY;
        float zoomFactor = 1.0F;



        public Form1()
        {
            InitializeComponent();

            mouseDown = new PointF(0F, 0F);

            this.panel1.Paint += new PaintEventHandler(panel1_Paint);
            this.panel1.MouseDown += new System.Windows.Forms.MouseEventHandler(panel1_MouseDown);
            this.panel1.MouseMove += new System.Windows.Forms.MouseEventHandler(panel1_MouseMove);

        }

        private void panel1_Paint(object sender, PaintEventArgs e)
        {

            base.OnPaint(e);

            Graphics dc = e.Graphics;

            dc.SmoothingMode = SmoothingMode.AntiAlias;

            dc.TranslateTransform(newX, newY);
            dc.ScaleTransform(zoomFactor, zoomFactor);

            Color lineColor = Color.FromArgb(200, 200, 200);
            Pen linePen = new Pen(lineColor,1*zoomFactor);

            dc.DrawLine(linePen, 100, 100, 200, 200);

            textBox1.Text = newX.ToString();
            textBox2.Text = newY.ToString();
        }



        private void panel1_MouseDown(object sender, EventArgs e)
        {
            MouseEventArgs mouse = e as MouseEventArgs;

            if (mouse.Button == MouseButtons.Right)
            {
                mouseDown = mouse.Location;

                mouseDown.X = mouseDown.X - newX;
                mouseDown.Y = mouseDown.Y - newY;

            }

        }

        private void panel1_MouseMove(object sender, EventArgs e)
        {
            MouseEventArgs mouse = e as MouseEventArgs;

            if (mouse.Button == MouseButtons.Right)
            {
                Point mousePosNow = mouse.Location;

                float deltaX = mousePosNow.X - mouseDown.X;
                float deltaY = mousePosNow.Y - mouseDown.Y;

                newX = deltaX;
                newY = deltaY;

                panel1.Invalidate();

            }
        }

        protected override void OnMouseWheel(MouseEventArgs e)
        {

            MouseEventArgs mouse = e as MouseEventArgs;

            if (e.Delta > 0)
            {
                if (zoomFactor + 0.2 < 10)
                {
                    zoomFactor += 0.2F;
                }
            }

            else if (e.Delta < 0)
            {
                if (zoomFactor - 0.2 > 0.2)
                {
                    zoomFactor -= 0.2F;
                }
            }

            float x = (mouse.Location.X - newX) * zoomFactor;
            float y = (mouse.Location.Y - newY) * zoomFactor;

            newX = mouse.Location.X - x;
            newY = mouse.Location.Y - y;

            panel1.Invalidate();

        }
    }

【问题讨论】:

    标签: c# mouse zooming paint


    【解决方案1】:

    我终于想通了,所以这是解决方案。

    public partial class Form1 : Form
    {
    
        PointF mouseDown;
    
        float newX;
        float newY;
        float zoomFactor = 1.0F;
    
    
        public Form1()
        {
            InitializeComponent();
    
            mouseDown = new PointF(0F, 0F);
    
            this.panel1.Paint += new PaintEventHandler(panel1_Paint);
            this.panel1.MouseDown += new System.Windows.Forms.MouseEventHandler(panel1_MouseDown);
            this.panel1.MouseMove += new System.Windows.Forms.MouseEventHandler(panel1_MouseMove);
    
        }
    
        private void panel1_Paint(object sender, PaintEventArgs e)
        {
    
            base.OnPaint(e);
    
            Graphics dc = e.Graphics;
    
            dc.SmoothingMode = SmoothingMode.AntiAlias;
    
            dc.TranslateTransform(newX, newY);
    
            dc.ScaleTransform(zoomFactor, zoomFactor, MatrixOrder.Prepend);
    
            Color lineColor = Color.FromArgb(200, 200, 200);
            Pen linePen = new Pen(lineColor,1*zoomFactor);
    
            dc.DrawLine(linePen, 100, 100, 200, 100);
            dc.DrawLine(linePen, 200, 100, 200, 200);
            dc.DrawLine(linePen, 200, 200, 100, 200);
            dc.DrawLine(linePen, 100, 200, 100, 100);
            dc.DrawLine(linePen, 100, 100, 200, 200);
            dc.DrawLine(linePen, 200, 100, 100, 200);
    
        }
    
        private void panel1_MouseDown(object sender, EventArgs e)
        {
            MouseEventArgs mouse = e as MouseEventArgs;
    
            if (mouse.Button == MouseButtons.Right)
            {
                mouseDown = mouse.Location;
    
                mouseDown.X = mouseDown.X - newX;
                mouseDown.Y = mouseDown.Y - newY;
    
            }
    
        }
    
        private void panel1_MouseMove(object sender, EventArgs e)
        {
            MouseEventArgs mouse = e as MouseEventArgs;
    
            if (mouse.Button == MouseButtons.Right)
            {
                PointF mousePosNow = mouse.Location;
    
                float deltaX = mousePosNow.X - mouseDown.X;
                float deltaY = mousePosNow.Y - mouseDown.Y;
    
                newX = deltaX;
                newY = deltaY;
    
                panel1.Invalidate();
    
            }
    
    
        }
    
        protected override void OnMouseWheel(MouseEventArgs e)
        {
    
            MouseEventArgs mouse = e as MouseEventArgs;
    
            PointF mP = mouse.Location;
    
            if (e.Delta > 0)
            {
                if (zoomFactor >= 1 && zoomFactor <= 10)
                {
                    zoomFactor += 1F;
    
                    newX = newX - ((mP.X - newX) / (zoomFactor - 1));
                    newY = newY - ((mP.Y - newY) / (zoomFactor - 1));
                }
                else if (zoomFactor == 0.5)
                {
                    zoomFactor = zoomFactor * 2;
                    newX = newX - ((mP.X - newX) );
                    newY = newY - ((mP.Y - newY) );
                }
                else if (zoomFactor < 0.5)
                {
                    zoomFactor = zoomFactor * 2;
                    newX = newX - ((mP.X - newX) );
                    newY = newY - ((mP.Y - newY) );
                }
            }
    
            else if (e.Delta < 0)
            {
                if (zoomFactor >2)
                {
                    zoomFactor -= 1F;
                    newX = newX + (((mP.X - newX)) / (zoomFactor+1 ));
                    newY = newY + (((mP.Y - newY)) / (zoomFactor+1));
                }
                else if (zoomFactor == 2) {
                    zoomFactor -= 1F;
    
                    newX = newX + ((mP.X - newX)/2);
                    newY = newY + ((mP.Y - newY)/2);
                }else if(zoomFactor <= 1 && zoomFactor > 0.2)
                {
                    zoomFactor = zoomFactor / 2;
    
                    newX = newX + ((mP.X - newX) / 2);
                    newY = newY + ((mP.Y - newY) / 2);
    
                }
    
    
            }
    
            panel1.Invalidate();
    
        }
    }
    

    【讨论】:

    • 我很确定这仍然不对。您需要使用 OLD 缩放系数将鼠标所在的屏幕坐标转换为图片坐标,然后使用 NEW 缩放系数找到新的可见左角。
    • @Ben - 我在这里工作。我使用图形对象的变换来变换图形。面板是静态的,与表单窗口大致重合。
    【解决方案2】:

    也许您的 MousePosition 与 PanelPosition 不同?我的意思是 on 是相对于控件而一个相对于屏幕?

    Control.PointToScreen是你的朋友!

    【讨论】:

    • 嗯...这对我没有任何好处,除了我发现了另一个小错误。我的面板相对于表单控件而不是面板在表单和鼠标滚轮轨道的 y 方向上偏移了 30 像素。
    猜你喜欢
    • 2022-01-21
    • 2015-07-12
    • 1970-01-01
    • 2016-11-10
    • 2019-04-07
    • 1970-01-01
    • 2014-12-01
    • 1970-01-01
    • 2011-12-09
    相关资源
    最近更新 更多