Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Transparentes Rechteck zeichnen (https://www.delphipraxis.net/94694-transparentes-rechteck-zeichnen.html)

xZise 25. Jun 2007 17:05


Transparentes Rechteck zeichnen
 
Wie kann ich ein transparentes Rechteck zeichnen, also dass man sozusagen die Stelle einfärbt.

Angeblich soll ja der Farbcode folgendermaßen lauten:
Delphi-Quellcode:
$AABBGGRR // A = Alphakanal, BGR = RGB andersherum
Oder habe ich da was falsch verstanden? Jedenfalls wird das Rechteck bei einen ungeraden A schwarz ansonsten Blau (ich hatte als RGB Blau angegeben)

lbccaleb 25. Jun 2007 17:48

Re: Transparantes Rechteck zeichnen
 
vllt kannst dir die letzte funktion nen bissel selber umbasteln, um dein gewünschtes ergebnis zu erhalten..

siehe:

rechteck

xZise 25. Jun 2007 17:53

Re: Transparentes Rechteck zeichnen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Na... Das wird net sein...

Ich ahbe mal ein Beispiel angehangen wie ich das dachte :P

DeddyH 25. Jun 2007 18:00

Re: Transparentes Rechteck zeichnen
 
Vielleicht hilft Dir dies (ungetestet).

Khabarakh 25. Jun 2007 18:05

Re: Transparentes Rechteck zeichnen
 
Zitat:

Zitat von xZise
Delphi-Quellcode:
$AABBGGRR // A = Alphakanal, BGR = RGB andersherum

So sollte es funktionieren, tut es aber nicht, da Delphi das uralte GDI benutzt. Nutze GDI+, eine der üblichen 3D-APIs (was wohl eher in die Kategorie "Overkill"gehört ;) ) oder 3rd-Party-Libs wie GR32.

Hawkeye219 25. Jun 2007 18:28

Re: Transparentes Rechteck zeichnen
 
Hallo Fabian,

meinst du so etwas?

Delphi-Quellcode:
// zeichnet ein transparentes Rechteck
//
// aCanvas    Ziel-Canvas
// aRect      Zeichenbereich
// aColor     Füllfarbe
// aIntensity Intensität (0=min, 255=max)

procedure AlphaBlendRect (const aCanvas: TCanvas;
                          const aRect: TRect;
                          const aColor: TColor;
                          const aIntensity: Byte);
var
  w, h       : Integer;
  Bitmap     : TBitmap;
  BlendParams : TBlendFunction;
begin
  w := Succ(aRect.Right - aRect.Left);
  h := Succ(aRect.Bottom - aRect.Top);
  Bitmap := TBitmap.Create;
  try
    Bitmap.Width := w;
    Bitmap.Height := h;
    Bitmap.Canvas.Brush.Color := ColorToRGB(aColor);
    Bitmap.Canvas.FillRect (Rect(0, 0, w, h));
    BlendParams.BlendOp := AC_SRC_OVER;
    BlendParams.BlendFlags := 0;
    BlendParams.SourceConstantAlpha := aIntensity;
    BlendParams.AlphaFormat := 0;
    Windows.AlphaBlend(aCanvas.Handle, aRect.Left, aRect.Top, w, h,
                       Bitmap.Canvas.Handle, 0, 0, w, h,
                       BlendParams);
  finally
    Bitmap.Free;
  end;
end;
Gruß Hawkeye

xZise 25. Jun 2007 19:26

Re: Transparentes Rechteck zeichnen
 
Zitat:

Zitat von Hawkeye219
Hallo Fabian,

meinst du so etwas?

Delphi-Quellcode:
// zeichnet ein transparentes Rechteck
//
// aCanvas    Ziel-Canvas
// aRect      Zeichenbereich
// aColor     Füllfarbe
// aIntensity Intensität (0=min, 255=max)

procedure AlphaBlendRect (const aCanvas: TCanvas;
                          const aRect: TRect;
                          const aColor: TColor;
                          const aIntensity: Byte);
var
  w, h       : Integer;
  Bitmap     : TBitmap;
  BlendParams : TBlendFunction;
begin
  w := Succ(aRect.Right - aRect.Left);
  h := Succ(aRect.Bottom - aRect.Top);
  Bitmap := TBitmap.Create;
  try
    Bitmap.Width := w;
    Bitmap.Height := h;
    Bitmap.Canvas.Brush.Color := ColorToRGB(aColor);
    Bitmap.Canvas.FillRect (Rect(0, 0, w, h));
    BlendParams.BlendOp := AC_SRC_OVER;
    BlendParams.BlendFlags := 0;
    BlendParams.SourceConstantAlpha := aIntensity;
    BlendParams.AlphaFormat := 0;
    Windows.AlphaBlend(aCanvas.Handle, aRect.Left, aRect.Top, w, h,
                       Bitmap.Canvas.Handle, 0, 0, w, h,
                       BlendParams);
  finally
    Bitmap.Free;
  end;
end;
Gruß Hawkeye

Danke Hawkeye! Die Funktion ist perfekt und erzeugt sogar Polygone :P Danke ^^
Wenn muss/soll ich als Autor der Funktion nennen? Dich oder hast du die Funktion vielleicht von voandersher?

@ DeddyH: Sry, aber Hawkeyes Code ist übersichtlicher :) Und funktioniert gut!

Hawkeye219 25. Jun 2007 20:12

Re: Transparentes Rechteck zeichnen
 
Zitat:

Zitat von xZise
Wenn muss/soll ich als Autor der Funktion nennen? Dich oder hast du die Funktion vielleicht von voandersher?

Wenn du ein wenig im Internet stöberst, wirst du den Code in dieser oder ähnlicher Form wahrscheinlich häufiger finden. Microsoft liefert die Beschreibung der Funktion AlphaBlend, der Rest ist die Anpassung an die eigenen Bedürfnisse. Vielleicht kann man die Routine sogar noch optimieren, für meine Zwecke reichte es so.

Gruß Hawkeye


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:37 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz