Einzelnen Beitrag anzeigen

Benutzerbild von uligerhardt
uligerhardt

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

AW: canvas.rectangle transparent?

  Alt 29. Apr 2016, 14:13
@stahli, kannst du mal ein Beispiel zeigen?
Nein, dafür habe ich kein Beispiel.
Dich hab ich doch auch gar nicht gemeint, sondern Mattze.
Sorry für die Verwirrung - ich kann nicht lesen.


EDIT: Ich musste es jetzt doch mal ausprobieren. Ich finde, das schaut ganz gut aus. Das hängt aber natürlich vom Hintergrund ab.
2016-04-29-14_22_54-form2.png
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);
  if not Windows.IntersectRect(rBlend, rClip, ARect) 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, rBlend.Right - rBlend.Left, rBlend.Bottom - rBlend.Top,
      Bitmap.Canvas.Handle, 0, 0, 1, 1,
      BlendParams);
  finally
    Bitmap.Free;
  end;
end;

procedure TForm2.PaintBox1Paint(Sender: TObject);
var
  r: TRect;
begin
  PaintBox1.Canvas.Brush.Color := clWhite;
  PaintBox1.Canvas.Pen.Color := clBlack;
  PaintBox1.Canvas.FillRect(ClientRect);
  PaintBox1.Canvas.TextOut(100, 100, 'Alarma! Ohne Highlighting');
  PaintBox1.Canvas.TextOut(100, 200, 'Alarma! Mit Highlighting');
  r := Bounds(50, 150, 200, 100);
  AlphaBlendRect(PaintBox1.Canvas.Handle, r, clRed, 50);
  PaintBox1.Canvas.Pen.Color := clRed;
  PaintBox1.Canvas.Brush.Style := bsClear;
  PaintBox1.Canvas.Rectangle(r);
end;
Uli Gerhardt

Geändert von uligerhardt (29. Apr 2016 um 14:28 Uhr)
  Mit Zitat antworten Zitat