c# - 如何使用鼠标位置放大该图像

标签 c#

我有一个userControl库,它由主面板和一个PictureBox组成,我想制作一个可缩放的PictureBox工具,我使用主面板的mouseWheel事件进行放大和缩小,我无法解决这个问题如何通过鼠标在图像上的位置进行放大,因此每当我放大时,缩放都会出现在面板的左上角,那么我该如何解决这个问题?

private double ZOOMFACTOR = 1.15;   // = 15% smaller or larger
private int MINMAX = 5;
void picPanel_MouseWheel(object sender, MouseEventArgs e)
    {
        if (e.Delta > 0)
        {
            ZoomIn();
        }
        else
        {
            ZoomOut();
        }
    }

    private void ZoomIn()
    {
        if ((picBox.Width < (MINMAX * this.Width)) &&
            (picBox.Height < (MINMAX * this.Height)))
        {
            picBox.Width = Convert.ToInt32(picBox.Width * ZOOMFACTOR);
            picBox.Height = Convert.ToInt32(picBox.Height * ZOOMFACTOR);
        }
    } 
    private void picBox_MouseEnter(object sender, EventArgs e)
    {
        if (picBox.Focused) return;
        picBox.Focus();
    }

更新:

我已经尝试过了,它看起来可以工作,但不完全是它应该的样子!有什么想法吗?

    private void ZoomIn()
    {
        if ((picBox.Width < (MINMAX * this.Width)) &&
            (picBox.Height < (MINMAX * this.Height)))
        {
            picBox.Width = Convert.ToInt32(picBox.Width * ZOOMFACTOR);
            picBox.Height = Convert.ToInt32(picBox.Height * ZOOMFACTOR);

            Point p = this.AutoScrollPosition;
            int deltaX = e.X - p.X;
            int deltaY = e.Y - p.Y;
            this.AutoScrollPosition = new Point(deltaX, deltaY);
        }
    } 

最佳答案

这是在鼠标位置缩放图像的示例.... 经测试验证。

protected override void OnMouseWheel(MouseEventArgs ea)
{
    //  flag = 1;
    // Override OnMouseWheel event, for zooming in/out with the scroll wheel
    if (picmap1.Image != null)
    {
        // If the mouse wheel is moved forward (Zoom in)
        if (ea.Delta > 0)
        {
            // Check if the pictureBox dimensions are in range (15 is the minimum and maximum zoom level)
            if ((picmap1.Width < (15 * this.Width)) && (picmap1.Height < (15 * this.Height)))
            {
                // Change the size of the picturebox, multiply it by the ZOOMFACTOR
                picmap1.Width = (int)(picmap1.Width * 1.25);
                picmap1.Height = (int)(picmap1.Height * 1.25);

                // Formula to move the picturebox, to zoom in the point selected by the mouse cursor
                picmap1.Top = (int)(ea.Y - 1.25 * (ea.Y - picmap1.Top));
                picmap1.Left = (int)(ea.X - 1.25 * (ea.X - picmap1.Left));
            }
        }
        else
        {
            // Check if the pictureBox dimensions are in range (15 is the minimum and maximum zoom level)
            if ((picmap1.Width > (imagemappan.Width)) && (picmap1.Height > (imagemappan.Height)))
            {
                // Change the size of the picturebox, divide it by the ZOOMFACTOR
                picmap1.Width = (int)(picmap1.Width / 1.25);
                picmap1.Height = (int)(picmap1.Height / 1.25);

                // Formula to move the picturebox, to zoom in the point selected by the mouse cursor
                picmap1.Top = (int)(ea.Y - 0.80 * (ea.Y - picmap1.Top));
                picmap1.Left = (int)(ea.X - 0.80 * (ea.X - picmap1.Left));
            }
        }
    }
}

关于c# - 如何使用鼠标位置放大该图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10694397/

相关文章:

c# - 查看状态不保留值

c# - 在 C# 中重写 Paint 控件

c# - 使用循环初始化多个对象

c# - SQL 和 C# 从数据库检索单个记录

c# - 获取当前列名

c# - 为什么 Regex.Replace 给我最后一组奇怪的结果

c# - 删除动态定时器

c# - 如果 e.Cancel = true,我应该在何时何地调用 base.OnClosing(e)?

c# - 如何使用套接字欺骗 IP 地址?

c# - CsvHelper 忽略不工作