Einzelnen Beitrag anzeigen

Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 

Re: Was für ne scharfe Auswahlleiste

  Alt 17. Jul 2007, 08: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.
Miniaturansicht angehängter Grafiken
screenshot_431.jpg  
Angehängte Dateien
Dateityp: zip alphademo_140.zip (385,8 KB, 50x aufgerufen)
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat