{"id":134,"date":"2007-05-12T14:58:39","date_gmt":"2007-05-12T12:58:39","guid":{"rendered":" http:\/\/www.nsonic.de\/blog\/2007\/05\/rainbow-gradient-hintergrund\/"},"modified":"2007-05-12T14:58:41","modified_gmt":"2007-05-12T12:58:41","slug":"rainbow-gradient-hintergrund","status":"publish","type":"post","link":"https:\/\/www.nsonic.de\/blog\/2007\/05\/rainbow-gradient-hintergrund\/","title":{"rendered":"Rainbow Gradient Hintergrund"},"content":{"rendered":"<p><em>Wilhelm Steinbu\u00df  wrote in message<br \/>\n37724E4C.5A37E97C@fh-trier.de&#8230; <\/p>\n<p>> Hi,<br \/>\n><br \/>\n> I will made a rainborrow with two or more colors.<br \/>\n><br \/>\n> A little procedure like:<br \/>\n><br \/>\n> procedure (color1, color2:TColor; canvas: TCanvas);<br \/>\n> begin<br \/>\n> &#8230;.<br \/>\n> end;<br \/>\n><br \/>\n> And this procedure should made the rainborrow in Canvas.<br \/>\n> In the top the color color1 and in the bottom the color color2 !<br \/>\n><br \/>\n<\/em><br \/>\nHere&#8217;s some source I found a while back about pallete shifting that makes<br \/>\na cool rainbow background on the form. It won&#8217;t work on some NT systems.<\/p>\n<p>[code lang=&#8221;delphi&#8221;]unit rainbow;<\/p>\n<p>interface<\/p>\n<p>uses<br \/>\n  SysUtils, WinTypes, Forms, ExtCtrls, Classes, Messages, Graphics;<\/p>\n<p>type<br \/>\n  TForm1 = class(TForm)<br \/>\n    Timer1: TTimer;<br \/>\n    procedure FormCreate(Sender: TObject);<br \/>\n    procedure FormDestroy(Sender: TObject);<br \/>\n    procedure FormPaint(Sender: TObject);<br \/>\n    procedure FormResize(Sender: TObject);<br \/>\n    procedure Timer1Timer(Sender: TObject);<br \/>\n    procedure FormClick(Sender: TObject);<br \/>\n    procedure Timer2Timer(Sender: TObject; var Done : Boolean);<br \/>\n    procedure FormKeyPress(Sender: TObject; var Key: Char);<br \/>\n    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,<br \/>\n      Y: Integer);<br \/>\n  private<br \/>\n    { Private declarations }<br \/>\n    BluePalette : HPALETTE;<br \/>\n    UsingOurPalette : Boolean;<br \/>\n    SaverKind : Word;<br \/>\n  protected<br \/>\n    procedure WMQueryNewPalette(var Message : TMessage); message<br \/>\n                                    WM_QUERYNEWPALETTE;<br \/>\n    procedure WMPaletteChanged(var Message : TMessage); message<br \/>\n                                   WM_PALETTECHANGED;<br \/>\n    procedure PaletteChanged(var Message : TMessage);<br \/>\n  public<br \/>\n    { Public declarations }<br \/>\n    function GetPalette : HPALETTE; override;<br \/>\nend;<\/p>\n<p>var<br \/>\n  Form1: TForm1;<\/p>\n<p>implementation<\/p>\n<p>{$R *.DFM}<\/p>\n<p>Var<br \/>\n  Pal : PLogPalette;<br \/>\n  PalSize : Word;<\/p>\n<p>type<br \/>\n  TFadeDirection = (fdIn, fdOut);<\/p>\n<p>Procedure CursorOff;<br \/>\nVar<br \/>\n  Cstate : Integer;<br \/>\nBegin<br \/>\n  Cstate := ShowCursor(True);<br \/>\n  While Cstate >= 0 do<br \/>\n    Cstate := ShowCursor(False);<br \/>\nEnd;<\/p>\n<p>Procedure CursorOn;<br \/>\nVar<br \/>\n  Cstate : Integer;<br \/>\nBegin<br \/>\n  Cstate := ShowCursor(True);<br \/>\n  While Cstate < 0 do\n    Cstate := ShowCursor(True);\nEnd;\n\nprocedure TForm1.PaletteChanged(var Message : TMessage);\nvar\n  hOldPal : THandle;\n  wTemp : Word;\nbegin\n  hOldPal := SelectPalette(Canvas.Handle, BluePalette, False);\n  wTemp := RealizePalette(Canvas.Handle);\n  SelectPalette(Canvas.Handle, hOldPal, True);\n  RealizePalette(Canvas.Handle);\n  if wTemp <> 0<br \/>\n    Then<br \/>\n      Invalidate;<br \/>\n  Message.Result := wTemp;<br \/>\nend;<\/p>\n<p>procedure TForm1.WMQueryNewPalette(var Message : TMessage);<br \/>\nbegin<br \/>\n  PaletteChanged(Message);<br \/>\n  inherited;<br \/>\nend;<\/p>\n<p>procedure TForm1.WMPaletteChanged(var Message : TMessage);<br \/>\nbegin<br \/>\n  if Message.wparam <> handle<br \/>\n    then<br \/>\n      Begin<br \/>\n        PaletteChanged(Message);<br \/>\n        UsingOurPalette := False;<br \/>\n      End<br \/>\n    else<br \/>\n      UsingOurPalette := True;<br \/>\n  inherited;<br \/>\nend;<\/p>\n<p>procedure MakeGradient(R1, G1, B1, R2, G2, B2, Steps : Integer;<br \/>\n                       var palPalEntry : array of TPaletteEntry);<br \/>\n  var<br \/>\n    RStep, GStep, BStep : Real;<br \/>\n    RNow, GNow, BNow : Real;<br \/>\n    i : Integer;<br \/>\nbegin<br \/>\n  RStep := (R2-R1)\/Steps;<br \/>\n  GStep := (G2-G1)\/Steps;<br \/>\n  BStep := (B2-B1)\/Steps;<br \/>\n  RNow := R1;<br \/>\n  GNow := G1;<br \/>\n  BNow := B1;<br \/>\n  for i := 0 to Steps &#8211; 2 do<br \/>\n    begin<br \/>\n      with palPalEntry[i] do<br \/>\n        begin<br \/>\n          peRed := Round(RNow);<br \/>\n          peGreen := Round(GNow);<br \/>\n          peBlue := Round(BNow);<br \/>\n        end;<br \/>\n      RNow := RNow + RStep;<br \/>\n      GNow := GNow + GStep;<br \/>\n      BNow := BNow + BStep;<br \/>\n    end;<br \/>\n  with palPalEntry[Steps &#8211; 1] do<br \/>\n    begin<br \/>\n      peRed := R2;<br \/>\n      peGreen := G2;<br \/>\n      peBlue := B2;<br \/>\n    end;<br \/>\nend;<\/p>\n<p>procedure TForm1.FormCreate(Sender: TObject);<br \/>\nvar<br \/>\n  xHDC : HDC;<br \/>\n  nStaticColors : Word;<br \/>\n  I : Word;<br \/>\n  BlackPal : PLogPalette;<br \/>\nbegin<br \/>\n  Randomize;<br \/>\n  SaverKind := Random(2);<br \/>\n  If SaverKind = 1<br \/>\n    Then<br \/>\n      Color := clBlack;<br \/>\n  Application.OnIdle := Timer2Timer;<br \/>\n  PalSize := SizeOf(TLogPalette) + 255 * SizeOf(TPaletteEntry);<br \/>\n  GetMem(Pal, PalSize);<br \/>\n  With Pal^ do<br \/>\n    Begin<br \/>\n      palVersion := $0300;<br \/>\n      palNumEntries := 256;<br \/>\n      xHDC := Canvas.Handle;<br \/>\n  { This assumes SYSPAL_STATIC, but will work under SYSPAL_NOSTATIC; if<br \/>\n    you need more colors, check out GetSystemPaletteUse and<br \/>\nSetSystemPaletteUse<br \/>\n    Get the twenty static colors into the array, then fill in the empty<br \/>\n    spaces with the given color table }<\/p>\n<p>    { Get the static colors from the system palette }<br \/>\n    nStaticColors := GetDeviceCaps(xHDC, NUMRESERVED);<br \/>\n    if nStaticColors = 0<br \/>\n      Then<br \/>\n        nStaticColors := 20; { &#8220;Fake&#8221; static colors }<br \/>\n    GetSystemPaletteEntries(xHDC, 0, 256, palPalEntry);<br \/>\n    { Set the peFlags of the lower static colors to zero }<br \/>\n    nStaticColors := nStaticColors shr 1; { half at bottom, half at top}<br \/>\n    for i:= 0 to (nStaticColors-1) do<br \/>\n      palPalEntry[i].peFlags := 0;<\/p>\n<p>    I := 0;<br \/>\n    MakeGradient(255,   0,   0, 255, 127,   0, 40, palPalEntry[ i+10]);<br \/>\n    MakeGradient(255, 127,   0, 255, 255,   0, 40, palPalEntry[ i+49]);<br \/>\n    MakeGradient(255, 255,   0,   0, 255,   0, 40, palPalEntry[ i+88]);<br \/>\n    MakeGradient(  0, 255,   0,   0,   0, 255, 41, palPalEntry[i+128]);<br \/>\n    MakeGradient(  0,   0, 255, 255,   0, 255, 41, palPalEntry[i+168]);<br \/>\n    MakeGradient(255,   0, 255, 255,   0,   0, 40, palPalEntry[i+206]);<\/p>\n<p>    For I := 0 to 235 do<br \/>\n      With palPalEntry[nStaticColors + I] do<br \/>\n        peFlags :=PC_RESERVED; { Prepare for palette animation }<\/p>\n<p>    { Mark empty entries as PC_NOCOLLAPSE }<br \/>\n    for i := (nStaticColors + 236) to (255-nStaticColors) do<br \/>\n      palPalEntry[i].peFlags := PC_NOCOLLAPSE;<\/p>\n<p>    { Set the peFlags of the upper static colors to zero }<br \/>\n    for i := (256 &#8211; nStaticColors) to 255 do<br \/>\n      palPalEntry[i].peFlags := 0;<\/p>\n<p>    GetMem(BlackPal, PalSize);<br \/>\n    Move(Pal^, BlackPal^, PalSize);<br \/>\n    I := 10;<br \/>\n    FillChar(BlackPal^.palPalEntry[I], SizeOf(TPALETTEENTRY) * 236, 0);<br \/>\n    For I := 10 to 245 do<br \/>\n      BlackPal^.palPalEntry[I].peFlags := PC_RESERVED;<br \/>\n    BluePalette := CreatePalette(BlackPal^);<br \/>\n    FreeMem(BlackPal, PalSize);<br \/>\n    end;<br \/>\nend;<\/p>\n<p>procedure TForm1.FormDestroy(Sender: TObject);<br \/>\nbegin<br \/>\n  { Delete the palette we created earlier }<br \/>\n  DeleteObject(BluePalette);<br \/>\n  FreeMem(Pal, PalSize);<br \/>\nend;<\/p>\n<p>function TForm1.GetPalette : HPALETTE;<br \/>\nbegin<br \/>\n  Result := BluePalette;<br \/>\nend;<\/p>\n<p>procedure TForm1.FormPaint(Sender: TObject);<br \/>\nvar<br \/>\n  OldPal : HPALETTE;<br \/>\n  YPos, BarWidth : Real;<br \/>\n  i : Word;<br \/>\nbegin<br \/>\n  OldPal := SelectPalette(Canvas.Handle, BluePalette, True);<br \/>\n  RealizePalette(Canvas.Handle);<br \/>\n  BarWidth := clientheight \/ 236;<br \/>\n  Case SaverKind of<br \/>\n    0 : Begin<br \/>\n  YPos := 0;<br \/>\n  For i := 10 to 245 do<br \/>\n    begin<br \/>\n      If UsingOurPalette<br \/>\n        Then<br \/>\n          canvas.brush.color := PaletteIndex(i)<br \/>\n        Else<br \/>\n          with Pal^.palPalEntry[i] do<br \/>\n            canvas.brush.color := RGB(peRed, peGreen, peBlue);<br \/>\n       canvas.fillrect(rect(0, Round(YPos),<br \/>\n                       ClientWidth &#8211; 1, Round(YPos + BarWidth)));<br \/>\n      YPos := YPos + BarWidth;<br \/>\n    end;<br \/>\n        End;<br \/>\n    End;<br \/>\n  SelectPalette(Canvas.Handle, OldPal, True);<br \/>\n  RealizePalette(Canvas.Handle);<br \/>\nend;<\/p>\n<p>procedure TForm1.FormResize(Sender: TObject);<br \/>\nbegin<br \/>\n  Invalidate;<br \/>\nend;<\/p>\n<p>procedure Fade(Steps : Word; MyPal : PLogPalette;<br \/>\n               BluePalette : HPALETTE; Dir : TFadeDirection);<br \/>\ntype<br \/>\n  TRealPalEntry = Record<br \/>\n    reRed : Real;<br \/>\n    reGreen : Real;<br \/>\n    reBlue : Real;<br \/>\n    End;<br \/>\n  TRealPal = Array[0..255] of TRealPalEntry;<\/p>\n<p>var<br \/>\n  OldPal : HPalette;<br \/>\n  FadeRealPal : ^TRealPal;<br \/>\n  FadeStepsPal : ^TRealPal;<br \/>\n  FinalPal : PLogPalette;<br \/>\n  I, J : Word;<br \/>\n  Ten : Word;<br \/>\n  TempPalette : HPalette;<\/p>\n<p>  PalSize : Word;<br \/>\n  Pal : PLogPalette;<\/p>\n<p>begin<br \/>\n  Ten := 10;<br \/>\n  GetMem(FadeRealPal, SizeOf(TRealPalEntry) * 236);<br \/>\n  GetMem(FadeStepsPal, SizeOf(TRealPalEntry) * 236);<br \/>\n  PalSize := SizeOf(TLogPalette) + 255 * SizeOf(TPaletteEntry);<br \/>\n  GetMem(Pal, PalSize);<br \/>\n  GetMem(FinalPal, PalSize);<br \/>\n  Move(MyPal^, Pal^, PalSize);<br \/>\n  Move(Pal^, FinalPal^, PalSize);<br \/>\n  {$R-}<br \/>\n  If Dir = fdOut<br \/>\n    Then<br \/>\n      For I := 0 to 235 do<br \/>\n        With FadeStepsPal^[I], Pal^.palPalEntry[I+10] do<br \/>\n          begin<br \/>\n            reRed := -peRed \/ Steps;<br \/>\n            reBlue := -peBlue \/ Steps;<br \/>\n            reGreen := -peGreen \/ Steps;<br \/>\n          end<br \/>\n    Else<br \/>\n      For I := 0 to 235 do<br \/>\n        With FadeStepsPal^[I], Pal^.palPalEntry[I+10] do<br \/>\n          begin<br \/>\n            reRed := peRed \/ Steps;<br \/>\n            reBlue := peBlue \/ Steps;<br \/>\n            reGreen := peGreen \/ Steps;<br \/>\n          end;<br \/>\n  if Dir = fdIn<br \/>\n    Then<br \/>\n      Begin<br \/>\n        FillChar(Pal^.palPalEntry[Ten], SizeOf(TPALETTEENTRY) * 236, 0);<br \/>\n        FillChar(FadeRealPal^, SizeOf(TRealPalEntry) * 236, 0);<br \/>\n      End<br \/>\n    Else<br \/>\n      Begin<br \/>\n        FillChar(FinalPal^.palPalEntry[Ten], SizeOf(TPALETTEENTRY) * 236,<br \/>\n0);<br \/>\n        For I := 0 to 235 do<br \/>\n          With FadeRealPal^[I], Pal^.palPalEntry[I+10] do<br \/>\n            begin<br \/>\n              reRed := peRed;<br \/>\n              reBlue := peBlue;<br \/>\n              reGreen := peGreen;<br \/>\n            end<br \/>\n      End;<\/p>\n<p>  For I := 0 to 235 do<br \/>\n    begin<br \/>\n      Pal^.palPalEntry[I+10].peFlags := PC_RESERVED;<br \/>\n      FinalPal^.palPalEntry[I + 10].peFlags := PC_RESERVED;<br \/>\n    end;<\/p>\n<p>  For I := 1 to Steps &#8211; 1 do<br \/>\n    Begin<br \/>\n      AnimatePalette(BluePalette, 10, 236, Addr(Pal^.palPalEntry[Ten]));<\/p>\n<p>      For J := 0 to 235 do<br \/>\n        Begin<br \/>\n          With FadeRealPal^[J] do<br \/>\n            Begin<br \/>\n              reRed := reRed + FadeStepsPal^[J].reRed;<br \/>\n              reGreen := reGreen + FadeStepsPal^[J].reGreen;<br \/>\n              reBlue := reBlue + FadeStepsPal^[J].reBlue;<br \/>\n            End;<br \/>\n          With Pal^.palpalEntry[J+10] do<br \/>\n            Begin<br \/>\n              peRed := Round(FadeRealPal^[J].reRed);<br \/>\n              peGreen := Round(FadeRealPal^[J].reGreen);<br \/>\n              peBlue := Round(FadeRealPal^[J].reBlue);<br \/>\n            End;<br \/>\n        End;<br \/>\n    End;<br \/>\n  AnimatePalette(BluePalette, 10, 236, Addr(FinalPal^.palPalEntry[Ten]));<br \/>\n  FreeMem(FinalPal, PalSize);<br \/>\n  FreeMem(Pal, PalSize);<br \/>\n  FreeMem(FadeRealPal, SizeOf(TRealPalEntry) * 236);<br \/>\n  FreeMem(FadeStepsPal, SizeOf(TRealPalEntry) * 236);<br \/>\nend;<\/p>\n<p>const<br \/>\n  Started : Boolean = False;<br \/>\n  BallColor : Word = 245;<br \/>\n  YDir : Integer = -2;<br \/>\n  XDir : Integer = 1;<br \/>\n  RX : Integer = 100;<br \/>\n  RY : Integer = 200;<\/p>\n<p>procedure TForm1.Timer1Timer(Sender: TObject);<br \/>\nvar<br \/>\n  Temp : TPALETTEENTRY;<br \/>\n  F, G : Word;<br \/>\n  OldPal : HPalette;<br \/>\nconst<br \/>\n  PalStart : word = 10;<br \/>\n  PalEnd : word = 245;<br \/>\nbegin<br \/>\n  If not Started<br \/>\n    Then<br \/>\n      Started := True;<br \/>\n  With pal^ do<br \/>\n    Begin<br \/>\n      Temp := palPalEntry[palStart];<br \/>\n      For F := palStart to (palEnd &#8211; 1) do<br \/>\n        palPalEntry[F] := palPalEntry[F+1];<br \/>\n      palPalEntry[palEnd] := Temp;<br \/>\n      AnimatePalette(BluePalette, PalStart, (PalEnd + 1 &#8211;<br \/>\nPalStart),Addr(palPalEntry[palStart]))<br \/>\n    End;<br \/>\n  OldPal := SelectPalette(Canvas.Handle, BluePalette, True);<br \/>\n  RealizePalette(Canvas.Handle);<br \/>\n  Case SaverKind of<br \/>\n    1 :<br \/>\n      Begin<br \/>\n  canvas.brush.color := PaletteIndex(BallColor);<br \/>\n  canvas.fillrect(Rect(RX, RY, RX+20, RY+20));<br \/>\n  Inc(RX, XDir);<br \/>\n  If (RX + 20 >= clientwidth) or (RX < 0)\n    Then\n      XDir := -XDir;\n  Inc(RY, YDir);\n  If (RY+20 >= clientheight) or (RY < 0)\n    Then\n      YDir := -YDir;\n  Dec(BallColor);\n  If BallColor = 9\n    Then\n      BallColor := 245;\n      End;\n    End;\n  SelectPalette(Canvas.Handle, OldPal, True);\n  RealizePalette(Canvas.Handle);\nend;\n\n\nprocedure TForm1.FormClick(Sender: TObject);\nbegin\n  If Started\n    Then\n      Begin\n        Fade(128, Pal, BluePalette, fdOut);\n        Close;\n      End;\nend;\n\nconst\n  FirstTime : Boolean = True;\n\nprocedure TForm1.Timer2Timer(Sender: TObject; var Done: Boolean);\nbegin\n  If FirstTime\n    Then\n      Begin\n        FirstTime := False;\n        Fade(128, Pal, BluePalette, fdIn);\n        Timer1.Enabled := True;\n        Done := False;\n      End;\nend;\n\nprocedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);\nbegin\n  FormClick(Sender);\nend;\n\nprocedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,\n  Y: Integer);\nbegin\n  FormClick(Sender);\nend;\n\nend.\n[\/code]\n\n[tags]Delphi, Graphic[\/tags]\n<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wilhelm Steinbu\u00df wrote in message 37724E4C.5A37E97C@fh-trier.de&#8230; > Hi, > > I will made a rainborrow with two or more colors. > > A&hellip;<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"spay_email":""},"categories":[11],"tags":[75,101],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/p71Tml-2a","_links":{"self":[{"href":"https:\/\/www.nsonic.de\/blog\/wp-json\/wp\/v2\/posts\/134"}],"collection":[{"href":"https:\/\/www.nsonic.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.nsonic.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.nsonic.de\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.nsonic.de\/blog\/wp-json\/wp\/v2\/comments?post=134"}],"version-history":[{"count":0,"href":"https:\/\/www.nsonic.de\/blog\/wp-json\/wp\/v2\/posts\/134\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.nsonic.de\/blog\/wp-json\/wp\/v2\/media?parent=134"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.nsonic.de\/blog\/wp-json\/wp\/v2\/categories?post=134"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.nsonic.de\/blog\/wp-json\/wp\/v2\/tags?post=134"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}