Difference between revisions of "Double Gradient/de"

From Lazarus wiki
Jump to navigationJump to search
Line 122: Line 122:
 
Version 1.1
 
Version 1.1
 
* umbenannt in 'n Gradient Edit', einfach weil es nicht mehr doppelt ist...
 
* umbenannt in 'n Gradient Edit', einfach weil es nicht mehr doppelt ist...
* Ich kenn mich nicht nicht so gut mit dem Speichern der Configs aus - bitte korrigiert es. Danke
+
* Ich kenn mich nicht so gut mit dem Speichern der Configs aus - bitte korrigiert es. Danke
 
* Ich habe die Copy-to-clipboard Sache auskommentiert - zu faul zum Korrigieren...
 
* Ich habe die Copy-to-clipboard Sache auskommentiert - zu faul zum Korrigieren...
 
* Ich habe die DPI Sache gestoppt, weil der Editor auf meinem PC nicht OK aussieht, entfernt das "//" in Form.Create wenn ihr das verwenden wollt.
 
* Ich habe die DPI Sache gestoppt, weil der Editor auf meinem PC nicht OK aussieht, entfernt das "//" in Form.Create wenn ihr das verwenden wollt.

Revision as of 12:08, 20 February 2011

Deutsch (de) English (en)

Unit

sampledoublegd.png

Mit dieser Unit 'ngradient' können Sie ganz einfach Farbverläufe (= Gradienten) für Toolbars, Schaltflächen, etc... erzeugen. Speichern Sie den untenstehenden Code in einer Textdatei 'ngradient.pas' und fügen Sie 'ngradient' im Abschnitt 'uses' von Ihrem Projekt hinzu.

<delphi>unit ngradient;

{$mode objfpc}{$H+}

interface

uses

 Classes, Graphics;

type

 TnGradientInfo = record
   StartColor,StopColor:TColor;
   Direction: TGradientDirection;
   endPercent:single; // This is not the percent of the width, this is the percent of the end of the rect- which means, if this value is 1 - the rect could be from 0.99 to 1 and needs not to be from 0 to 1
 end;

function DoubleGradientFill(ARect: TRect; AStart1,AStop1,AStart2,AStop2: TColor;

 ADirection1,ADirection2,APos: TGradientDirection; AValue: Single): TBitmap;

function nGradientFill(ARect: TRect;APos: TGradientDirection; AGradient: array of TnGradientInfo): TBitmap;

implementation

function nGradientFill(ARect: TRect;APos: TGradientDirection; AGradient: array of TnGradientInfo): TBitmap; var

 i:integer;
 AnRect,OldRect: TRect;

begin

 Result := TBitmap.Create;
 Result.Width:=ARect.Right-ARect.Left;
 Result.Height:=ARect.Bottom-ARect.Top;
 OldRect := ARect;
 if APos = gdVertical then OldRect.Bottom := ARect.Top
    else OldRect.Right := ARect.Left ;   // upside down...  in case of i = 0...
 for i := 0 to high(AGradient) do
     begin
     AnRect:=OldRect;
     if APos = gdVertical then
        begin
        AnRect.Bottom:=Round((ARect.Bottom-ARect.Top) * AGradient[i].endPercent + ARect.Top);
        AnRect.Top:=OldRect.Bottom;
        end
       else
        begin
        AnRect.Right:=Round((ARect.Right-ARect.Left) * AGradient[i].endPercent + ARect.Left);
        AnRect.Left:=OldRect.Right;
        end;
     Result.Canvas.GradientFill(AnRect,AGradient[i].StartColor,AGradient[i].StopColor,AGradient[i].Direction);
     OldRect := AnRect;
     end;

end;


function DoubleGradientFill(ARect: TRect; AStart1,AStop1,AStart2,AStop2: TColor;

 ADirection1,ADirection2,APos: TGradientDirection; AValue: Single): TBitmap;

var

 ABitmap: TBitmap; ARect1,ARect2: TRect;

begin

 ABitmap := TBitmap.Create;
 ABitmap.Width:=ARect.Right;
 ABitmap.Height:=ARect.Bottom;
 if AValue <> 0 then begin
   ARect1:=ARect;
 end;
 if AValue <> 1 then begin
   ARect2:=ARect;
 end;
 if APos = gdVertical then begin
   ARect1.Bottom:=Round(ARect1.Bottom * AValue);
   ARect2.Top:=ARect1.Bottom;
 end
 else if APos = gdHorizontal then begin
   ARect1.Right:=Round(ARect1.Right * AValue);
   ARect2.Left:=ARect1.Right;
 end;
 if AValue <> 0 then begin
   ABitmap.Canvas.GradientFill(ARect1,AStart1,AStop1,ADirection1);
 end;
 if AValue <> 1 then begin
   ABitmap.Canvas.GradientFill(ARect2,AStart2,AStop2,ADirection2);
 end;
 Result:=ABitmap;

