2014-02-18 146 views
4

我有一個普通的位圖加載一個PNGImage。以下代碼顯示整個圖像;但我正在尋找的是例如下面的示例。我基本上想要減少它將被繪製的虛擬「地點」。請注意,我不能僅僅因爲我可以枚舉的原因調整PaintBox的大小,如果有人問。我想我必須使用Rects和一些複製功能,但我無法自己弄清楚。有誰知道該怎麼辦?如何繪製圖像的一部分?

procedure TForm1.PaintBox1Paint(Sender: TObject); 
begin 
    PaintBox1.Canvas.Brush.Color := clBlack; 
    PaintBox1.Brush.Style := bsSolid; 
    PaintBox1.Canvas.FillRect(GameWindow.Screen.ClientRect); 
    PaintBox1.Canvas.Draw(0, 0, FBitmap, FOpacity); 
end; 

enter image description here

+3

看到'TCanvas.CopyRect' –

回答

5

一種方法是修改你的顏料盒的畫布的剪輯區域:

... 
IntersectClipRect(PaintBox1.Canvas.Handle, 20, 20, 
    PaintBox1.Width - 20, PaintBox1.Height - 20); 
PaintBox1.Canvas.Draw(0, 0, FBitmap, FOpacity); 


當然,我敢肯定,你知道,(0, 0Canvas.Draw呼叫是座標。您可以繪製等。無論您喜歡:

... 
FBitmap.Canvas.CopyRect(Rect(0, 0, 80, 80), FBitmap.Canvas, 
    Rect(20, 20, 100, 100)); 
FBitmap.SetSize(80, 80); 
PaintBox1.Canvas.Draw(20, 20, FBitmap, FOpacity); 


如果你不想夾在顏料盒的區域,不要婉修改源位圖(FBitmap),並且不希望做一個它的臨時副本,就可以直接調用AlphaBlend而不是通過Canvas.Draw

var 
    BlendFn: TBlendFunction; 
begin 
    BlendFn.BlendOp := AC_SRC_OVER; 
    BlendFn.BlendFlags := 0; 
    BlendFn.SourceConstantAlpha := FOpacity; 
    BlendFn.AlphaFormat := AC_SRC_ALPHA; 

    winapi.windows.AlphaBlend(PaintBox1.Canvas.Handle, 
     20, 20, PaintBox1.Width - 20, PaintBox1.Height - 20, 
     FBitmap.Canvas.Handle, 20, 20, PaintBox1.Width - 20, PaintBox1.Height - 20, 
     BlendFn); 
+0

隨着'CopyRect'。 Preciselly。謝謝! – Guill