spColorCtrls.pas
上传用户:hylc_2004
上传日期:2014-01-23
资源大小:46800k
文件大小:23k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. {*******************************************************************}
  2. {                                                                   }
  3. {       Almediadev Visual Component Library                         }
  4. {       DynamicSkinForm                                             }
  5. {       Version 5.60                                                }
  6. {                                                                   }
  7. {       Copyright (c) 2000-2003 Almediadev                          }
  8. {       ALL RIGHTS RESERVED                                         }
  9. {                                                                   }
  10. {       Home:  http://www.almdev.com                                }
  11. {       Support: support@almdev.com                                 }
  12. {                                                                   }
  13. {*******************************************************************}
  14. unit spColorCtrls;
  15. interface
  16. uses Windows, SysUtils, Messages, Classes, Graphics, Controls, Forms,
  17.      DynamicSkinForm, SkinData, SkinCtrls, SkinBoxCtrls, Dialogs,
  18.      StdCtrls, ExtCtrls, spEffBmp;
  19. type
  20.   TspSkinColorGrid = class(TspSkinPanel)
  21.   private
  22.     FColorValue: TColor;
  23.     FOnChange: TNotifyEvent;
  24.     FColCount, FRowCount: Integer;
  25.     procedure SetColCount(Value: Integer);
  26.     procedure SetRowCount(Value: Integer);
  27.     procedure SetColorValue(Value: TColor);
  28.   protected
  29.     procedure DrawCursor(Cnvs: TCanvas; R: TRect; pmNotMode: Boolean);
  30.     function CheckColor(Value: TColor): boolean;
  31.     procedure CreateControlDefaultImage(B: TBitMap); override;
  32.     procedure CreateControlSkinImage(B: TBitMap); override;
  33.     procedure PaintGrid(Cnvs: TCanvas);
  34.     procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
  35.       X, Y: Integer); override;
  36.   public
  37.     constructor Create(AOwner: TComponent); override;
  38.     destructor Destroy; override;
  39.   published
  40.     property RowCount: Integer read FRowCount write SetRowCount;
  41.     property ColCount: Integer read FColCount write SetColCount;
  42.     property ColorValue: TColor read FColorValue write SetColorValue;
  43.     property OnChange: TNotifyEvent  read FOnChange write FOnChange;
  44.   end;
  45.   TspColorViewer = class(TGraphicControl)
  46.   private
  47.     FColorValue: TColor;
  48.     procedure SetColorValue(Value: TColor);
  49.   public
  50.     constructor Create(AOwner: TComponent); override;
  51.     procedure Paint; override;
  52.   published
  53.     property ColorValue: TColor read FColorValue write SetColorValue; 
  54.   end;
  55.   TspSkinColorDialog = class(TComponent)
  56.   private
  57.     RGBStopCheck: Boolean;
  58.     HSLStopCheck: Boolean;
  59.   protected
  60.     FColor: TColor;
  61.     FCaption: String;
  62.     FSD: TspSkinData;
  63.     FCtrlFSD: TspSkinData;
  64.     FButtonSkinDataName: String;
  65.     FEditSkinDataName: String;
  66.     FLabelSkinDataName: String;
  67.     FDefaultLabelFont: TFont;
  68.     FDefaultEditFont: TFont;
  69.     FDefaultButtonFont: TFont;
  70.     FAlphaBlend: Boolean;
  71.     FAlphaBlendAnimation: Boolean;
  72.     FAlphaBlendValue: Byte;
  73.     FUseSkinFont: Boolean;
  74.     //
  75.     ColorGrid: TspSkinColorGrid;
  76.     OkButton, CancelButton: TspSkinButton;
  77.     ColorViewer: TspColorViewer;
  78.     REdit, GEdit, BEdit: TspSkinTrackEdit;
  79.     RLabel, GLabel, BLabel, EQLabel: TspSkinStdLabel;
  80.     HEdit, LEdit, SEdit: TspSkinTrackEdit;
  81.     HLabel, LLabel, SLabel: TspSkinStdLabel;
  82.     //
  83.     procedure SetDefaultLabelFont(Value: TFont);
  84.     procedure SetDefaultButtonFont(Value: TFont);
  85.     procedure SetDefaultEditFont(Value: TFont);
  86.     procedure Notification(AComponent: TComponent;  Operation: TOperation); override;
  87.     procedure ColorGridChange(Sender: TObject);
  88.     procedure RGBEditChange(Sender: TObject);
  89.     procedure HSLEditChange(Sender: TObject);
  90.   public
  91.     constructor Create(AOwner: TComponent); override;
  92.     destructor Destroy; override;
  93.     function Execute: Boolean;
  94.   published
  95.     property Color: TColor read FColor write FColor;
  96.     property Caption: String read FCaption write FCaption;
  97.     property AlphaBlend: Boolean read FAlphaBlend write FAlphaBlend;
  98.     property AlphaBlendValue: Byte read FAlphaBlendValue write FAlphaBlendValue;
  99.     property AlphaBlendAnimation: Boolean
  100.       read FAlphaBlendAnimation write FAlphaBlendAnimation;
  101.     property SkinData: TspSkinData read FSD write FSD;
  102.     property CtrlSkinData: TspSkinData read FCtrlFSD write FCtrlFSD;
  103.     property ButtonSkinDataName: String
  104.       read FButtonSkinDataName write FButtonSkinDataName;
  105.     property LabelSkinDataName: String
  106.       read FLabelSkinDataName write FLabelSkinDataName;
  107.     property EditSkinDataName: String
  108.      read FEditSkinDataName write FEditSkinDataName;
  109.     property DefaultLabelFont: TFont read FDefaultLabelFont write SetDefaultLabelFont;
  110.     property DefaultButtonFont: TFont read FDefaultButtonFont write SetDefaultButtonFont;
  111.     property DefaultEditFont: TFont read FDefaultEditFont write SetDefaultEditFont;
  112.     property UseSkinFont: Boolean read FUseSkinFont write FUseSkinFont;
  113.   end;
  114. implementation
  115. Uses spUtils, Math, spConst;
  116. const
  117.   ColorValues: array[1..48] of TColor =
  118.   (0, 64, 128, 4210816, 255, 8421631, 32896, 16512, 33023, 4227327, 65535, 8454143,
  119.    4227200, 16384, 32768, 65280, 65408, 8454016, 8421504, 4210688, 4227072, 8421376, 4259584, 8453888,
  120.    8421440, 8388608, 16711680, 8404992, 16776960, 16777088, 12632256, 4194304, 10485760, 16744576, 12615680, 16744448,
  121.    4194368, 5194368, 8388736, 4194432, 12615808, 12615935, 16777215, 8388672, 16711808, 8388863, 16711935, 16744703);
  122. procedure ColorToR_G_B(C: TColor; var R, G, B: Byte);
  123. begin
  124.   R := C and $FF;
  125.   G := (C shr 8) and $FF;
  126.   B := (C shr 16) and $FF;
  127. end;
  128. function R_G_BToColor(R, G, B: Byte): TColor;
  129. begin
  130.   Result := RGB(R, G, B);
  131. end;
  132. procedure RGBToHSL1(AR, AV, AB: Byte; var H, S, L: Double);
  133. var
  134.   R,
  135.   G,
  136.   B,
  137.   D,
  138.   Cmax,
  139.   Cmin: double;
  140. begin
  141.   R := AR / 255;
  142.   G := AV / 255;
  143.   B := AB / 255;
  144.   Cmax := Max (R, Max (G, B));
  145.   Cmin := Min (R, Min (G, B));
  146. // calculate luminosity
  147.   L := (Cmax + Cmin) / 2;
  148.   if Cmax = Cmin then  // it's grey
  149.   begin
  150.     H := 0; // it's actually undefined
  151.     S := 0
  152.   end else begin
  153.     D := Cmax - Cmin;
  154. // calculate Saturation
  155.     if L < 0.5 then
  156.       S := D / (Cmax + Cmin)
  157.     else
  158.       S := D / (2 - Cmax - Cmin);
  159. // calculate Hue
  160.     if R = Cmax then
  161.       H := (G - B) / D
  162.     else
  163.       if G = Cmax then
  164.         H  := 2 + (B - R) /D
  165.       else
  166.         H := 4 + (R - G) / D;
  167.     H := H / 6;
  168.     if H < 0 then
  169.       H := H + 1;
  170.   end;
  171. end;
  172. procedure RGBToHSL2(AR, AG, AB: Byte; var H, S, L: Integer);
  173. var
  174.   RGB: array[0..2] of Double;
  175.   MinIndex, MaxIndex: Integer;
  176.   Range: Double;
  177.   H1 : Double;
  178. begin
  179.   RGB[0]:= AR;
  180.   RGB[1]:= AG;
  181.   RGB[2]:= AB;
  182.   MinIndex:= 0;
  183.   if AG < AR then MinIndex:= 1;
  184.   if AB < RGB[MinIndex] then MinIndex:= 2;
  185.   MaxIndex:= 0;
  186.   if AG > AR then MaxIndex:= 1;
  187.   if AB > RGB[MaxIndex] then MaxIndex:= 2;
  188.   Range:= RGB[MaxIndex] - RGB[MinIndex];
  189.   if Range = 0
  190.   then
  191.     begin
  192.       S := 0;
  193.       L := Round(100 * AR / 255); 
  194.     end
  195.   else
  196.     begin
  197.       H1 := MaxIndex * 2 + (AR - AG) / Range;
  198.       S := Round(Range / RGB[MaxIndex] * 100);
  199.       L :=  Round(100 * (RGB[MaxIndex] / 255));
  200.       H1 := H1 / 6;
  201.       if H1 < 0 then H1 := H1 + 1;
  202.       H := Round(H1 * 359);
  203.     end;
  204. end;
  205. procedure RGBToHSL(AR, AG, AB: Byte; var RH, RS, RL: Integer);
  206. var
  207.   H, S, L: Double;
  208. begin
  209.   RGBToHSL1(AR, AG, AB, H, S, L);
  210.   RGBToHSL2(AR, AG, AB, RH, RS, RL);
  211.   if RS <> 0 then RH := Round(H * 359);
  212. end;
  213. procedure HSLToRGB(var R, G, B: Byte; RH, RS, RL: Integer);
  214. const 
  215.   SectionSize = 60/360; 
  216. var 
  217.   Section: Double; 
  218.   SectionIndex: Integer; 
  219.   f, p, q, t, H, S, L: Double;
  220. begin
  221.   H := RH / 360;
  222.   S := RS / 100;
  223.   L := (255 * RL / 100);
  224.   if S = 0
  225.   then
  226.     begin
  227.       R := Round(L);
  228.       G := R;
  229.       B := R;
  230.     end
  231.   else
  232.    begin
  233.      Section := H / SectionSize;
  234.      SectionIndex := Floor(Section);
  235.      f := Section - SectionIndex;
  236.      p := L * ( 1 - S );
  237.      q := L * ( 1 - S * f );
  238.      t := L * ( 1 - S * ( 1 - f ) );
  239.      case SectionIndex of
  240.       0:
  241.         begin
  242.           R := Round(L);
  243.           G := Round(t);
  244.           B := Round(p);
  245.         end;
  246.       1:
  247.         begin
  248.           R:= Round(q);
  249.           G:= Round(L);
  250.           B:= Round(p);
  251.         end;
  252.       2:
  253.         begin
  254.           R := Round(p);
  255.           G := Round(L);
  256.           B := Round(t);
  257.         end;
  258.       3:
  259.         begin
  260.           R := Round(p);
  261.           G := Round(q);
  262.           B := Round(L);
  263.         end;
  264.       4:
  265.         begin
  266.           R:= Round(t);
  267.           G:= Round(p);
  268.           B:= Round(L);
  269.         end;
  270.     else
  271.       R := Round(L);
  272.       G := Round(p);
  273.       B := Round(q);
  274.     end;
  275.   end;
  276. end;
  277. constructor TspSkinColorGrid.Create(AOwner: TComponent);
  278. begin
  279.   inherited;
  280.   ControlStyle := ControlStyle - [csAcceptsControls];
  281.   CaptionMode := True;
  282.   Caption := SP_COLORGRID_CAP;
  283.   BorderStyle := bvFrame;
  284.   Width := 280;
  285.   Height := 115;
  286.   FColorValue := 0;
  287.   FColCount := 12;
  288.   FRowCount := 4;
  289. end;
  290. destructor TspSkinColorGrid.Destroy;
  291. begin
  292.   inherited;
  293. end;
  294. procedure TspSkinColorGrid.SetColCount(Value: Integer);
  295. begin
  296.   if Value < 1 then Exit;
  297.   FColCount := Value;
  298.   RePaint;
  299. end;
  300. procedure TspSkinColorGrid.SetRowCount(Value: Integer);
  301. begin
  302.   FRowCount := Value;
  303.   RePaint;
  304. end;
  305. procedure TspSkinColorGrid.DrawCursor;
  306. var
  307.   CX, CY, Rd: Integer;
  308. begin
  309.   CX := R.Left + RectWidth(R) div 2;
  310.   CY := R.Top + RectHeight(R) div 2;
  311.   if RectWidth(R) > RectHeight(R)
  312.   then
  313.     Rd := RectHeight(R) div 2 - 2
  314.   else
  315.     Rd := RectWidth(R) div 2 - 2;
  316.   with Cnvs do
  317.   begin
  318.     if pmNotMode then Pen.Mode := pmNot else Pen.Color := 0;
  319.     MoveTo(CX - rd, CY); LineTo(CX - 2, CY);
  320.     MoveTo(CX + 3, CY); LineTo(CX + rd + 1, CY);
  321.     MoveTo(CX, CY - rd); LineTo(CX, CY - 2);
  322.     MoveTo(CX, CY + 3); LineTo(CX, CY + rd);
  323.   end;
  324. end;
  325. procedure TspSkinColorGrid.PaintGrid(Cnvs: TCanvas);
  326. var
  327.   X, Y, CW, CH, i, j, k: Integer;
  328.   R, Rct: TRect;
  329. begin
  330.   R := Rect(0, 0, Width, Height);
  331.   AdjustClientRect(R);
  332.   CW := (RectWidth(R) - ColCount * 2) div ColCount;
  333.   CH := (RectHeight(R) - RowCount * 2) div RowCount;
  334.   Y := R.Top + 1;
  335.   k := 0;
  336.   for i := 1 to RowCount do
  337.   begin
  338.     X := R.Left + 1;
  339.     for j := 1 to ColCount do
  340.     begin
  341.       Inc(k);
  342.       with Cnvs do
  343.       begin
  344.         Brush.Color := ColorValues[k];
  345.         Rct := Rect(X, Y, X + CW, Y + CH);
  346.         FillRect(Rct);
  347.         if FColorValue = ColorValues[k]
  348.         then
  349.           begin
  350.             if ColorValues[k] <> clGray
  351.             then
  352.               DrawCursor(Cnvs, Rct, True)
  353.             else
  354.               DrawCursor(Cnvs, Rct, False);
  355.           end
  356.       end;
  357.       Inc(X, CW + 2);
  358.     end;
  359.     Inc(Y, CH + 2);
  360.   end;
  361. end;
  362. procedure TspSkinColorGrid.CreateControlDefaultImage;
  363. begin
  364.   inherited;
  365.   PaintGrid(B.Canvas);
  366. end;
  367. procedure TspSkinColorGrid.CreateControlSkinImage;
  368. begin
  369.   inherited;
  370.   PaintGrid(B.Canvas);
  371. end;
  372. function TspSkinColorGrid.CheckColor(Value: TColor): boolean;
  373. var
  374.   I: Integer;
  375. begin
  376.   Result := False;
  377.   for I := 1 to 48 do
  378.     if ColorValues[I] = Value
  379.     then
  380.       begin
  381.         Result := True;
  382.         Break;
  383.       end;
  384. end;
  385. procedure TspSkinColorGrid.SetColorValue(Value: TColor);
  386. begin
  387.   FColorValue := Value;
  388.   if CheckColor(FColorValue)
  389.   then
  390.     begin
  391.       if Assigned(FOnChange) then FOnChange(Self);
  392.       RePaint;
  393.     end;
  394. end;
  395. procedure TspSkinColorGrid.MouseDown(Button: TMouseButton; Shift: TShiftState;
  396.                                      X, Y: Integer);
  397. var
  398.   X1, Y1, CW, CH, i, j, k: Integer;
  399.   R, Rct: TRect;
  400. begin
  401.   inherited;
  402.   R := Rect(0, 0, Width, Height);
  403.   AdjustClientRect(R);
  404.   CW := (RectWidth(R) - ColCount * 2) div ColCount;
  405.   CH := (RectHeight(R) - RowCount * 2) div RowCount;
  406.   Y1 := R.Top + 1;
  407.   k := 0;
  408.   for i := 1 to RowCount do
  409.   begin
  410.     X1 := R.Left + 1;
  411.     for j := 1 to ColCount do
  412.     begin
  413.       Inc(k);
  414.       Rct := Rect(X1, Y1, X1 + CW, Y1 + CH);
  415.       if PtInRect(Rct, Point(X, Y))
  416.       then
  417.         begin
  418.           ColorValue := ColorValues[k];
  419.           Break;
  420.         end;
  421.       Inc(X1, CW + 2);
  422.     end;
  423.     Inc(Y1, CH + 2);
  424.   end;  
  425. end;
  426. constructor TspColorViewer.Create(AOwner: TComponent);
  427. begin
  428.   inherited;
  429.   ControlStyle := ControlStyle + [csOpaque];
  430.   FColorValue := 0;
  431. end;
  432. procedure TspColorViewer.Paint;
  433. var
  434.   B: TBitMap;
  435. begin
  436.   B := TBitMap.Create;
  437.   B.Width := Width;
  438.   B.Height := Height;
  439.   with B.Canvas do
  440.   begin
  441.     Pen.Color := clBlack;
  442.     Brush.Color := FColorValue;
  443.     Rectangle(0, 0, Width, Height);
  444.   end;
  445.   Canvas.Draw(0, 0, B);
  446.   B.Free;
  447. end;
  448. procedure TspColorViewer.SetColorValue;
  449. begin
  450.   if FColorValue = Value then Exit;
  451.   FColorValue := Value;
  452.   RePaint;
  453. end;
  454. constructor TspSkinColorDialog.Create;
  455. begin
  456.   inherited Create(AOwner);
  457.   RGBStopCheck := False;
  458.   HSLStopCheck := False;
  459.   FColor := 0;
  460.   FAlphaBlend := False;
  461.   FAlphaBlendAnimation := False;
  462.   FAlphaBlendValue := 200;
  463.   FCaption := 'Set color';
  464.   FButtonSkinDataName := 'button';
  465.   FLabelSkinDataName := 'stdlabel';
  466.   FEditSkinDataName := 'edit';
  467.   FDefaultLabelFont := TFont.Create;
  468.   FDefaultButtonFont := TFont.Create;
  469.   FDefaultEditFont := TFont.Create;
  470.   FUseSkinFont := True;
  471.   with FDefaultLabelFont do
  472.   begin
  473.     Name := 'Arial';
  474.     Style := [];
  475.     Height := 14;
  476.   end;
  477.   with FDefaultButtonFont do
  478.   begin
  479.     Name := 'Arial';
  480.     Style := [];
  481.     Height := 14;
  482.   end;
  483.   with FDefaultEditFont do
  484.   begin
  485.     Name := 'Arial';
  486.     Style := [];
  487.     Height := 14;
  488.   end;
  489. end;
  490. destructor TspSkinColorDialog.Destroy;
  491. begin
  492.   FDefaultLabelFont.Free;
  493.   FDefaultButtonFont.Free;
  494.   FDefaultEditFont.Free;
  495.   inherited;
  496. end;
  497. procedure TspSkinColorDialog.HSLEditChange(Sender: TObject);
  498. var
  499.   R, G, B: Byte;
  500. begin
  501.   if HSLStopCheck then Exit;
  502.   HSLTORGB(R, G, B, HEdit.Value, SEdit.Value, LEdit.Value);
  503.   ColorViewer.ColorValue := R_G_BToColor(R, G, B);
  504.   RGBStopCheck := True;
  505.   REdit.Value := R;
  506.   GEdit.Value := G;
  507.   BEdit.Value := B;
  508.   RGBStopCheck := False;
  509. end;
  510. procedure TspSkinColorDialog.RGBEditChange(Sender: TObject);
  511. var
  512.   R, G, B: Byte;
  513.   H, S, L: Integer;
  514. begin
  515.   if RGBStopCheck then Exit;
  516.   ColorViewer.ColorValue := R_G_BToColor(REdit.Value, GEdit.Value, BEdit.Value);
  517.   ColorToR_G_B(ColorViewer.ColorValue, R, G, B);
  518.   HSLStopCheck := True;
  519.   RGBToHSL(R, G, B, H, S, L);
  520.   HEdit.Value := H;
  521.   SEdit.Value := S;
  522.   LEdit.Value := L;
  523.   HSLStopCheck := False;
  524. end;
  525. procedure TspSkinColorDialog.ColorGridChange(Sender: TObject);
  526. var
  527.   R, G, B: Byte;
  528.   H, S, L: Integer;
  529. begin
  530.   ColorToR_G_B(ColorGrid.ColorValue, R, G, B);
  531.   RGBStopCheck := True;
  532.   REdit.Value := R;
  533.   GEdit.Value := G;
  534.   BEdit.Value := B;
  535.   RGBStopCheck := False;
  536.   ColorViewer.ColorValue := ColorGrid.ColorValue;
  537.   RGBToHSL(R, G, B, H, S, L);
  538.   HSLStopCheck := True;
  539.   HEdit.Value := H;
  540.   SEdit.Value := S;
  541.   LEdit.Value := L;
  542.   HSLStopCheck := False;
  543. end;
  544. procedure TspSkinColorDialog.SetDefaultLabelFont;
  545. begin
  546.   FDefaultLabelFont.Assign(Value);
  547. end;
  548. procedure TspSkinColorDialog.SetDefaultEditFont;
  549. begin
  550.   FDefaultEditFont.Assign(Value);
  551. end;
  552. procedure TspSkinColorDialog.SetDefaultButtonFont;
  553. begin
  554.   FDefaultButtonFont.Assign(Value);
  555. end;
  556. procedure TspSkinColorDialog.Notification;
  557. begin
  558.   inherited Notification(AComponent, Operation);
  559.   if (Operation = opRemove) and (AComponent = FSD) then FSD := nil;
  560.   if (Operation = opRemove) and (AComponent = FCtrlFSD) then FCtrlFSD := nil;
  561. end;
  562. function TspSkinColorDialog.Execute: Boolean;
  563. var
  564.   Form: TForm;
  565.   DSF: TspDynamicSkinForm;
  566.   ButtonTop, ButtonWidth, ButtonHeight: Integer;
  567.   R, G, B: Byte;
  568. begin
  569.   Form := TForm.Create(Application);
  570.   Form.BorderStyle := bsDialog;
  571.   Form.Caption := FCaption;
  572.   Form.Position := poScreenCenter;
  573.   DSF := TspDynamicSkinForm.Create(Form);
  574.   DSF.BorderIcons := [];
  575.   DSF.SkinData := SkinData;
  576.   DSF.MenusSkinData := CtrlSkinData;
  577.   DSF.AlphaBlend := AlphaBlend;
  578.   DSF.AlphaBlendAnimation := AlphaBlendAnimation;
  579.   DSF.AlphaBlendValue := AlphaBlendValue;
  580.   DSF.Sizeable := False;
  581.   
  582.   try
  583.     with Form do
  584.     begin
  585.       ClientWidth := 280;
  586.     end;
  587.    ColorGrid := TspSkinColorGrid.Create(Form);
  588.    with ColorGrid do
  589.    begin
  590.      Parent := Form;
  591.      Align := alTop;
  592.      Height := 105;
  593.      SkinDataName := 'groupbox';
  594.      SkinData := CtrlSkinData;
  595.      OnChange := ColorGridChange;
  596.    end;
  597.   RLabel := TspSkinStdLabel.Create(Form);
  598.   with RLabel do
  599.   begin
  600.     Parent := Form;
  601.     Left := 5;
  602.     Top := ColorGrid.Top + ColorGrid.Height + 12;
  603.     DefaultFont := DefaultLabelFont;
  604.     UseSkinFont := Self.UseSkinFont;
  605.     SkinData := CtrlSkinData;
  606.     Caption := 'R:';
  607.   end;
  608.    REdit := TspSkinTrackEdit.Create(Self);
  609.    with REdit do
  610.    begin
  611.      Parent := Form;
  612.      JumpWhenClick := True;
  613.      SetBounds(RLabel.Left + RLabel.Width + 5, ColorGrid.Top + ColorGrid.Height + 10, 50, 21);
  614.      TrackBarWidth := 260;
  615.      MinValue := 0;
  616.      MaxValue := 255;
  617.      Value := 0;
  618.      SkinData := CtrlSkinData;
  619.      OnChange := RGBEditChange;
  620.    end;
  621.   GLabel := TspSkinStdLabel.Create(Form);
  622.   with GLabel do
  623.   begin
  624.     Parent := Form;
  625.     Left := REdit.Left + REdit.Width + 5;
  626.     Top := ColorGrid.Top + ColorGrid.Height + 12;
  627.     DefaultFont := DefaultLabelFont;
  628.     UseSkinFont := Self.UseSkinFont;
  629.     SkinData := CtrlSkinData;
  630.     Caption := 'G:';
  631.   end;
  632.    GEdit := TspSkinTrackEdit.Create(Self);
  633.    with GEdit do
  634.    begin
  635.      Parent := Form;
  636.      JumpWhenClick := True;
  637.      SetBounds(GLabel.Left + GLabel.Width + 5, ColorGrid.Top + ColorGrid.Height + 10, 50, 21);
  638.      TrackBarWidth := 260;
  639.      MinValue := 0;
  640.      MaxValue := 255;
  641.      Value := 0;
  642.      SkinData := CtrlSkinData;
  643.      OnChange := RGBEditChange;
  644.    end;
  645.   BLabel := TspSkinStdLabel.Create(Form);
  646.   with BLabel do
  647.   begin
  648.     Parent := Form;
  649.     Left := GEdit.Left + GEdit.Width + 5;
  650.     Top := ColorGrid.Top + ColorGrid.Height + 12;
  651.     DefaultFont := DefaultLabelFont;
  652.     UseSkinFont := Self.UseSkinFont;
  653.     SkinData := CtrlSkinData;
  654.     Caption := 'B:';
  655.   end;
  656.    BEdit := TspSkinTrackEdit.Create(Self);
  657.    with BEdit do
  658.    begin
  659.      Parent := Form;
  660.      JumpWhenClick := True;
  661.      SetBounds(BLabel.Left + BLabel.Width + 5, ColorGrid.Top + ColorGrid.Height + 10, 50, 21);
  662.      TrackBarWidth := 260;
  663.      MinValue := 0;
  664.      MaxValue := 255;
  665.      Value := 0;
  666.      SkinData := CtrlSkinData;
  667.      OnChange := RGBEditChange;
  668.    end;
  669.   EqLabel := TspSkinStdLabel.Create(Form);
  670.   with EqLabel do
  671.   begin
  672.     Parent := Form;
  673.     Left := BEdit.Left + BEdit.Width + 5;;
  674.     Top := ColorGrid.Top + ColorGrid.Height + 12;
  675.     DefaultFont := DefaultLabelFont;
  676.     UseSkinFont := Self.UseSkinFont;
  677.     SkinData := CtrlSkinData;
  678.     Caption := '=';
  679.   end;
  680.   ColorViewer := TspColorViewer.Create(Form);
  681.   with ColorViewer do
  682.   begin
  683.     Parent := Form;
  684.     SetBounds(EqLabel.Left + EqLabel.Width + 5, ColorGrid.Top + ColorGrid.Height + 10,
  685.      BEdit.Width, BEdit.Height);
  686.   end;
  687.   HLabel := TspSkinStdLabel.Create(Form);
  688.   with HLabel do
  689.   begin
  690.     Parent := Form;
  691.     Left := 5;
  692.     Top := ColorViewer.Top + ColorViewer.Height + 12;
  693.     DefaultFont := DefaultLabelFont;
  694.     UseSkinFont := Self.UseSkinFont;
  695.     SkinData := CtrlSkinData;
  696.     Caption := 'H:';
  697.   end;
  698.   HEdit := TspSkinTrackEdit.Create(Self);
  699.   with HEdit do
  700.   begin
  701.     Parent := Form;
  702.     JumpWhenClick := True;
  703.     SetBounds(HLabel.Left + HLabel.Width + 5, ColorViewer.Top + ColorViewer.Height + 10, 50, 21);
  704.     TrackBarWidth := 260;
  705.     MinValue := 0;
  706.     MaxValue := 359;
  707.     Value := 0;
  708.     SkinData := CtrlSkinData;
  709.     OnChange := HSLEditChange;
  710.   end;
  711.   SLabel := TspSkinStdLabel.Create(Form);
  712.   with SLabel do
  713.   begin
  714.     Parent := Form;
  715.     Left := HEdit.Left + HEdit.Width + 5;
  716.     Top := ColorViewer.Top + ColorViewer.Height + 12;
  717.     DefaultFont := DefaultLabelFont;
  718.     UseSkinFont := Self.UseSkinFont;
  719.     SkinData := CtrlSkinData;
  720.     Caption := 'S:';
  721.   end;
  722.   SEdit := TspSkinTrackEdit.Create(Self);
  723.   with SEdit do
  724.   begin
  725.     Parent := Form;
  726.     JumpWhenClick := True;
  727.     SetBounds(SLabel.Left + SLabel.Width + 6, ColorViewer.Top + ColorViewer.Height + 10, 50, 21);
  728.     TrackBarWidth := 120;
  729.     MinValue := 0;
  730.     MaxValue := 100;
  731.     Value := 0;
  732.     SkinData := CtrlSkinData;
  733.     OnChange := HSLEditChange;
  734.   end;
  735.   LLabel := TspSkinStdLabel.Create(Form);
  736.   with LLabel do
  737.   begin
  738.     Parent := Form;
  739.     Left := SEdit.Left + SEdit.Width + 5;
  740.     Top := ColorViewer.Top + ColorViewer.Height + 12;
  741.     DefaultFont := DefaultLabelFont;
  742.     UseSkinFont := Self.UseSkinFont;
  743.     SkinData := CtrlSkinData;
  744.     Caption := 'L:';
  745.   end;
  746.   LEdit := TspSkinTrackEdit.Create(Self);
  747.   with LEdit do
  748.   begin
  749.     Parent := Form;
  750.     JumpWhenClick := True;
  751.     SetBounds(LLabel.Left + LLabel.Width + 6, ColorViewer.Top + ColorViewer.Height + 10, 50, 21);
  752.     TrackBarWidth := 120;
  753.     MinValue := 0;
  754.     MaxValue := 100;
  755.     Value := 0;
  756.     SkinData := CtrlSkinData;
  757.     OnChange := HSLEditChange;
  758.   end;
  759.   ButtonTop := HEdit.Top + HEdit.Height + 20;
  760.   ButtonWidth := 70;
  761.   ButtonHeight := 25;
  762.    OkButton := TspSkinButton.Create(Form);
  763.    with OkButton do
  764.    begin
  765.      Parent := Form;
  766.      DefaultFont := DefaultButtonFont;
  767.      UseSkinFont := Self.UseSkinFont;
  768.      Caption := SP_MSG_BTN_OK;
  769.      ModalResult := mrOk;
  770.      Default := True;
  771.      SetBounds(Form.ClientWidth - ButtonWidth * 2 - 20, ButtonTop, ButtonWidth,
  772.                ButtonHeight);
  773.      DefaultHeight := ButtonHeight;
  774.      SkinDataName := FButtonSkinDataName;
  775.      SkinData := CtrlSkinData;
  776.    end;
  777.   CancelButton := TspSkinButton.Create(Form);
  778.   with CancelButton do
  779.   begin
  780.     Parent := Form;
  781.     DefaultFont := DefaultButtonFont;
  782.     UseSkinFont := Self.UseSkinFont;
  783.     Caption := SP_MSG_BTN_CANCEL;
  784.     ModalResult := mrCancel;
  785.     Cancel := True;
  786.     SetBounds(Form.ClientWidth - ButtonWidth - 10, ButtonTop, ButtonWidth,
  787.               ButtonHeight);
  788.     DefaultHeight := ButtonHeight;
  789.     SkinDataName := FButtonSkinDataName;
  790.     SkinData := CtrlSkinData;
  791.   end;
  792.   with Form do
  793.   begin
  794.     ClientHeight := CancelButton.Top + CancelButton.Height + 10;
  795.   end;
  796.   ColorViewer.ColorValue := Color;
  797.   ColorGrid.ColorValue := Color;
  798.   ColorToR_G_B(Color, R, G, B);
  799.   REdit.Value := R;
  800.   GEdit.Value := G;
  801.   BEdit.Value := B;
  802.     if Form.ShowModal = mrOk
  803.     then
  804.       begin
  805.         Color := ColorViewer.ColorValue;
  806.         Result := True;
  807.       end
  808.     else
  809.       Result := False;
  810.   finally
  811.     Form.Free;
  812.   end;
  813. end;
  814. end.