end;

end.</delphi>

Gebrauch

Erstens benötigen Sie eine 'TBitmap' um den Gradienten zu speichern, dann können Sie das Image zeichnen, beispielsweise im gesamten sichtbaren Bereich der 'Form1':

defaultdbgd.png

Dies ist das Ergebnis (verwendet DoubleGradientFill).

<delphi>procedure TForm1.FormPaint(Sender: TObject); var

 ABitmap: TBitmap;

begin

 ABitmap:=DoubleGradientFill(Self.ClientRect,clMedGray,clWhite,clSilver,clGray,gdVertical,gdVertical,gdVertical,0.50);
 Self.Canvas.Draw(0,0,ABitmap);
 ABitmap.Free

end;</delphi>

Editor

Der nGradient Editor ist eine aktualisierte Version des Double Gradient Editor mit zahlreichen Änderungen und Verbesserungen, wie der Fähigkeit, Gradienten zu erzeugen mit einer beliebigen Anzahl 'n' von Gradienten.

nGradient Editor

Mit dem nGradient Editor können Sie die Anzahl 'n' der Gradienten festlegen.

ngedit.png

Version 1.1

  • umbenannt in 'n Gradient Edit', einfach weil es nicht mehr doppelt ist...
  • Ich kenn mich nicht so gut mit dem Speichern der Configs aus - bitte korrigiert es. Danke
  • Ich habe die Copy-to-clipboard Sache auskommentiert - zu faul zum Korrigieren...
  • Ich habe die DPI Sache gestoppt, weil der Editor auf meinem PC nicht OK aussieht, entfernt das "//" in Form.Create wenn ihr das verwenden wollt.
  • Ich habe den Editor geändert, ich verwende jetzt eine Stringlist. Doppelklicke auf StartColor/StopColor oder Gradient für eine Combobox / ColorDialog.
  • Ich male auf ein Image.
  • Das Image ist nicht länger in der Mitte - ich hatte einige Probleme, wenn ihr das reparieren könnt : toll.
  • Ihr könnt die Form skalieren.
  • Ich habe versucht, das Rendern und den Rest zu trennen...

Bugfixes: <delphi>(Rect.Bottom) *37 //und ich korrigierte das in (Rect.Bottom - Rect.Top) * 37 + Rect.Top. //Wenn Top und Left 0 waren, gab es keine Probleme ...</delphi>

<delphi>//Und ich änderte die Zeile GradientPB.Canvas.Draw(0,0,ABitmap); //in Panel1.Canvas.Draw(0,0,ABitmap);</delphi>

Double Gradient Editor

Sie können aber auch den 'Double Gradient Editor' verwenden. Das ist ein GUI-Programm, das sofort ein sichtbares Ergebnis liefert (nur bei doppelten Gradienten). Speichern Sie den Gradienten in einer Bitmap-Datei (oder als '*.doublegradient' Sitzungsdatei) oder kopieren Sie einfach den Code in die Zwischenablage um ihn in Lazarus zu verwenden.

dbgedit.png

  • Ein Rechtsklick auf die Scrollbox (den Gradientenbereich) zeigt das Kontextmenü an:
    • Save bitmap.. Zeigt einen Dialog zum Speichern als *.bmp Datei.
    • Load gradient.. Zeigt einen Dialog zum Laden einer *.doublegradient Sitzungsdatei.
    • Save gradient.. Zeigt einen Dialog zum Speichern der aktuellen Einstellungen in einer Sitzungsdatei.
    • Copy code to clipboard.. Kopiert einfach die Einstellungen in Textform in die Zwischenablage, die Sie dann im Lazarus-Quelltexteditor einfügen können, um die 'doublegradientfill'-Prozedur aufzurufen.
  • default.doublegradient: Diese Datei enthält die letzten Einstellungen im Editor, wird beim Start geladen und beim Programmende gespeichert.

Downloads

nGradient Editor 1.1 (With alpha support) Source Code ngdedit1.1alpha.zip (22.58 KB)

nGradient Editor 1.1 Source Code ngdedit1.1.zip (26.14 KB)

Double Gradient Editor 1.0 Source Code dbgdedit1.0.zip (5.64 KB)

Bearbeiten und verbessern Sie diesen Editor nach Belieben, natürlich kostenlos.

Externe Links

Forum about this article

Gradient Filler