我有一个显示画布图像的自定义控件。我正在使用AutoScroll和缩放比率来显示图像。
因此,我必须使用的数据是:
我需要在任何给定时间计算视口,以相对于原始位图的坐标给出。因此,如果整个图像是可见的,并且图像是800x600,则视口将是0,0的矩形,大小为800,600。
我放大了图像,视口应该始终是代表整个可见区域的矩形。如果我缩小并且图像在屏幕上居中,那么视口应该是整个图像。
编辑:这是一个图形表示。位图当前已缩放,但我有原始大小和缩放比例。我有AutoScrollPosition。 AutoScrollMinSize根据缩放级别设置。如果图像高度为500px且我们处于200%(2.0f)缩放,则AutoScrollMinSize.Height为1000。
红色框表示视口矩形。
答案 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)
);
}
}
}