Vấn đềTại sao tôi mất tính minh bạch khi gọi BitBlt hoặc CopyRect?
Tôi cố gắng để sao chép 32x32 gạch từ một TBitmap
thành một TPaintbox
đó là biên tập bản đồ của tôi, nhưng tôi dường như không thể có được sự minh bạch hoạt động đúng.
Xem hình dưới đây:
Lưu ý: Đối với mục đích của bản demo và thử nghiệm, tôi đã đặt một TImage bên dưới TPaintbox đó sẽ giúp xem nếu tính minh bạch đang làm việc hay không.
Như bạn thấy, gạch thường xuyên vẽ một cách chính xác, nhưng gạch rằng cần phải minh bạch được rút ra với nền trắng.
Tôi bây giờ sử dụng các lớp học thích hợp để quản lý bản đồ và gạch của tôi, và dưới đây là hai cách tôi đã cố gắng vẽ:
CopyRect:
procedure TMap.DrawTile(Tileset: TBitmap; MapX, MapY, TileX, TileY: Integer;
MapCanvas: TCanvas);
begin
if TileIsFree(MapX, MapY) then
begin
MapCanvas.CopyRect(
Rect(MapX, MapY, MapX + fTileWidth, MapY + fTileHeight),
Tileset.Canvas,
Rect(TileX, TileY, TileX + fTileWidth, TileY + fTileHeight));
end;
end;
bitblt
procedure TMap.DrawTile(Tileset: TBitmap; MapX, MapY, TileX, TileY: Integer;
MapCanvas: TCanvas);
begin
if TileIsFree(MapX, MapY) then
begin
BitBlt(
MapCanvas.Handle,
MapX,
MapY,
fTileWidth,
fTileHeight,
Tileset.Canvas.Handle,
TileX,
TileY,
SRCCOPY);
end;
end;
Tôi đã thử sử dụng định dạng hình ảnh bitmap và png cho tileet (hình ảnh bên trái trên scre enshot). Sự khác biệt duy nhất giữa bitmap và png là CopyRect
cuộc đấu tranh để vẽ ngay cả một vài gạch khi nó là một png, nhưng BitBlt
quản lý để vẽ mà không có bất kỳ hạn chế rõ ràng.
Dù sao, làm cách nào để sao chép/vẽ một phần của TBitmap
lên TPaintbox
mà không làm mất tính minh bạch hoặc trong trường hợp của tôi mà không sao chép nền trắng?
Cập nhật 1
Tiếp theo từ một số các ý kiến dưới đây tôi đã cố gắng gọi AlphaBlend
chức năng nhưng điều này vẫn khiến kết quả không mong muốn (chú ý màu xanh xung quanh vùng trong suốt):
procedure TMap.DrawTile(Tileset: Graphics.TBitmap; MapX, MapY, TileX, TileY: Integer;
MapCanvas: TCanvas);
var
BlendFn: TBlendFunction;
begin
if TileIsFree(MapX, MapY) then
begin
BlendFn.BlendOp := AC_SRC_OVER;
BlendFn.BlendFlags := 0;
BlendFn.SourceConstantAlpha := 255;
BlendFn.AlphaFormat := AC_SRC_ALPHA;
AlphaBlend(
MapCanvas.Handle,
MapX,
MapY,
fTileWidth,
fTileHeight,
Tileset.Canvas.Handle,
TileX,
TileY,
fTileWidth,
fTileHeight,
BlendFn);
end;
end;
Cảm ơn.
BitBlt, StretchBlt (CopyRect) không có hỗ trợ minh bạch. Sử dụng Canvas.Draw. –
Hoặc ['TransparentBlt()'] (http://msdn.microsoft.com/en-us/library/dd145141.aspx) –
@RemyLebeau Tôi đang xem 'TransparentBlt' ngay bây giờ ... Lazarus dường như ghét thêm các đơn vị: 'JwaWinGDI' mặc dù để sử dụng vì nó messes lên các loại khác như TBitmap, vì vậy tôi phải khai báo các loại tiêu chuẩn như' Graphics.TBitmap' vv –