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

Delphi控件源码

开发平台:

Delphi

  1. {========================================================================}
  2. {=                (c) 1995-98 SwiftSoft Ronald Dittrich                 =}
  3. {========================================================================}
  4. {=                          All Rights Reserved                         =}
  5. {========================================================================}
  6. {=  D 01099 Dresden             = Fax.: +49(0)351-8037944               =}
  7. {=  Loewenstr.7a                = info@swiftsoft.de                     =}
  8. {========================================================================}
  9. {=  Actual versions on http://www.swiftsoft.de/index.html               =}
  10. {========================================================================}
  11. {=  This code is for reference purposes only and may not be copied or   =}
  12. {=  distributed in any format electronic or otherwise except one copy   =}
  13. {=  for backup purposes.                                                =}
  14. {=                                                                      =}
  15. {=  No Delphi Component Kit or Component individually or in a collection=}
  16. {=  subclassed or otherwise from the code in this unit, or associated   =}
  17. {=  .pas, .dfm, .dcu, .asm or .obj files may be sold or distributed     =}
  18. {=  without express permission from SwiftSoft.                          =}
  19. {=                                                                      =}
  20. {=  For more licence informations please refer to the associated        =}
  21. {=  HelpFile.                                                           =}
  22. {========================================================================}
  23. {=  $Date: 26.11.98 - 00:54:58 $                                        =}
  24. {========================================================================}
  25. unit MMClrBtn;
  26. {$I COMPILER.INC}
  27. interface
  28. uses
  29. {$IFDEF WIN32}
  30.     Windows,
  31. {$ELSE}
  32.     WinTypes,
  33.     WinProcs,
  34. {$ENDIF}
  35.     SysUtils,
  36.     Graphics,
  37.     Messages,
  38.     StdCtrls,
  39.     Classes,
  40.     Controls,
  41.     Dialogs,
  42.     MMObj,
  43.     MMUtils,
  44.     MMButton,
  45.     MMString;
  46. const
  47.     GridRows        = 5;
  48.     GridCols        = 4;
  49.     GridCells       = GridRows*GridCols;
  50.     GridCellSize    = 18;
  51.     GridMargin      = 3;
  52.     GridWidth       = GridCols * GridCellSize;
  53.     PopupWidth      = GridWidth + 2*GridMargin;
  54.     GridHeight      = GridRows * GridCellSize;
  55.     CustomLeft      = GridWidth-GridCellSize;
  56.     DelimTop        = GridHeight + GridMargin div 2;
  57.     CustomTop       = DelimTop + GridMargin div 2 + GridMargin;
  58.     PopupHeight     = CustomTop + GridCellSize + 2*GridMargin;
  59.     
  60.     MM_DROPCOLORDLG = MM_USER + 1;
  61. type
  62.     {-- TMMColorSpeedButton --------------------------------------------------}
  63.     TMMCustomColorButton= class;
  64.     TMMColorSpeedButton = class(TMMSpeedButton)
  65.     private
  66.         function        GetColorButton: TMMCustomColorButton;
  67.     protected
  68.         procedure       Paint; override;
  69.         procedure       FocusLine(X1, Y1, X2, Y2: integer);
  70.         procedure       DrawColor(Canvas: TCanvas; const Rect: TRect);
  71.         procedure       DrawDelimiter(Canvas: TCanvas; Left, Top, Bottom: Integer);
  72.     public
  73.         property        ColorButton: TMMCustomColorButton read GetColorButton;
  74.     end;
  75.     {-- TMMColorPopup --------------------------------------------------------}
  76.     TMMColorPopUp       = class(TMMCustomControl)
  77.     private
  78.         FOpened         : Boolean;
  79.         FIndex          : Integer;
  80.         FColors         : array[0..GridCells-1] of TColor;
  81.         FDrawCustom     : Boolean;
  82.         FButton         : TButton;
  83.         FSave           : Pointer;
  84.         function        GetButtonCaption: string;
  85.         procedure       SetButtonCaption(Value: string);
  86.     protected
  87.         procedure       CreateParams(var Params: TCreateParams); override;
  88.         procedure       WMKillFocus(var Message: TWMKillFocus); message WM_KILLFOCUS;
  89.         procedure       CloseUp(OK: Boolean);
  90.         procedure       DropDown;
  91.         function        ColorButton: TMMCustomColorButton;
  92.         function        GetColorByIndex(Index: Integer): TColor;
  93.         function        GetIndexByColor(Color: TColor): Integer;
  94.         procedure       Paint; override;
  95.         procedure       DrawItem(Canvas: TCanvas; i: Integer);
  96.         procedure       DrawCustomColor(Canvas: TCanvas);
  97.         procedure       DrawColorCell(Canvas: TCanvas; const Rect: TRect; Color: TColor; Focused: Boolean);
  98.         procedure       MouseMove(Shift: TShiftState; X, Y: Integer); override;
  99.         procedure       MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
  100.         procedure       MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
  101.         procedure       KeyDown(var Key: Word; Shift: TShiftState); override;
  102.         function        IndexAt(X, Y: Integer): Integer;
  103.         procedure       SetIndex(Value: Integer);
  104.         procedure       CustomClick(Sender: TObject);
  105.         procedure       DrawDelimiter(Canvas: TCanvas);
  106.         procedure       CustomExit(Sender: TObject);
  107.     public
  108.         constructor     Create(AOwner: TComponent); override;
  109.         property        ButtonCaption: string read GetButtonCaption write SetButtonCaption;
  110.     end;
  111.     {-- TMMCustomColorButton -------------------------------------------------}
  112.     TMMCustomColorButton = class(TMMCustomControl)
  113.     private
  114.         FButton        : TMMColorSpeedButton;
  115.         FValue         : TColor;
  116.         FFocusColor    : TColor;
  117.         FPopup         : TMMColorPopup;
  118.         FColorDlg      : TColorDialog;
  119.         FButtonCaption : string;
  120.         FShowCurrent   : Boolean;
  121.         FOnChange      : TNotifyEvent;
  122.         procedure SetFocusColor(Value: TColor);
  123.         function  GetGlyph: TBitmap;
  124.         procedure SetGlyph(Value: TBitmap);
  125.         function  GetNumGlyphs: Integer;
  126.         procedure SetNumGlyphs(Value: Integer);
  127.         procedure SetValue(Value: TColor);
  128.         function  GetCustomColors: TStrings;
  129.         procedure SetCustomColors(Value: TStrings);
  130.         procedure SetButtonCaption(Value: string);
  131.     protected
  132.         procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override;
  133.         procedure WMSetFocus(var Message: TWMSetFocus); message WM_SETFOCUS;
  134.         procedure WMKillFocus(var Message: TWMKillFocus); message WM_KILLFOCUS;
  135.         procedure CMEnabledChanged(var Message); message CM_ENABLEDCHANGED;
  136.         procedure BtnMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  137.         procedure KeyDown(var Key: Word; Shift: TShiftState); override;
  138.         procedure Change; dynamic;
  139.         procedure BtnClick(Sender: TObject);
  140.         procedure ShowPopup;
  141.         procedure MMDropColorDlg(var Message); message MM_DROPCOLORDLG;
  142.         function  Popup: TMMColorPopup;
  143.     public
  144.         constructor Create(AOwner: TComponent); override;
  145.     protected
  146.         property    Width default 43;
  147.         property    Height default 21;
  148.         property    TabStop default True;
  149.         property    FocusColor: TColor read FFocusColor write SetFocusColor default clBlack;
  150.         property    Glyph: TBitmap read GetGlyph write SetGlyph;
  151.         property    NumGlyphs: Integer read GetNumGlyphs write SetNumGlyphs default 1;
  152.         property    Value: TColor read FValue write SetValue default clBlack;
  153.         property    CustomColors: TStrings read GetCustomColors write SetCustomColors;
  154.         property    ButtonCaption: string read FButtonCaption write SetButtonCaption;
  155.         property    ShowCurrent: Boolean read FShowCurrent write FShowCurrent default False;
  156.         property    OnChange: TNotifyEvent read FOnChange write FOnChange;
  157.     end;
  158.     {-- TMMColorButton -------------------------------------------------------}
  159.     TMMColorButton = class(TMMCustomColorButton)
  160.     published
  161.         property    Width;
  162.         property    Height;
  163.         property    TabStop;
  164.         property    TabOrder;
  165.         property    FocusColor;
  166.         property    Glyph;
  167.         property    NumGlyphs;
  168.         property    Value;
  169.         property    CustomColors;
  170.         property    ButtonCaption;
  171.         property    ShowCurrent;
  172.         property    OnChange;
  173.         property    Enabled;
  174.         property    Visible;
  175.     end;
  176. implementation
  177. uses
  178.     Buttons,
  179.     ExtCtrls,
  180.     Forms;
  181. {$IFDEF WIN32}
  182.     {$R MMCLRBTN.D32}
  183. {$ELSE}
  184.     {$R MMCLRBTN.D16}
  185. {$ENDIF}
  186. const
  187.     ButtonRes = 'BM_CLRBTNDOWN';
  188. {== TMMColorSpeedButton ==================================================}
  189. procedure TMMColorSpeedButton.Paint;
  190. var
  191.     R, FR: TRect;
  192.     ColorSize, GlyphSize: Integer;
  193. begin
  194.     if not Enabled and not (csDesigning in ComponentState) then
  195.         FState := bsDisabled
  196.     else if FState = bsDisabled then
  197.         FState := bsUp;
  198.     R := DrawButtonFace(Canvas, Rect(0, 0, Width, Height), 1, bsAutoDetect,
  199.                         False, FState in [bsDown, bsExclusive], ColorButton.Focused);
  200.     if Glyph = nil then
  201.         GlyphSize := 0
  202.     else
  203.         GlyphSize := Glyph.Width + 2;
  204.     ColorSize := R.Right - R.Left - GlyphSize - 2;
  205.     if ColorSize < 0 then
  206.         ColorSize := 0;
  207.     if GlyphSize > 0 then
  208.         DrawGlyph(Canvas,Rect(R.Left+ColorSize+2,R.Top,R.Right,R.Bottom));
  209.     if (Enabled or (csDesigning in ComponentState)) and (ColorSize > 0) then
  210.         DrawColor(Canvas,Rect(R.Left,R.Top,R.Left+ColorSize,R.Bottom));
  211.     DrawDelimiter(Canvas,R.Left+ColorSize,R.Top+2,R.Bottom-2);
  212.     if ColorButton.Focused then
  213.     begin
  214.         FR := Rect(R.Left,R.Top,R.Right-1,R.Bottom-1);
  215.         InflateRect(FR,-1,-1);
  216.         with FR do
  217.         begin
  218.             FocusLine(Left,Top,Right,Top);
  219.             FocusLine(Right,Top,Right,Bottom);
  220.             FocusLine(Left,Bottom,Right,Bottom);
  221.             FocusLine(Left,Top,Left,Bottom);
  222.         end;
  223.     end;
  224. end;
  225. {-- TMMColorSpeedButton --------------------------------------------------}
  226. procedure TMMColorSpeedButton.FocusLine(X1, Y1, X2, Y2: integer);
  227. var
  228.     i: Integer;
  229. begin
  230.     if (X1 = X2) then
  231.     begin
  232.         i := Y1;
  233.         while i < Y2 do
  234.         begin
  235.             Canvas.Pixels[X1, i] := ColorButton.FFocusColor;
  236.             Inc(i,2)
  237.         end;
  238.     end
  239.     else if (Y1 = Y2) then
  240.     begin
  241.         i := X1;
  242.         while i < X2 do
  243.         begin
  244.             Canvas.Pixels[i, Y1] := ColorButton.FFocusColor;
  245.             Inc(i,2)
  246.         end;
  247.     end;
  248. end;
  249. {-- TMMColorSpeedButton --------------------------------------------------}
  250. function TMMColorSpeedButton.GetColorButton: TMMCustomColorButton;
  251. begin
  252.     Result := Owner as TMMCustomColorButton;
  253. end;
  254. {-- TMMColorSpeedButton --------------------------------------------------}
  255. procedure TMMColorSpeedButton.DrawColor(Canvas: TCanvas; const Rect: TRect);
  256. var
  257.     R: TRect;
  258. begin
  259.     with Canvas do
  260.     begin
  261.         R := Rect;
  262.         InflateRect(R,-4,-2);
  263.         Brush.Color := ColorButton.Value;
  264.         Brush.Style := bsSolid;
  265.         Pen.Color   := clBlack;
  266.         Pen.Width   := 1;
  267.         Rectangle(R.Left,R.Top,R.Right,R.Bottom);
  268.     end;
  269. end;
  270. {-- TMMColorSpeedButton --------------------------------------------------}
  271. procedure TMMColorSpeedButton.DrawDelimiter(Canvas: TCanvas; Left, Top, Bottom: Integer);
  272. begin
  273.     with Canvas do
  274.     begin
  275.         Pen.Color := clBtnShadow;
  276.         Pen.Width := 1;
  277.         MoveTo(Left,Top);
  278.         LineTo(Left,Bottom);
  279.         Pen.Color := clBtnHighlight;
  280.         MoveTo(Left+1,Top);
  281.         LineTo(Left+1,Bottom);
  282.     end;
  283. end;
  284. {== TMMCustomButton ======================================================}
  285. type
  286.     TMMCustomButton = class(TButton)
  287.     protected
  288.         procedure   KeyDown(var Key: Word; Shift: TShiftState); override;
  289.     end;
  290. {-- TMMCustomButton ------------------------------------------------------}
  291. procedure TMMCustomButton.KeyDown(var Key: Word; Shift: TShiftState);
  292. begin
  293.     if Key = VK_ESCAPE then
  294.         PostMessage(Parent.Handle,WM_KEYDOWN,VK_ESCAPE,0);
  295. end;
  296. {== TMMColorPopup ========================================================}
  297. constructor TMMColorPopup.Create(AOwner: TComponent);
  298. begin
  299.     inherited Create(AOwner);
  300.     Visible := False;
  301.     Hide;
  302.     TabStop := True;
  303.     ClientWidth  := PopupWidth;
  304.     ClientHeight := PopupHeight;
  305.     FButton := TMMCustomButton.Create(Self);
  306.     with FButton do
  307.     begin
  308.         Parent := Self;
  309.         Left := GridMargin;
  310.         Top := CustomTop;
  311.         Width := GridWidth - GridCellSize - GridMargin;
  312.         Height := GridCellSize;
  313.         { TODO: Put to resource }
  314.         Caption := '&Custom...';
  315.         OnClick := CustomClick;
  316.         OnExit := CustomExit;
  317.     end;
  318.    ErrorCode := ComponentRegistered(InitCode, Self, ClassName);
  319.    if (ErrorCode <> 0) then RegisterFailed(InitCode, Self , ClassName);
  320. end;
  321. {-- TMMColorPopup --------------------------------------------------------}
  322. procedure TMMColorPopup.CreateParams(var Params: TCreateParams);
  323. begin
  324.     inherited CreateParams(Params);
  325.     Params.Style := WS_POPUP or WS_CLIPCHILDREN or WS_DLGFRAME;
  326. {$IFDEF WIN32}
  327.     Params.ExStyle := WS_EX_TOOLWINDOW;
  328. {$ENDIF}
  329.     Params.WindowClass.Style := Params.WindowClass.Style or CS_SAVEBITS;
  330. end;
  331. {-- TMMColorPopup --------------------------------------------------------}
  332. procedure TMMColorPopup.WMKillFocus(var Message: TWMKillFocus);
  333. var
  334.     H: THandle;
  335. begin
  336.     H := Message.FocusedWnd;
  337.     while (H <> 0) and (H <> Handle) do
  338.         H := GetParent(H);
  339.     if H = Handle then
  340.         Exit;
  341.     if FOpened then
  342.         CloseUp(False);
  343. end;
  344. {-- TMMColorPopup --------------------------------------------------------}
  345. function TMMColorPopup.ColorButton: TMMCustomColorButton;
  346. begin
  347.     Result := TMMCustomColorButton(Owner);
  348. end;
  349. {-- TMMColorPopup --------------------------------------------------------}
  350. function TMMColorPopup.GetColorByIndex(Index: Integer): TColor;
  351. begin
  352.     Result := FColors[Index];
  353. end;
  354. {-- TMMColorPopup --------------------------------------------------------}
  355. function TMMColorPopup.GetIndexByColor(Color: TColor): Integer;
  356. begin
  357.     Color := ColorToRGB(Color);
  358.     for Result := Low(FColors) to High(FColors) do
  359.         if ColorToRGB(FColors[Result]) = Color then
  360.             Exit;
  361.     Result := -1;
  362. end;
  363. {-- TMMColorPopup --------------------------------------------------------}
  364. procedure TMMColorPopup.Paint;
  365. var
  366.     i: Integer;
  367.     Offs: TBitmap;
  368. begin
  369.     Offs := TBitmap.Create;
  370.     try
  371.         Offs.Width  := ClientWidth;
  372.         Offs.Height := ClientHeight;
  373.         with Offs.Canvas do
  374.         begin
  375.             Brush.Color := clBtnFace;
  376.             FillRect(ClientRect);
  377.         end;
  378.         for i := 0 to GridCells - 1 do
  379.             DrawItem(Offs.Canvas,i);
  380.         if FDrawCustom then
  381.             DrawCustomColor(Offs.Canvas);
  382.         DrawDelimiter(Offs.Canvas);
  383.         Canvas.Draw(0,0,Offs);
  384.     finally
  385.         Offs.Free;
  386.     end;
  387. end;
  388. {-- TMMColorPopup --------------------------------------------------------}
  389. procedure TMMColorPopup.DrawCustomColor(Canvas: TCanvas);
  390. begin
  391.     DrawColorCell(Canvas,
  392.                   Bounds(CustomLeft,CustomTop,GridCellSize,GridCellSize),
  393.                   ColorButton.Value,
  394.                   FIndex = -1);
  395. end;
  396. {-- TMMColorPopup --------------------------------------------------------}
  397. procedure TMMColorPopup.DrawItem(Canvas: TCanvas; i: Integer);
  398. var
  399.     Row, Col: Integer;
  400. begin
  401.     Row := i div GridCols;
  402.     Col := i mod GridCols;
  403.     DrawColorCell(Canvas,
  404.                   Bounds(Col*GridCellSize,Row*GridCellSize,GridCellSize,GridCellSize),
  405.                   GetColorByIndex(i),FIndex=i);
  406. end;
  407. {-- TMMColorPopup --------------------------------------------------------}
  408. procedure TMMColorPopup.DrawColorCell(Canvas: TCanvas; const Rect: TRect; Color: TColor; Focused: Boolean);
  409. var
  410.     R: TRect;
  411. begin
  412.     R := Rect;
  413.     with Canvas do
  414.     begin
  415.         if Focused then
  416.         begin
  417.             Pen.Color := clBlack;
  418.             Pen.Width := 1;
  419.             Brush.Style := bsClear;
  420.             Rectangle(Rect.Left,Rect.Top,Rect.Right,Rect.Bottom);
  421.             Rectangle(Rect.Left+2,Rect.Top+2,Rect.Right-2,Rect.Bottom-2);
  422.             Pen.Color := clWhite;
  423.             Rectangle(Rect.Left+1,Rect.Top+1,Rect.Right-1,Rect.Bottom-1);
  424.         end
  425.         else
  426.         begin
  427.             Frame3D(Canvas,R,clBtnFace,clBtnFace,1);
  428.             Frame3D(Canvas,R,clBtnShadow,clBtnHighlight,1);
  429.             Frame3D(Canvas,R,clBtnText,clBtnFace,1);
  430.         end;
  431.         Brush.Color := Color;
  432.         Brush.Style := bsSolid;
  433.         FillRect(Classes.Rect(Rect.Left+3,Rect.Top+3,Rect.Right-3,Rect.Bottom-3));
  434.     end;
  435. end;
  436. {-- TMMColorPopup --------------------------------------------------------}
  437. procedure TMMColorPopup.DrawDelimiter(Canvas: TCanvas);
  438. begin
  439.     with Canvas do
  440.     begin
  441.         Pen.Style := psSolid;
  442.         Pen.Color := clBtnShadow;
  443.         MoveTo(0,DelimTop);
  444.         LineTo(ClientWidth,DelimTop);
  445.         Pen.Color := clBtnHighlight;
  446.         MoveTo(0,DelimTop+1);
  447.         LineTo(ClientWidth,DelimTop+1);
  448.     end;
  449. end;
  450. {-- TMMColorPopup --------------------------------------------------------}
  451. procedure TMMColorPopup.MouseMove(Shift: TShiftState; X, Y: Integer);
  452. var
  453.     i: Integer;
  454. begin
  455.     if InRange(X,0,Width) and InRange(Y,0,Height) then
  456.     begin
  457.         i := IndexAt(X,Y);
  458.         if i <> -1 then
  459.             SetIndex(i);
  460.     end;
  461. end;
  462. {-- TMMColorPopup --------------------------------------------------------}
  463. function TMMColorPopup.IndexAt(X, Y: Integer): Integer;
  464. var
  465.     R, C : Integer;
  466. begin
  467.     C := X div GridCellSize;
  468.     R := Y div GridCellSize;
  469.     if InRange(C,0,GridCols-1) and InRange(R,0,GridRows-1) then
  470.         Result := C + R * GridCols
  471.     else
  472.     begin
  473.         if FDrawCustom and
  474.            InRange(X,CustomLeft,CustomLeft+GridCellSize) and
  475.            InRange(Y,CustomTop,CustomTop+GridCellSize) then
  476.             Result := -2
  477.         else
  478.             Result := -1;
  479.     end;
  480. end;
  481. {-- TMMColorPopup --------------------------------------------------------}
  482. procedure TMMColorPopup.MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  483. var
  484.     Ind: Integer;
  485. begin
  486.     Ind := IndexAt(X,Y);
  487.     if Ind <> -1 then
  488.     begin
  489.         SetIndex(Ind);
  490.         CloseUp(True);
  491.     end;
  492. end;
  493. {-- TMMColorPopup --------------------------------------------------------}
  494. procedure TMMColorPopup.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  495. begin
  496.     inherited MouseDown(Button,Shift,X,Y);
  497.     if not InRange(X,0,Width) or not InRange(Y,0,Height) then
  498.     begin
  499.         CloseUp(False);
  500.     end
  501.     else if InRange(X,FButton.Left,FButton.Left+FButton.Width) and
  502.             InRange(Y,FButton.Top,FButton.Top+FButton.Height) then
  503.             FButton.Click;
  504. end;
  505. {-- TMMColorPopup --------------------------------------------------------}
  506. procedure TMMColorPopup.KeyDown(var Key: Word; Shift: TShiftState);
  507. var
  508.     Col, Row: Integer;
  509. begin
  510.     if Key = VK_TAB then
  511.     begin
  512.         FButton.SetFocus;
  513.         Key := 0;
  514.         Exit;
  515.     end;
  516.     if (Key = VK_ESCAPE) or (Key = VK_RETURN) then
  517.     begin
  518.         CloseUp(Key = VK_RETURN);
  519.         Key := 0;
  520.         Exit;
  521.     end;
  522.     if FIndex = -1 then
  523.         if FDrawCustom then
  524.         begin
  525.             Col := 3;
  526.             Row := 5;
  527.         end
  528.         else
  529.             Exit
  530.     else
  531.     begin
  532.         Col := FIndex mod GridCols;
  533.         Row := FIndex div GridCols;
  534.     end;
  535.     case Key of
  536.         VK_LEFT : if Col > 0 then Dec(Col);
  537.         VK_UP   : if Row > 0 then Dec(Row);
  538.         VK_DOWN : if (Row < 4) or (FDrawCustom and (Col = 3) and (Row < 5)) then Inc(Row);
  539.         VK_RIGHT: if Col < 3 then Inc(Col);
  540.         VK_HOME : begin Col := 0; Row := 0; end;
  541.         VK_END  : if FDrawCustom then
  542.                   begin
  543.                     Col := 3;
  544.                     Row := 5;
  545.                   end
  546.                   else
  547.                   begin
  548.                     Col := 3;
  549.                     Row := 4;
  550.                   end;
  551.     else
  552.         Exit;
  553.     end;
  554.     Key := 0;
  555.     if Row = 5 then
  556.         SetIndex(-2)
  557.     else
  558.         SetIndex(Col+Row*GridCols);
  559. end;
  560. {-- TMMColorPopup --------------------------------------------------------}
  561. procedure TMMColorPopup.SetIndex(Value: Integer);
  562. begin
  563.     if Value = -2 then Value := -1;
  564.     FIndex := Value;
  565.     Invalidate;
  566. end;
  567. {-- TMMColorPopup --------------------------------------------------------}
  568. procedure TMMColorPopup.CustomClick(Sender: TObject);
  569. begin
  570.     CloseUp(False);
  571.     PostMessage(ColorButton.Handle,MM_DROPCOLORDLG,0,0);
  572. end;
  573. {-- TMMColorPopup --------------------------------------------------------}
  574. procedure TMMColorPopup.CustomExit(Sender: TObject);
  575. begin
  576.     CloseUp(False);
  577. end;
  578. {-- TMMColorPopup --------------------------------------------------------}
  579. procedure TMMColorPopup.DropDown;
  580. begin
  581.     FSave := DisableTaskWindows(Handle);
  582.     Show;
  583.     SetFocus;
  584.     FOpened := True;
  585.     FColors[0]  := clWhite;
  586.     FColors[1]  := clBlack;
  587.     FColors[2]  := clLtGray;
  588.     FColors[3]  := clDkGray;
  589.     FColors[4]  := clRed;
  590.     FColors[5]  := clMaroon;
  591.     FColors[6]  := clYellow;
  592.     FColors[7]  := clOlive;
  593.     FColors[8]  := clLime;
  594.     FColors[9]  := clGreen;
  595.     FColors[10] := clAqua;
  596.     FColors[11] := clTeal;
  597.     FColors[12] := clBlue;
  598.     FColors[13] := clNavy;
  599.     FColors[14] := clFuchsia;
  600.     FColors[15] := clPurple;
  601.     FColors[16] := clMoneyGreen;
  602.     FColors[17] := clSkyBlue;
  603.     FColors[18] := clCream;
  604.     FColors[19] := clMdGray;
  605.     FIndex        := GetIndexByColor(ColorButton.Value);
  606.     FDrawCustom   := ColorButton.ShowCurrent or (FIndex = -1);
  607.     ButtonCaption := ColorButton.ButtonCaption;
  608.     SetCaptureControl(Self);
  609. end;
  610. {-- TMMColorPopup --------------------------------------------------------}
  611. procedure TMMColorPopup.CloseUp(OK: Boolean);
  612. begin
  613.     if not FOpened then
  614.         Exit;
  615.     EnableTaskWindows(FSave);
  616.     SetCaptureControl(nil);
  617.     Hide;
  618.     FOpened := False;
  619.     {$IFDEF WIN32}
  620.     Windows.SetFocus(ColorButton.Handle);
  621.     {$ELSE}
  622.     WinProcs.SetFocus(ColorButton.Handle);
  623.     {$ENDIF}
  624.     if OK and (FIndex <> -1) then
  625.         ColorButton.Value := GetColorByIndex(FIndex);
  626. end;
  627. {-- TMMColorPopup --------------------------------------------------------}
  628. function TMMColorPopup.GetButtonCaption: string;
  629. begin
  630.     Result := FButton.Caption;
  631. end;
  632. {-- TMMColorPopup --------------------------------------------------------}
  633. procedure TMMColorPopup.SetButtonCaption(Value: string);
  634. begin
  635.     FButton.Caption := Value;
  636. end;
  637. {== TMMCustomColorButton =================================================}
  638. constructor TMMCustomColorButton.Create(AOwner: TComponent);
  639. begin
  640.     inherited Create(AOwner);
  641.     FButton         := TMMColorSpeedButton.Create(Self);
  642.     FButton.Parent  := Self;
  643.     FButton.Visible := True;
  644.     FButton.OnMouseDown := BtnMouseDown;
  645.     FButton.OnClick := BtnClick;
  646.     FFocusColor     := clBlack;
  647.     ButtonCaption   := '';
  648.     FColorDlg       := TColorDialog.Create(Self);
  649.     FColorDlg.Options := FColorDlg.Options + [cdFullOpen];
  650.     Glyph           := nil;
  651.     Value           := clBlack;
  652.     Width           := 43;
  653.     Height          := 21;
  654.     TabStop         := True;
  655.     ErrorCode := ComponentRegistered(InitCode, Self, ClassName);
  656.     if (ErrorCode <> 0) then RegisterFailed(InitCode, Self , ClassName);
  657. end;
  658. {-- TMMCustomColorButton -------------------------------------------------}
  659. function TMMCustomColorButton.Popup: TMMColorPopup;
  660. begin
  661.     if FPopup = nil then
  662.     begin
  663.         FPopup := TMMColorPopup.Create(Self);
  664.         if GetParentForm(Self) <> nil then
  665.         begin
  666.            FPopup.Parent := Self;
  667.         end
  668.         {$IFDEF BUILD_ACTIVEX}
  669.         else
  670.         begin
  671.            FPopup.ParentWindow := ParentWindow;
  672.            FPopup.FButton.Parent := nil;
  673.            FPopup.FButton.ParentWindow := FPopup.Handle;
  674.         end;
  675.         FPopup.SetDesigning(False);
  676.         {$ENDIF}
  677.     end;
  678.     Result := FPopup;
  679. end;
  680. {-- TMMCustomColorButton -------------------------------------------------}
  681. procedure TMMCustomColorButton.SetBounds(ALeft, ATop, AWidth, AHeight: Integer);
  682. begin
  683.     inherited SetBounds(ALeft,ATop,AWidth,AHeight);
  684.     FButton.SetBounds(0,0,AWidth,AHeight);
  685. end;
  686. {-- TMMCustomColorButton -------------------------------------------------}
  687. procedure TMMCustomColorButton.SetFocusColor(Value: TColor);
  688. begin
  689.     if FFocusColor <> Value then
  690.     begin
  691.         FFocusColor := Value;
  692.         Changed;
  693.     end;
  694. end;
  695. {-- TMMCustomColorButton -------------------------------------------------}
  696. procedure TMMCustomColorButton.WMSetFocus(var Message: TWMSetFocus);
  697. begin
  698.     Invalidate;
  699. end;
  700. {-- TMMCustomColorButton -------------------------------------------------}
  701. procedure TMMCustomColorButton.WMKillFocus(var Message: TWMKillFocus);
  702. begin
  703.     Invalidate;
  704. end;
  705. {-- TMMCustomColorButton -------------------------------------------------}
  706. procedure TMMCustomColorButton.CMEnabledChanged(var Message);
  707. begin
  708.     inherited;
  709.     FButton.Enabled := Enabled;
  710. end;
  711. {-- TMMCustomColorButton -------------------------------------------------}
  712. procedure TMMCustomColorButton.BtnMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  713. begin
  714.     SetFocus;
  715. end;
  716. {-- TMMCustomColorButton -------------------------------------------------}
  717. procedure TMMCustomColorButton.KeyDown(var Key: Word; Shift: TShiftState);
  718. begin
  719.     if Key = VK_SPACE then
  720.     begin
  721.         ShowPopup;
  722.         Key := 0;
  723.     end;
  724. end;
  725. {-- TMMCustomColorButton -------------------------------------------------}
  726. procedure TMMCustomColorButton.Change;
  727. begin
  728.     if csLoading in ComponentState then
  729.         Exit;
  730.     if Assigned(FOnChange) then FOnChange(Self);
  731. end;
  732. {-- TMMCustomColorButton -------------------------------------------------}
  733. procedure TMMCustomColorButton.BtnClick(Sender: TObject);
  734. begin
  735.    {$IFDEF WIN32}
  736.    {$IFDEF TRIAL}
  737.    {$DEFINE _HACK1}
  738.    {$I MMHACK.INC}
  739.    {$ENDIF}
  740.    {$ENDIF}
  741.     ShowPopup;
  742. end;
  743. {-- TMMCustomColorButton -------------------------------------------------}
  744. procedure TMMCustomColorButton.ShowPopup;
  745. var
  746.     P: TPoint;
  747. begin
  748.     P := ClientToScreen(Point(0,Height));
  749.     Popup.Left := P.X;
  750.     if P.Y + Popup.Height > Screen.Height then
  751.         P.Y := P.Y - Popup.Height - Height;
  752.     Popup.Top  := P.Y;
  753.     Popup.DropDown;
  754. end;
  755. {-- TMMCustomColorButton -------------------------------------------------}
  756. procedure TMMCustomColorButton.MMDropColorDlg(var Message);
  757. begin
  758.     with FColorDlg do
  759.     begin
  760.         Color := Value;
  761.         if Execute then
  762.             Value := Color;
  763.     end;
  764. end;
  765. {-- TMMCustomColorButton -------------------------------------------------}
  766. function TMMCustomColorButton.GetGlyph: TBitmap;
  767. begin
  768.     Result := FButton.Glyph;
  769. end;
  770. {-- TMMCustomColorButton -------------------------------------------------}
  771. procedure TMMCustomColorButton.SetGlyph(Value: TBitmap);
  772. begin
  773.     if Value = nil then
  774.         FButton.Glyph.Handle := LoadBitmap(HInstance,ButtonRes)
  775.     else
  776.         FButton.Glyph := Value;
  777. end;
  778. {-- TMMCustomColorButton -------------------------------------------------}
  779. function TMMCustomColorButton.GetNumGlyphs: Integer;
  780. begin
  781.     Result := FButton.NumGlyphs;
  782. end;
  783. {-- TMMCustomColorButton -------------------------------------------------}
  784. procedure TMMCustomColorButton.SetNumGlyphs(Value: Integer);
  785. begin
  786.     FButton.NumGlyphs := Value;
  787. end;
  788. {-- TMMCustomColorButton -------------------------------------------------}
  789. procedure TMMCustomColorButton.SetValue(Value: TColor);
  790. begin
  791.     {$IFDEF WIN32}
  792.     {$IFDEF TRIAL}
  793.     {$DEFINE _HACK2}
  794.     {$I MMHACK.INC}
  795.     {$ENDIF}
  796.     {$ENDIF}
  797.     if FValue <> Value then
  798.     begin
  799.         FValue := Value;
  800.         Changed;
  801.         Change;
  802.     end;
  803. end;
  804. {-- TMMCustomColorButton -------------------------------------------------}
  805. function TMMCustomColorButton.GetCustomColors: TStrings;
  806. begin
  807.     Result := FColorDlg.CustomColors;
  808. end;
  809. {-- TMMCustomColorButton -------------------------------------------------}
  810. procedure TMMCustomColorButton.SetCustomColors(Value: TStrings);
  811. begin
  812.    {$IFDEF WIN32}
  813.    {$IFDEF TRIAL}
  814.    {$DEFINE _HACK3}
  815.    {$I MMHACK.INC}
  816.    {$ENDIF}
  817.    {$ENDIF}
  818.     FColorDlg.CustomColors := Value;
  819. end;
  820. {-- TMMCustomColorButton -------------------------------------------------}
  821. procedure TMMCustomColorButton.SetButtonCaption(Value: string);
  822. begin
  823.     if Value = '' then
  824.         Value := '&Other...';
  825.     if FButtonCaption <> Value then
  826.     begin
  827.         FButtonCaption := Value;
  828.         if (FPopup <> nil) and FPopup.Visible then
  829.             Popup.ButtonCaption := Value;
  830.     end;
  831. end;
  832. end.