AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Gradient inkl. Gloweffekt zeichnen
Thema durchsuchen
Ansicht
Themen-Optionen

Gradient inkl. Gloweffekt zeichnen

Ein Thema von stOrM · begonnen am 10. Aug 2010 · letzter Beitrag vom 10. Aug 2010
Antwort Antwort
Benutzerbild von stOrM
stOrM

Registriert seit: 7. Jun 2003
Ort: Mülheim an der Ruhr
434 Beiträge
 
Delphi 10.3 Rio
 
#1

Gradient inkl. Gloweffekt zeichnen

  Alt 10. Aug 2010, 03:42
Ja Moin,
ich hab da grad ein Problem und frag mich wie man das lösen könnte.
Es geht mir darum einen Gradient zu zeichnen soweit so gut dank der GradientFill Funktion auch nicht weiter tragisch.

Nun hatte ich noch die Idee an der oberen Kante des 1. Gradients noch eine art Gloweffekt zu malen mit einem weiteren Gradient der in etwa 9 Pixel hoch sein sollte der fängt weiss an und geht nach Transparent.

Ich wusste mir im Moment nicht anders zu helfen als das ich den weiss nach transparenten Gradient in Photoshop erstelle und das Ding dann als PNG speichere. Später mal ich den dann einfach über den ersten Gradient in etwa so (oder bzw. genau so )


FPng.Draw(Pnl.Canvas, R);

Nun ist zwar ned hübsch aber funzt soweit. Aber kann man so einen Gradient nicht von Hand erstellen und über den ersten zeichnen

Das Problem scheint irgendwie zu sein das die GradientFill Funktion zwar über nen Alpha verfügt, jedoch nicht genutzt wird

Ich hab mal 2 Beispiele mit drangepappt damit man sieht wovon ich hier eigentlich rede. Einmal ohne Glow einmal mit Gloweffekt...

Wäre schön wenn jemand dafür eine Lösung aus dem Hut zaubern kann, weil auch wenn es so klappt, so ganz glücklich bin ich damit nicht wirklich

Viele Grüsse
s!
Angehängte Grafiken
  
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#2

AW: Gradient inkl. Gloweffekt zeichnen

  Alt 10. Aug 2010, 10:12
GradientFill kann auch Transparents.

