65.9K
CodeProject 正在变化。 阅读更多。
Home

可缩放和可滚动图片框

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.75/5 (13投票s)

2008年5月31日

CPOL

1分钟阅读

viewsIcon

156368

downloadIcon

12339

一个ImagePanel组件,用于替换PictureBox。

引言

在Windows Forms世界中,一个常见的问题是“如何缩放和滚动PictureBox?” 答案是使用ImagePanel,它使您可以轻松地缩放和平移图像。

我使用Microsoft Visual C# 2005 Express Edition来构建它。它简单易用。您可以启动一个新项目并添加一个用户控件。在设计窗口中,将垂直滚动条和水平滚动条拖动到用户控件中,然后转到代码窗口并添加源代码文件ImagePanel.cs中的代码。就是这样,一个可缩放和可滚动的PictureBox替换已经构建完成,您可以立即使用它。

缩放是通过Matrix对象完成的

Matrix mx=new Matrix(); // create an identity matrix
mx.Scale(zoom,zoom); // zoom image

平移是通过滚动条返回的值完成的。我们告诉滚动条图像的大小,即实际大小乘以缩放因子

if ((canvasSize.Width * zoom - viewRectWidth) > 0)
{
    this.hScrollBar1.Maximum =(int)( canvasSize.Width * zoom) - viewRectWidth;
}
if ((canvasSize.Height * zoom - viewRectHeight) > 0)
{
    this.vScrollBar1.Maximum = (int)(canvasSize.Height * zoom) - viewRectHeight;
}

因此,在实际图像中的正确位置是滚动条值除以缩放因子

Point pt=new Point((int)(hScrollBar1.Value/zoom),(int)(vScrollBar1.Value/zoom));

为了将图像显示在此控件的中心,再次使用了Matrix对象

mx.Translate(viewRectWidth/2.0f,viewRectHeight/2.0f, MatrixOrder.Append);

此组件具有一个很好的特性:在图像缩小期间,仅绘制图像的一部分。这可以节省大量的计算机资源

if (canvasSize.Width * zoom < viewRectWidth && 
            canvasSize.Height * zoom < viewRectHeight)
    srcRect = new Rectangle(0, 0, canvasSize.Width, canvasSize.Height);
    // view all image
else srcRect = new Rectangle(pt, new Size((int)(viewRectWidth / zoom), 
                            (int)(viewRectHeight / zoom)));
// view a portion of image

为了测试这个小而强大的控件,我把它放在一个表单上,并添加了一个滑块来提供缩放因子。双击ImagePanel加载图片。试试看,怎么样?

谢谢。

© . All rights reserved.