(Moderator)
Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
Delphi 2006 Professional
|
Re: Was für ne scharfe Auswahlleiste
17. Jul 2007, 09:55
Da die Windows-Funktion einem das Leben schwer macht in dem sie auch den Alphakanal des Ziel-HDC berücksichtig hab ich mal eine eigene Funktion geschrieben:
Delphi-Quellcode:
procedure BitBltAlpha(DestDC: HDC; X, Y, Width, Height: Integer; SrcBmp: TBitmap; XSrc, YSrc: Integer);
var
lDst : TBitmap;
lPixelDst,
lPixelSrc : PRGBQuad;
lCountX,
lCountY : Integer;
lAlphaNeg : Byte;
begin
if (SrcBmp.PixelFormat <> pf32bit) then
BitBlt(DestDC, X, Y, Width, Height, SrcBmp.Canvas.Handle, XSrc, YSrc, SRCCOPY)
else
begin
if (Width > SrcBmp.Width) then
Width := SrcBmp.Width;
if (Height > SrcBmp.Height) then
Height := SrcBmp.Height;
lDst := TBitmap.Create();
lDst.PixelFormat := pf32bit;
lDst.SetSize(Width, Height);
BitBlt(lDst.Canvas.Handle, 0, 0, Width, Height, DestDC, X, Y, SRCCOPY);
lPixelSrc := SrcBmp.ScanLine[SrcBmp.Height - 1];
lPixelDst := lDst.ScanLine[lDst.Height - 1];
for lCountY := lDst.Height - 1 downto 0 do
begin
for lCountX := lDst.Width - 1 downto 0 do
begin
lAlphaNeg := not(lPixelSrc.rgbReserved);
lPixelDst.rgbBlue := ((lPixelSrc.rgbBlue * lPixelSrc.rgbReserved) + (lPixelDst.rgbBlue * lAlphaNeg)) div 255;
lPixelDst.rgbGreen := ((lPixelSrc.rgbGreen * lPixelSrc.rgbReserved) + (lPixelDst.rgbGreen * lAlphaNeg)) div 255;
lPixelDst.rgbRed := ((lPixelSrc.rgbRed * lPixelSrc.rgbReserved) + (lPixelDst.rgbRed * lAlphaNeg)) div 255;
inc(lPixelDst);
inc(lPixelSrc);
end;
end;
BitBlt(DestDC, X, Y, Width, Height, lDst.Canvas.Handle, 0, 0, SRCCOPY);
lDst.Free;
end;
end;
Die Funktion ist wie die Funktion BitBlt zu nutzen. Anstelle eine Src-HDC übergibt man ein Src-Bitmap. Wenn dieses eine Farbtiefe von 32bit hat wird der Alphakanal beim blitten berücksichtigt.
Jens Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
|
|
Zitat
|