2011-12-06 71 views
1

我有一個顯示畫布圖像的自定義控件。我正在使用AutoScroll以及縮放比來顯示圖像。計算縮放/滾動畫布的視區矩形

因此我有工作的數據是:

  • 變焦縮放比例(2.0F = 200%的縮放)
  • 畫布邊界(的RectangleF)。 800x600像素的圖像將具有1600x1200的CanvasBounds以及2.0f的縮放比例。如果縮小並且不滾動,則位置點是畫布的起點。
  • ClientRectangle
  • AutoScrollPosition

我需要計算的視口在任何給定時間,定在座標相對於原始位圖。所以如果整個圖像是可見的,並且圖像是800x600,那麼視口將是0,0處的矩形,大小爲800,600。

我放大了圖像,視口應該始終是代表整個可見區域的矩形。如果我縮小並且圖像居中在屏幕上,那麼視口應該是整個圖像。


編輯:這是一個圖形表示。位圖當前被縮放,但是我具有原始大小和縮放比例。我有AutoScrollPosition。 AutoScrollMinSize根據縮放級別進行設置。如果圖片高度爲500px,並且我們處於200%(2.0f)的縮放比例,則AutoScrollMinSize.Height爲1000.

紅色框代表視口矩形。

enter image description here

+0

我沒有在C#中的答案,但看看附錄A http://compsci.gxstudios.net/project.pdf萬一它有幫助。 –

+0

這不是3D,它是GDI + –

+0

附錄不是在談論3D,而是3D繪圖編輯器中的2D設計畫布。 –

回答

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) 
      ); 
     } 
    } 
}