ProblemDlaczego tracę przezroczystość podczas wywoływania BitBlt lub CopyRect?
Próbuję skopiować 32x32 tabliczki z TBitmap
w TPaintbox
który jest mój edytor map, ale nie wydaje się uzyskać przezroczystość działa poprawnie.
Patrz zdjęcie poniżej:
Uwaga: Do celów demonstracji i testów, jakie postawił TImage pod spodem TPaintbox który pomoże sprawdzić, czy przezroczystość pracuje czy nie.
Jak widać, regularne płytki rysować poprawnie, ale płytki, które powinny być przezroczyste są rysowane z białym tłem.
Jestem teraz używając odpowiednich klas zarządzać moje mapy i płytek, a poniżej jest na dwa sposoby próbowałem rysunek:
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;
Próbowałem używać formatów bitmapowych i png dla zestawu klocków (lewy obrazek na scre enshot). Jedyną różnicą między bitmapą i png jest to, że CopyRect
stara się narysować nawet kilka płytek, gdy jest to png, ale BitBlt
udaje się narysować bez żadnych oczywistych wad.
W każdym razie, w jaki sposób skopiować/narysować część TBitmap
na TPaintbox
bez utraty przejrzystości, lub w moim przypadku bez kopiowania również białego tła?
Update 1
Opierając się na niektóre komentarze poniżej Próbowałem wywołanie funkcji AlphaBlend
ale nadal pozostawia niepożądane skutki (uwaga niebieskie kolory wokół obszarów przezroczystych):
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;
Dzięki.
BitBlt, StretchBlt (CopyRect) nie obsługuje przezroczystości. Użyj Canvas.Draw. –
Lub ['TransparentBlt()'] (http://msdn.microsoft.com/en-us/library/dd145141.aspx) –
@RemyLebeau Patrzę teraz na 'TransparentBlt' ... Łazarz nie lubi dodawać the unit: 'JwaWinGDI' chociaż do zastosowań, ponieważ zakłóca inne typy, takie jak TBitmap, więc muszę zadeklarować standardowe typy, takie jak' Graphics.TBitmap' itd. –