2014-02-18 4 views
4

У меня есть обычное растровое изображение, загруженное PNGImage. Следующий код показывает все изображение; но я ищу, чтобы показать, например, пример ниже. Я хочу в основном уменьшить виртуальное «место», где оно будет расписано. Обратите внимание, что я не могу просто изменить размер PaintBox по причинам, которые я могу перечислить, если кто-то спросит. Я предполагаю, что мне нужно использовать Rects и/или функцию Copy, но я не мог понять сам. Кто-нибудь знает, как это сделать?Как нарисовать часть изображения?

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

Один из способов изменить вырезанную область холста вашего PaintBox в:

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


Конечно, я уверен, что вы знаете, что (0, 0 в вашем Canvas.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); 


Если вы не хотите, чтобы обрезать область в PaintBox, и не тусклый изменять исходный точечный рисунок (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

Смежные вопросы