Beispiel:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
    procedure FormPaint(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

var
  bf: _BLENDFUNCTION = (
    BlendOp: AC_SRC_OVER;
    BlendFlags: 0;
    SourceConstantAlpha: 255;
    AlphaFormat: AC_SRC_ALPHA);

type
  TGFillMode = (GRADIENT_FILL_RECT_H, GRADIENT_FILL_RECT_V);

function GradientFill(DC: HDC; pTriVertex: Pointer; dwNumVertex: DWORD;
  pMesh: Pointer; dwNumMesh, dwMode: DWORD): BOOL; stdcall;
  external 'msimg32.dllname 'GradientFill';

function GradientFill4c(DC: HDC; fillRect: TRect; Col: array of COLORREF; FillMode: TGFillMode): Boolean;
type
  _TTRIVERTEX = packed record
    X, Y: DWORD;
    Red, Green, Blue, Alpha: Word;
  end;
var
  tv: array[0..3] of _TTRIVERTEX;
  gr: array[0..1] of GRADIENT_RECT;
  i: integer;
begin
  if length(col) = 4 then
  begin
    // fillmode direction
    gr[0].UpperLeft := 0;
    gr[0].LowerRight := 1;
    gr[1].UpperLeft := 2;
    gr[1].LowerRight := 3;

    ZeroMemory(@tv, sizeof(tv));
    // eckpunkte festlegen
    if FillMode = GRADIENT_FILL_RECT_V then
    begin
      tv[0].x := fillRect.Left;
      tv[0].y := fillRect.Top;
      tv[1].x := fillRect.Right;
      tv[1].y := (fillRect.Top + fillRect.Bottom) div 2;

      tv[2].x := fillRect.Left;
      tv[2].y := (fillRect.Top + fillRect.Bottom) div 2;
      tv[3].x := fillRect.Right;
      tv[3].y := fillRect.Bottom;
    end
    else
    begin
      tv[0].x := fillRect.Left;
      tv[0].y := fillRect.Top;
      tv[1].x := (fillRect.Left + fillRect.Right) div 2;
      tv[1].y := fillRect.Bottom;

      tv[2].x := (fillRect.Left + fillRect.Right) div 2;
      tv[2].y := fillRect.Top;
      tv[3].x := fillRect.Right;
      tv[3].y := fillRect.Bottom;
    end;

    for i := 0 to high(Col) do
    begin
      tv[i].Red := BYTE(col[i]) shl 8; // get Color's and Byteswap for Color-Word
      tv[i].Green := BYTE(col[i] shr 8) shl 8;
      tv[i].Blue := BYTE(col[i] shr 16) shl 8;
      tv[i].Alpha := BYTE(col[i] shr 24) shl 8;
    end;

    Result := GradientFill(DC, @tv, length(tv), @gr, length(gr), DWORD(FillMode));
  end
  else
    Result := False;
end;


// Note that GradientFill does not use the Alpha member of the TRIVERTEX structure.
// To use GradientFill with transparency, call GradientFill and then call AlphaBlend
// with the desired values for the alpha channel of each vertex.

function GradientFill4cT(DC: HDC; fillRect: TRect; Col: array of COLORREF; FillMode: TGFillMode; bf: _BLENDFUNCTION): Boolean;
var
  w, h: integer;
  hBmpDC: HDC;
  hBmp: HBITMAP;
begin

  w := fillRect.Right - fillRect.Left;
  h := fillRect.Bottom - fillRect.Top;

  hBmpDC := CreateCompatibleDC(DC); //todo: Achtung: keine Fehlerprüfung !
  hBmp := CreateBitmap(w, h, 1, 32, nil);
  SelectObject(hBmpDC, hBmp);

  Result := GradientFill4c(hBmpDC, RECT(0, 0, w, h), Col, FillMode);

  with fillRect do
    Result := Result and Windows.AlphaBlend(
      DC,
      Left, Top, Right - Left, Bottom - Top,
      hBmpDC,
      0, 0, w, h,
      bf);

  DeleteObject(hBmp);
  DeleteDC(hBmpDC);
end;

procedure TForm1.FormPaint(Sender: TObject);
var
  pr: TRect;
begin
  pr := RECT(20,20,160,180);
  GradientFill4c(Self.Canvas.Handle, pr, [$000000FF, $008080FF, $000000FF, $000000C8], GRADIENT_FILL_RECT_V);
  OffSetRect(pr, 50, 50);
  GradientFill4c(Self.Canvas.Handle, pr, [$00FFFFFF, $00FFFFFF, $00FFFFFF, $00C00000], GRADIENT_FILL_RECT_H);

  // GradientFill with transparency

  OffSetRect(pr, 50, 50);
  GradientFill4cT(Self.Canvas.Handle, pr,[$FF0000FF, $A08080FF, $B00000FF, $FF0000C8], GRADIENT_FILL_RECT_V, bf);
end;

end.
Miniaturansicht angehängter Grafiken
bild1.jpg  
Angehängte Dateien
Dateityp: zip GradientFillSample.zip (208,8 KB, 54x aufgerufen)
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser

Geändert von turboPASCAL (10. Aug 2010 um 15:47 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von stOrM
stOrM

Registriert seit: 7. Jun 2003
Ort: Mülheim an der Ruhr
434 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Gradient inkl. Gloweffekt zeichnen

  Alt 10. Aug 2010, 15:36
Boh ich freu mir grad nen Ast DANNNNNKEEEE!

Viele Grüsse
Marc
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:23 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