计算缩放/滚动画布的视口矩形

时间:2011-12-06 20:56:11

标签: c# .net gdi viewport

我有一个显示画布图像的自定义控件。我正在使用AutoScroll和缩放比率来显示图像。

因此,我必须使用的数据是:

  • 缩放比例(2.0f = 200%缩放)
  • Canvas bounds(RectangleF)。 800x600px的图像的CanvasBounds为1600x1200,缩放比例为2.0f。如果缩小而不是滚动,则“位置”点是画布的起点。
  • ClientRectangle
  • AutoScrollPosition

我需要在任何给定时间计算视口,以相对于原始位图的坐标给出。因此,如果整个图像是可见的,并且图像是800x600,则视口将是0,0的矩形,大小为800,600。

我放大了图像,视口应该始终是代表整个可见区域的矩形。如果我缩小并且图像在屏幕上居中,那么视口应该是整个图像。


编辑:这是一个图形表示。位图当前已缩放,但我有原始大小和缩放比例。我有AutoScrollPosition。 AutoScrollMinSize根据缩放级别设置。如果图像高度为500px且我们处于200%(2.0f)缩放,则AutoScrollMinSize.Height为1000。

红色框表示视口矩形。

enter image description here

1 个答案:

答案 0 :(得分:0)

我明白了。这是我为我工作的代码。

在此解决方案中,AutoScrollMinSize等于CanvasBounds.Size。首先,我检查窗口是否大于画布,在这种情况下,我知道整个位图是可见的,并将其作为视口返回。否则,我通过将屏幕像素转换为位图像素来计算它。

public RectangleF Viewport
{
    get
    {
        if (AutoScrollMinSize.Width <= ClientRectangle.Width && AutoScrollMinSize.Height < ClientRectangle.Height)
        {
            return BitmapRectF;
        }
        else
        {
            return new RectangleF(
                Math.Abs(AutoScrollPosition.X / _ratio),
                Math.Abs(AutoScrollPosition.Y / _ratio),
                Math.Min(CanvasBounds.Width / _ratio, ClientRectangle.Width / _ratio),
                Math.Min(CanvasBounds.Height / _ratio, ClientRectangle.Height / _ratio)
            );
        }
    }
}