如何在picturebox中缩放某一点

5
这是我的代码。
我能够缩放picturebox,但不能在一个点上进行缩放。 如何在旋转鼠标滚轮时缩放到鼠标点?
变量为:
private double m_dZoomscale = 1.0;    //THIS IS THE ZOOM SCALE TO WHICH EACH OBJECT 
                                      //ARE ZOOMED IN THE CANVAS  

public static double s_dScrollValue = .01;
                                      //scale factor value for mouse scroll zooming

油漆代码为:-
private void m_Picturebox_Canvas_Paint(object sender, PaintEventArgs e)
{
   Graphics g = e.Graphics;
   g.ScaleTransform((float)m_dZoomscale, (float)m_dZoomscale);
}

主要代码如下:-
    protected override void OnMouseWheel(MouseEventArgs mea)
    {
        m_Picturebox_Canvas.Focus();
        if (m_Picturebox_Canvas.Focused == true)
        {
            if (mea.Delta > 0)
            {
                ZoomInScroll();
            }
            else if (mea.Delta < 0)
            {
                ZoomOutScroll();
            }
        }
    }

子函数如下:-
    //FUNCTION FOR MOUSE SCROL ZOOM-IN
    private void ZoomInScroll()
    {
        m_dZoomscale = m_dZoomscale + s_dScrollValue;
        m_Picturebox_Canvas.Invalidate();
    }

    //FUNCTION FOR MOUSE SCROL ZOOM-IN
    private void ZoomOutScroll()
    {
        m_dZoomscale = m_dZoomscale - s_dScrollValue;
        m_Picturebox_Canvas.Invalidate();
    }
1个回答

5
以下是实现此功能的方法(代码下面有描述): 变量
// this tracks the transformation applied to the PictureBox's Graphics
private Matrix transform = new Matrix();      
public static double s_dScrollValue = 1.01; // zoom factor

绘图代码

private void m_Picturebox_Canvas_Paint(object sender, PaintEventArgs e)
{
   Graphics g = e.Graphics;
   g.Transform = transform;
}

滚动事件代码

protected override void OnMouseWheel(MouseEventArgs mea)
{
    m_Picturebox_Canvas.Focus();
    if (m_Picturebox_Canvas.Focused == true && mea.Delta != 0)
    {
        ZoomScroll(mea.Location, mea.Delta > 0);
    }
}

缩放功能

//FUNCTION FOR MOUSE SCROL ZOOM-IN
private void ZoomScroll(Point location, bool zoomIn)
{
    // make zoom-point (cursor location) our origin
    transform.Translate(-location.X, -location.Y);

    // perform zoom (at origin)
    if(zoomIn)
        transform.Scale(s_dScrollValue, s_dScrollValue);
    else
        transform.Scale(1 / s_dScrollValue, 1 / s_dScrollValue);

    // translate origin back to cursor
    transform.Translate(location.X, location.Y);

    m_Picturebox_Canvas.Invalidate();
}
描述 首先,如您所见,我将您的两种缩放方法合并为一种方法:ZoomScroll,否则我们会重复很多逻辑...
那么这里做了什么呢?我想很清楚,我们需要对Graphics对象应用平移。我们在一个Matrix字段中“累积”应用于PictureBox的所有变换。
你成功地缩放了你的图像,但始终以PictureBox的原点(左上角)作为你的缩放操作的逻辑中心 - 这就是Scale/ScaleTransform的工作方式!因此,为了在不同的点进行比例缩放,需要以下步骤:
  • 平移世界,使您想要缩放的点成为新的原点(例如,您的光标在12 | 34处,因此我们通过-12 | -34进行平移)
  • 现在,因为我们的新原点是所需的位置,所以进行缩放
  • 将世界平移到原来的位置,使原始点再次出现在光标下面

绝对正确,感谢指出,应该修补。 - olydis
你能否提供一个完整的可运行代码示例?很难找到一个可行的解决方案。 - suchislife

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接