带有缩放和平移功能的 Windows 窗体的 PictureBox

Posted

技术标签:

【中文标题】带有缩放和平移功能的 Windows 窗体的 PictureBox【英文标题】:Windows Forms' PictureBox with zooming and panning 【发布时间】:2011-02-06 04:12:45 【问题描述】:

我的应用程序需要控制显示位图 (jpg),还需要缩放和平移它们(因此,如果您按下鼠标按钮,您可以在框架内“移动”缩放的图片)

我所做的是将面板放在窗体上,然后在面板内放置图片框(锚定顶部,左侧)。 所以如果我需要缩放它,我只是从缩放按钮事件中执行下面的代码:

    private void ZommInOut(bool zoom) 
        int zoomRatio   = 10; // percent
        int widthZoom   = pBox.Width * zoomRatio /100;
        int heightZoom  = pBox.Height  * zoomRatio /100;

        if (zoom) 
            widthZoom   *= -1;
            heightZoom  *= -1;
        

        pBox.Width  += widthZoom;
        pBox.Height += heightZoom;
    

效果不错。图像被缩放,面板显示滚动条 - 所以我有简单的平移功能。

我缺少的是可以使用鼠标进行平移 - 我想向任何方向拖动图片以查看图片的其他部分(例如 Acrobat Reader)。 我一直在寻找使用 MouseMove 事件并以编程方式更改滚动条的方法,但我无法做到。

有什么建议吗?

【问题讨论】:

【参考方案1】:

您需要在 MouseMove 事件中设置AutoScrollPosition 属性。

您需要跟踪 MouseDown 事件的位置并使用偏移量更新 AutoScrollPosition。

【讨论】:

您为此推荐了谁的 MouseMove 事件?表单还是面板? @Maciej 我认为您没有将鼠标移到表单上。你的 MouseMove 最终会被 PictureBox 捕获。 对不起,我弄错了 - 我想问一下 PictureBox 面板(不是表格)。但你是对的,PB是正确的地方。谢谢【参考方案2】:

我建议使用 Graphics.DrawImage 创建一个控件并绘制图像的一部分 - 通过这种方式,您可以控制图像的缩放方式(三线性等),并且还可以使用更少的内存。您可以覆盖 OnMouseMove 以获取鼠标移动

【讨论】:

你可能是对的。但我一直在寻找快速且无代码的东西。提到的解决方案对我有用。

以上是关于带有缩放和平移功能的 Windows 窗体的 PictureBox的主要内容,如果未能解决你的问题,请参考以下文章

缩放和平移仅适用于第一次尝试使用 Windows Phone 的手势监听器

在Windows Phone 8上平滑缩放和平移

从鼠标位置缩放和翻译图像

Android自定义控件之可平移、缩放、旋转图片控件

如何在闪亮应用程序的平移和缩放功能中添加控件?

Android 位图平移/缩放/裁剪