我有一个加载了PNGImage的普通Bitmap。以下代码显示整个图像;但我要找的是像下面的示例一样显示。我基本上想要减少虚拟"地点"它将被绘制的地方。请注意,我无法通过我可以枚举的原因调整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;
答案 0 :(得分: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);
如果您不想剪切绘图框的区域,并且不想修改源位图(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);