【问题标题】:Calculate the viewport rectangle of a zoomed/scrolled canvas计算缩放/滚动画布的视口矩形
【发布时间】:2012-01-14 10:57:24
【问题描述】:

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

因此我必须处理的数据是:

  • 缩放比例(2.0f = 200% 缩放)
  • 画布边界 (RectangleF)。 800x600px 的图像将具有 1600x1200 的 CanvasBounds 和 2.0f 的缩放比率。位置点是画布的起点,如果它被缩小而不滚动。
  • 客户端矩形
  • 自动滚动位置

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

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


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

红色框代表视口矩形。

【问题讨论】:

  • 我在 C# 中没有答案,但如果有帮助,请查看 compsci.gxstudios.net/project.pdf 的附录 A。
  • 这不是 3D,这是 GDI+
  • 附录不是在讨论 3D,而是针对 3D 地图编辑器中的 2D 设计画布。
  • 哦,好的,我在文档中搜索了“Viewport”,没有找到这个词。我再看看。

标签: c# .net gdi viewport


【解决方案1】:

我想通了。这是我必须为我工作的代码。

在此解决方案中,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)
            );
        }
    }
}

【讨论】:

    猜你喜欢
    • 2018-09-04
    • 2014-11-07
    • 2017-12-25
    • 1970-01-01
    • 1970-01-01
    • 2018-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多