2010-06-23 46 views
1

我正在使用delphi。
我有一個滾動框,我正在把TImage控制。現在我想放大渲染成TImage控件的圖像。所以,我正在使用TCanvas的stretchDraw方法。我的代碼是 -TImage和TScrollBox的問題

if sbZoom.Down then begin 
     rct := imgmain.Picture.Bitmap.Canvas.ClipRect; 
     rct := Rect(rct.Left * 2,rct.Top * 2,rct.Right * 2,rct.Bottom * 2); 
     imgmain.Picture.Bitmap.Canvas.StretchDraw(rct,imgmain.Picture.Bitmap); 
     imgmain.Repaint; 
    end; 

它正確地縮放圖像,我的問題是我想滾動框的大小也應該改變與圖像的縮放。
Also explain me parameters of Canvas.StretchDraw method. I am little confused with it.
謝謝。

回答

1

Uwe Raabe給你正確的方式來做到這一點。這就是爲什麼你的方式不起作用:滾動框將顯示滾動條,並幫助你看到整個控件。在你的情況下,只有當TImage對象增大到Scrollbox時纔會顯示滾動條。 Scrollbox不可能知道TImage的內部,所以它不關心TImage.Picture,它只關心控件。並且具有AutoSize = False的TImage不關心它的圖片,它的大小在任何時候都保持不變。

您的代碼重新繪製自身的基礎位圖。問題是,位圖具有固定的寬度和高度:如果您在位圖區域之外進行繪製,則基本上會默默忽略。當你通過Stretch將位圖拖動到自身上時(我驚訝它開始於!),你不會讓位圖變大,而不適合的東西會被靜靜地剪掉。如果你想讓內部位圖改變大小,那麼你首先需要創建一個新的更大的位圖,將你的放大圖像繪製到新的位圖上,然後將位圖分配給你的TImage。如果你這樣做,確保TImage.AutoSize = True。

+0

好的答案......其實我已經試過這個,但它也沒有像我期待的那樣工作。但問題是我在strechDraw函數中傳遞的參數。我正在採取更大的位圖,並傳遞相同的位圖作爲StrechDraw的參數..我的另一個問題是關於StrechDraw的參數,這是沒有人解釋。無論如何,現在我已經明白了。 – Himadri 2010-06-24 05:57:33

0

您應該將圖像控件的大小設置爲位圖的大小。

+0

它們已經是相同的... – Himadri 2010-06-23 07:36:55

3

您無需調用StretchDraw做到這一點很容易:

if Zoomed then begin 
    Image1.AutoSize := false; 
    Image1.Stretch := true; 
    Image1.Width := 2*Image1.Width; 
    Image1.Height := 2*Image1.Height; 
    end 
    else begin 
    Image1.Stretch := false; 
    Image1.AutoSize := true; 
    end; 

自動調整大小:=真正保證了TImage中的尺寸與內部的畫面一樣。在縮放過程中,我們將AutoSize關閉並拉伸,因此圖片被調整爲TImage尺寸(這裏仍然相同)。然後,我們將TImage的大小加倍以獲得縮放效果。由於TImage現在更大,滾動框可以正常工作。

+0

但它不會改變Image1.Picture.Bitmap.Width和Image1.Picture.Bitmap.Height的值... – Himadri 2010-06-23 10:28:42

+0

它不會,但Scrollbox不關心關於Image1.Picture.BitmapWidth,它只關心Image1.Width。爲什麼你要調整實際的位圖時,你可以顯示更大/更小的圖像而不需要實際上銷燬信息? +1。 – 2010-06-23 10:56:52

+0

@Cosmin我想要相同大小的位圖,因爲我必須對mousedown事件中的圖像進行進一步處理並更改多個圖像點。 – Himadri 2010-06-24 05:51:14