Einzelnen Beitrag anzeigen

Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.735 Beiträge
 
Delphi 2007 Professional
 
#10

AW: canvas.rectangle transparent?

  Alt 29. Apr 2016, 10:28
Vielleicht mit AlphaBlending? Etwa so:
constant-alpha.png
Hier ist ein Artikel dazu: https://parnassus.co/transparent-gra...re-gdi-part-1/
Ich hab mir "damals" das draus gebastelt:
Delphi-Quellcode:
// AlphaBlendRect: Zeichnet das Rechteck ARect alphageblendet in der Farbe AColor
// und der Intensität AIntensity (0 = durchsichtig, 255 = deckend) auf den übergebenen DC.
procedure AlphaBlendRect(DC: HDC; const ARect: TRect; AColor: TColor; AIntensity: Byte);
var
  Bitmap: TBitmap;
  BlendParams: TBlendFunction;
  rClip, rBlend: TRect;

  function GetBlendColor: TRGBQuad;

    function PreMult(b: Byte): Byte;
    begin
      Result := (b * AIntensity) div $FF;
    end;

  var
    cr: TColorRef;
  begin
    cr := ColorToRGB(AColor);
    Result.rgbBlue := PreMult(GetBValue(cr));
    Result.rgbGreen := PreMult(GetGValue(cr));
    Result.rgbRed := PreMult(GetRValue(cr));
    Result.rgbReserved := AIntensity;
  end;

begin
  GetClipBox(DC, rClip);
  //NormalizeRect(rClip); // Kannst du ignorieren
  rBlend := ARect;
  //NormalizeRect(rBlend); // Kannst du ignorieren

  if not Windows.IntersectRect(rBlend, rClip, rBlend) then
    Exit;

  Bitmap := TBitmap.Create;
  try
    Bitmap.PixelFormat := pf32bit;
    Bitmap.SetSize(1, 1);
    PRGBQuad(Bitmap.ScanLine[0])^ := GetBlendColor;

    BlendParams.BlendOp := AC_SRC_OVER;
    BlendParams.BlendFlags := 0;
    BlendParams.SourceConstantAlpha := $FF;
    BlendParams.AlphaFormat := AC_SRC_ALPHA;

    Windows.AlphaBlend(
      DC, rBlend.Left, rBlend.Top, RectWidth(rBlend), RectHeight(rBlend),
      Bitmap.Canvas.Handle, 0, 0, 1, 1,
      BlendParams);
  finally
    Bitmap.Free;
  end;
end;
Uli Gerhardt
  Mit Zitat antworten Zitat