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

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 DynamicSkinForm;
  15. {$P+,S-,W-,R-}
  16. {$WARNINGS OFF}
  17. {$HINTS OFF}
  18. interface
  19. uses
  20.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  21.   ExtCtrls, SkinData, Menus, SkinMenus, SkinCtrls, SpUtils, SPEffBmp, SkinTabs,
  22.   SkinBoxCtrls, spTrayIcon, SkinHint;
  23. type
  24.   TspBorderIcon = (biSystemMenu, biMinimize, biMaximize, biRollUp, biMinimizeToTray);
  25.   TspBorderIcons = set of TspBorderIcon;
  26.   TTrackBarChangeValueEvent = procedure(IDName: String; Value: Integer)
  27.                               of object;
  28.   TFrameRegulatorChangeValueEvent = procedure(IDName: String; Value: Integer)
  29.                                     of object;
  30.   TSwitchState = (swsOn, swsOff);
  31.   TSwitchChangeStateEvent = procedure(IDName: String;
  32.                                       State: TSwitchState) of object;
  33.   TPaintEvent = procedure (IDName: String; Canvas: TCanvas;
  34.                            ObjectRect: TRect) of object;
  35.   TMouseEnterEvent = procedure (IDName: String) of object;
  36.   TMouseLeaveEvent = procedure (IDName: String) of object;
  37.   TMainMenuItemClick = procedure (IDName: String) of object;
  38.   TspMouseUpEvent = procedure (IDName: String;
  39.                              X, Y: Integer; ObjectRect: TRect;
  40.                              Button: TMouseButton) of object;
  41.   TMouseDownEvent = procedure (IDName: String;
  42.                                X, Y: Integer; ObjectRect: TRect;
  43.                                Button: TMouseButton) of object;
  44.   TMouseMoveEvent = procedure (IDName: String; X, Y: Integer;
  45.                                ObjectRect: TRect) of object;
  46.   TChangeClientRectEvent = procedure(NewClientRect: TRect) of object;
  47.   TspDynamicSkinForm = class;
  48.   TspActiveSkinObject = class(TObject)
  49.   protected
  50.     Parent: TspDynamicSkinForm;
  51.     FMorphKf: Double;
  52.     FMouseIn: Boolean;
  53.     Picture, ActivePicture: TBitMap;
  54.     procedure SetMorphKf(Value: Double);
  55.     procedure Redraw;
  56.   public
  57.     SD: TspSkinData;
  58.     IDName: String;
  59.     Hint: String;
  60.     SkinRect: TRect;
  61.     ActiveSkinRect: TRect;
  62.     Morphing: Boolean;
  63.     MorphKind: TMorphKind;
  64.     ObjectRect: TRect;
  65.     Active: Boolean;
  66.     Enabled: Boolean;
  67.     CursorIndex: Integer;
  68.     RollUp: Boolean;
  69.     Visible: Boolean;
  70.     SkinRectInAPicture: Boolean;
  71.     constructor Create(AParent: TspDynamicSkinForm; AData: TspDataSkinObject);
  72.     procedure Draw(Cnvs: TCanvas; UpDate: Boolean); virtual;
  73.     procedure DblClick; virtual;
  74.     procedure MouseDown(X, Y: Integer; Button: TMouseButton); virtual;
  75.     procedure MouseUp(X, Y: Integer; Button: TMouseButton); virtual;
  76.     procedure MouseMove(X, Y: Integer); virtual;
  77.     procedure MouseEnter; virtual;
  78.     procedure MouseLeave; virtual;
  79.     function CanMorphing: Boolean; virtual;
  80.     procedure DoMorphing;
  81.     property MorphKf: Double read FMorphKf write SetMorphKf;
  82.   end;
  83.   TspUserObject = class(TspActiveSkinObject)
  84.   public
  85.     procedure Draw(Cnvs: TCanvas; UpDate: Boolean); override;
  86.   end;
  87.   TspSkinFrameObject = class(TspActiveSkinObject)
  88.   protected
  89.     FFrame: Integer;
  90.     FrameW, FrameH: Integer;
  91.     procedure SetFrame(Value: Integer);
  92.   public
  93.     CountFrames: Integer;
  94.     FramesPlacement: TFramesPlacement;
  95.     constructor Create(AParent: TspDynamicSkinForm;
  96.       AData: TspDataSkinObject);
  97.     procedure Draw(Cnvs: TCanvas; UpDate: Boolean); override;
  98.     property Frame: Integer read FFrame write SetFrame;
  99.   end;
  100.   TspSkinFrameGaugeObject = class(TspSkinFrameObject)
  101.   protected
  102.     FValue: Integer;
  103.     function CalcFrame: Integer;
  104.     procedure SetValue(AValue: Integer);
  105.   public
  106.     MinValue: Integer;
  107.     MaxValue: Integer;
  108.     constructor Create(AParent: TspDynamicSkinForm;
  109.       AData: TspDataSkinObject);
  110.     procedure Draw(Cnvs: TCanvas; UpDate: Boolean); override;
  111.     procedure SimplySetValue(AValue: Integer);
  112.     procedure MouseEnter; override;
  113.     procedure MouseLeave; override;
  114.     property Value: Integer read FValue write SetValue;
  115.   end;
  116.   TspSkinFrameRegulatorObject = class(TspSkinFrameObject)
  117.   protected
  118.     FPixInc, FValInc: Integer;
  119.     FDown: Boolean;
  120.     StartV, CurV, TempValue: Integer;
  121.     FValue: Integer;
  122.     function CalcFrame: Integer;
  123.     procedure SetValue(AValue: Integer);
  124.     procedure CalcValue;
  125.   public
  126.     MinValue: Integer;
  127.     MaxValue: Integer;
  128.     Kind: TRegulatorKind;
  129.     constructor Create(AParent: TspDynamicSkinForm;
  130.       AData: TspDataSkinObject);
  131.     procedure Draw(Cnvs: TCanvas; UpDate: Boolean); override;
  132.     procedure SimplySetValue(AValue: Integer);
  133.     procedure MouseDown(X, Y: Integer; Button: TMouseButton); override;
  134.     procedure MouseUp(X, Y: Integer; Button: TMouseButton); override;
  135.     procedure MouseMove(X, Y: Integer); override;
  136.     property Value: Integer read FValue write SetValue;
  137.   end;
  138.   TspSkinAnimateObject = class(TspActiveSkinObject)
  139.   protected
  140.     FFrame: Integer;
  141.     FInc: Integer;
  142.     TimerInterval: Integer;
  143.     MenuItem: TMenuItem;
  144.     FPopupUp: Boolean;
  145.     procedure SetFrame(Value: Integer);
  146.     procedure DoMax;
  147.     procedure DoMin;
  148.     procedure DoRollUp;
  149.     procedure DoClose;
  150.     procedure DoCommand;
  151.     procedure TrackMenu;
  152.   public
  153.     CountFrames: Integer;
  154.     Cycle: Boolean;
  155.     ButtonStyle: Boolean;
  156.     Increment: Boolean;
  157.     Command: TStdCommand;
  158.     procedure ChangeFrame;
  159.     procedure Start;
  160.     procedure Stop;
  161.     constructor Create(AParent: TspDynamicSkinForm;
  162.       AData: TspDataSkinObject);
  163.     procedure DblCLick; override;
  164.     procedure MouseUp(X, Y: Integer; Button: TMouseButton); override;
  165.     property Frame: Integer read FFrame write SetFrame;
  166.     procedure Draw(Cnvs: TCanvas; UpDate: Boolean); override;
  167.     procedure MouseEnter; override;
  168.     procedure MouseLeave; override;
  169.   end;
  170.   TspSkinGaugeObject = class(TspActiveSkinObject)
  171.   protected
  172.     FProgressPos, FOldProgressPos: TPoint;
  173.     procedure SetValue(AValue: Integer);
  174.     function CalcProgressPos: TPoint;
  175.   public
  176.     FValue: Integer;
  177.     MinValue, MaxValue: Integer;
  178.     Kind: TGaugeKind;
  179.     procedure SimplySetValue(AValue: Integer);
  180.     constructor Create(AParent: TspDynamicSkinForm;
  181.       AData: TspDataSkinObject);
  182.     property Value: Integer read FValue write SetValue;
  183.     procedure Draw(Cnvs: TCanvas; UpDate: Boolean); override;
  184.     procedure MouseEnter; override;
  185.     procedure MouseLeave; override;
  186.   end;
  187.   TspSkinBitLabelObject = class(TspActiveSkinObject)
  188.   protected
  189.     FTextValue: String;
  190.     SymbolWidth: Integer;
  191.     SymbolHeight: Integer;
  192.     Symbols: TStrings;
  193.   public
  194.     constructor Create(AParent: TspDynamicSkinForm;
  195.       AData: TspDataSkinObject);
  196.     procedure Draw(Cnvs: TCanvas; UpDate: Boolean); override;
  197.     procedure SetTextValue(AValue: String; AUpDate: Boolean);
  198.   end;
  199.   TspSkinLabelObject = class(TspActiveSkinObject)
  200.   public
  201.     FTextValue: String;
  202.     FontName: String;
  203.     FontStyle: TFontStyles;
  204.     FontHeight: Integer;
  205.     FontColor: TColor;
  206.     ActiveFontColor: TColor;
  207.     Alignment: TAlignment;
  208.     constructor Create(AParent: TspDynamicSkinForm;
  209.       AData: TspDataSkinObject);
  210.     procedure MouseEnter; override;
  211.     procedure MouseLeave; override;
  212.     procedure Draw(Cnvs: TCanvas; UpDate: Boolean); override;
  213.     procedure SetTextValue(AValue: String; AUpDate: Boolean);
  214.   end;
  215.   TspSkinSwitchObject = class(TspActiveSkinObject)
  216.   protected
  217.     FState: TSwitchState;
  218.     procedure SetState(Value: TSwitchState);
  219.   public
  220.     constructor Create(AParent: TspDynamicSkinForm;
  221.       AData: TspDataSkinObject);
  222.     property State: TSwitchState read FState write SetState;
  223.     procedure SimpleSetState(Value: TSwitchState);
  224.     procedure MouseDown(X, Y: Integer; Button: TMouseButton); override;
  225.     procedure MouseEnter; override;
  226.     procedure MouseLeave; override;
  227.   end;
  228.   TspSkinTrackBarObject = class(TspActiveSkinObject)
  229.   private
  230.     FButtonPos, FOldButtonPos: TPoint;
  231.     FValue: Integer;
  232.     MoveActive: Boolean;
  233.     FOldMPoint: TPoint;
  234.     TrackKind: TTrackKind;
  235.     procedure SetButtonPos(AValue: TPoint);
  236.     procedure SetValue(AValue: Integer);
  237.     function CalcValue(APos: TPoint): Integer;
  238.     function CalcButtonPos(AValue: Integer): TPoint;
  239.     property ButtonPos: TPoint read FButtonPos write SetButtonPos;
  240.     function CalcButtonRect(P: TPoint): TRect;
  241.   public
  242.     ButtonRect: TRect;
  243.     ActiveButtonRect: TRect;
  244.     BeginPoint: TPoint;
  245.     EndPoint: TPoint;
  246.     MinValue: Integer;
  247.     MaxValue: Integer;
  248.     MouseDownChangeValue: Boolean;
  249.     constructor Create(AParent: TspDynamicSkinForm;
  250.       AData: TspDataSkinObject);
  251.     property Value: Integer read FValue write SetValue;
  252.     procedure SimplySetValue(AValue: Integer);
  253.     procedure Draw(Cnvs: TCanvas; UpDate: Boolean); override;
  254.     procedure MouseDown(X, Y: Integer; Button: TMouseButton); override;
  255.     procedure MouseUp(X, Y: Integer; Button: TMouseButton); override;
  256.     procedure MouseMove(X, Y: Integer); override;
  257.   end;
  258.   TspSkinButtonObject = class(TspActiveSkinObject)
  259.   protected
  260.     FDown: Boolean;
  261.     FPopupUp: Boolean;
  262.     procedure SetDown(Value: Boolean);
  263.     procedure TrackMenu;
  264.   public
  265.     DownRect: TRect;
  266.     DisableSkinRect: TRect;
  267.     GroupIndex: Integer;
  268.     MenuItem: TMenuItem;
  269.     constructor Create(AParent: TspDynamicSkinForm;
  270.       AData: TspDataSkinObject);
  271.     property Down: Boolean read FDown write SetDown;
  272.     procedure Draw(Cnvs: TCanvas; UpDate: Boolean); override;
  273.     procedure MouseDown(X, Y: Integer; Button: TMouseButton); override;
  274.     procedure MouseUp(X, Y: Integer; Button: TMouseButton); override;
  275.     procedure MouseEnter; override;
  276.     procedure MouseLeave; override;
  277.   end;
  278.   TspSkinMainMenuItem = class(TspActiveSkinObject)
  279.   protected
  280.     TempObjectRect: TRect;
  281.     FDown: Boolean;
  282.     OldEnabled: Boolean;
  283.     Visible: Boolean;
  284.     function SearchDown: Boolean;
  285.     procedure SearchActive;
  286.     procedure SetDown(Value: Boolean);
  287.     procedure TrackMenu;
  288.   public
  289.     MenuItem: TMenuItem;
  290.     FontName: String;
  291.     FontHeight: Integer;
  292.     FontStyle: TFontStyles;
  293.     UnEnabledFontColor, FontColor,
  294.     ActiveFontColor, DownFontColor: TColor;
  295.     TextRct: TRect;
  296.     DownRect: TRect;
  297.     LO, RO: Integer;
  298.     constructor Create(AParent: TspDynamicSkinForm; AData: TspDataSkinObject);
  299.     procedure Draw(Cnvs: TCanvas; UpDate: Boolean); override;
  300.     procedure MouseEnter; override;
  301.     procedure MouseDown(X, Y: Integer; Button: TMouseButton); override;
  302.     procedure MouseLeave; override;
  303.   end;
  304.   TspSkinStdButtonObject = class(TspSkinButtonObject)
  305.   protected
  306.     procedure DoMax;
  307.     procedure DoMin;
  308.     procedure DoClose;
  309.     procedure DoRollUp;
  310.     procedure DoCommand;
  311.   public
  312.     FSkinSupport: Boolean;
  313.     Command: TStdCommand;
  314.     RestoreRect, RestoreActiveRect, RestoreDownRect: TRect;
  315.     procedure DblClick; override;
  316.     procedure MouseDown(X, Y: Integer; Button: TMouseButton); override;
  317.     procedure MouseUp(X, Y: Integer; Button: TMouseButton); override;
  318.     constructor Create(AParent: TspDynamicSkinForm;
  319.       AData: TspDataSkinObject);
  320.     procedure Draw(Cnvs: TCanvas; UpDate: Boolean); override;
  321.     procedure DefaultDraw(Cnvs: TCanvas);
  322.     function CanMorphing: Boolean; override;
  323.   end;
  324.   TspSkinCaptionObject = class(TspActiveSkinObject)
  325.   protected
  326.     FTextValue: String;
  327.     procedure SetTextValue(Value: String);
  328.   public
  329.     FontName: String;
  330.     FontStyle: TFontStyles;
  331.     FontHeight: Integer;
  332.     FontColor: TColor;
  333.     ActiveFontColor: TColor;
  334.     ShadowColor: TColor;
  335.     ActiveShadowColor: TColor;
  336.     Shadow: Boolean;
  337.     Alignment: TAlignment;
  338.     TextRct: TRect;
  339.     DefaultCaption: Boolean;
  340.     FrameRect, ActiveFrameRect: TRect;
  341.     FrameLeftOffset, FrameRightOffset: Integer;
  342.     FrameTextRect: TRect;
  343.     procedure SimpleSetTextValue(Value: String);
  344.     constructor Create(AParent: TspDynamicSkinForm;
  345.       AData: TspDataSkinObject);
  346.     property TextValue: String read FTextValue write SetTextValue;
  347.     procedure MouseEnter; override;
  348.     procedure MouseLeave; override;
  349.     procedure MouseDown(X, Y: Integer; Button: TMouseButton); override;
  350.     procedure MouseUp(X, Y: Integer; Button: TMouseButton); override;
  351.     procedure Draw(Cnvs: TCanvas; UpDate: Boolean); override;
  352.   end;
  353.   TspSkinMainMenu = class(TMainMenu)
  354.   protected
  355.     DSF: TSpDynamicSkinForm;
  356.     FSD: TspSkinData;
  357.     procedure Notification(AComponent: TComponent;
  358.       Operation: TOperation); override;
  359.   public
  360.     constructor Create(AOwner: TComponent); override;
  361.   published
  362.     property SkinData: TspSkinData read FSD write FSD;
  363.   end;
  364.   // Menu Bar //
  365.   TspSkinMainMenuBar = class;
  366.   TspMenuBarObject = class(TObject)
  367.   protected
  368.     Parent: TspSkinMainMenuBar;
  369.     FMorphKf: Double;
  370.     FMouseIn: Boolean;
  371.     Picture: TBitMap;
  372.     FDown: Boolean;
  373.     procedure SetMorphKf(Value: Double);
  374.     procedure Redraw;
  375.   public
  376.     IDName: String;
  377.     SkinRect: TRect;
  378.     ActiveSkinRect: TRect;
  379.     DownRect: TRect;
  380.     Morphing: Boolean;
  381.     MorphKind: TMorphKind;
  382.     ObjectRect: TRect;
  383.     Active: Boolean;
  384.     Enabled: Boolean;
  385.     Visible: Boolean;
  386.     constructor Create(AParent: TspSkinMainMenuBar; AData: TspDataSkinObject);
  387.     procedure Draw(Cnvs: TCanvas); virtual;
  388.     procedure DblClick; virtual;
  389.     procedure MouseDown(X, Y: Integer; Button: TMouseButton); virtual;
  390.     procedure MouseUp(X, Y: Integer; Button: TMouseButton); virtual;
  391.     procedure MouseEnter; virtual;
  392.     procedure MouseLeave; virtual;
  393.     function CanMorphing: Boolean; virtual;
  394.     procedure DoMorphing;
  395.     property MorphKf: Double read FMorphKf write SetMorphKf;
  396.   end;
  397.   TspSkinMainMenuBarButton = class(TspMenuBarObject)
  398.   protected
  399.     FSkinSupport: Boolean;
  400.     procedure DoCommand;
  401.   public
  402.     Command: TStdCommand;
  403.     constructor Create(AParent: TspSkinMainMenuBar; AData: TspDataSkinObject);
  404.     procedure DefaultDraw(Cnvs: TCanvas);
  405.     procedure Draw(Cnvs: TCanvas); override;
  406.     procedure DblClick; override;
  407.     procedure MouseDown(X, Y: Integer; Button: TMouseButton); override;
  408.     procedure MouseUp(X, Y: Integer; Button: TMouseButton); override;
  409.     procedure MouseEnter; override;
  410.     procedure MouseLeave; override;
  411.   end;
  412.   TspSkinMainMenuBarItem = class(TspMenuBarObject)
  413.   protected
  414.     FSkinSupport: Boolean;
  415.     TempObjectRect: TRect;
  416.     OldEnabled: Boolean;
  417.     Visible: Boolean;
  418.     function SearchDown: Boolean;
  419.     procedure SearchActive;
  420.     procedure SetDown(Value: Boolean);
  421.     procedure TrackMenu;
  422.   public
  423.     MenuItem: TMenuItem;
  424.     FontName: String;
  425.     FontHeight: Integer;
  426.     FontStyle: TFontStyles;
  427.     UnEnabledFontColor, FontColor,
  428.     ActiveFontColor, DownFontColor: TColor;
  429.     TextRct: TRect;
  430.     DownRect: TRect;
  431.     LO, RO: Integer;
  432.     constructor Create(AParent: TspSkinMainMenuBar; AData: TspDataSkinObject);
  433.     procedure DefaultDraw(Cnvs: TCanvas);
  434.     procedure Draw(Cnvs: TCanvas); override;
  435.     procedure MouseEnter; override;
  436.     procedure MouseDown(X, Y: Integer; Button: TMouseButton); override;
  437.     procedure MouseLeave; override;
  438.   end;
  439.   TspItemEnterEvent = procedure (MenuItem: TMenuItem) of object;
  440.   TspItemLeaveEvent = procedure (MenuItem: TMenuItem) of object;
  441.   TspSkinMainMenuBar = class(TspSkinControl)
  442.   protected
  443.     FOnItemMouseEnter: TspItemEnterEvent;
  444.     FOnItemMouseLeave: TspItemLeaveEvent;
  445.     FScrollMenu: Boolean;
  446.     FDefItemFont: TFont;
  447.     FSkinSupport: Boolean;
  448.     ButtonsCount: Integer;
  449.     FMDIChildMax: Boolean;
  450.     FOnMainMenuItemClick: TMainMenuItemClick;
  451.     FPopupToUp: Boolean;
  452.     MenuActive: Boolean;
  453.     Scroll: Boolean;
  454.     MarkerActive: Boolean;
  455.     DSF: TspDynamicSkinForm;
  456.     FMainMenu: TMainMenu;
  457.     MorphTimer: TTimer;
  458.     MouseTimer: TTimer;
  459.     ActiveObject, OldActiveObject, MouseCaptureObject: Integer;
  460.     FOnMouseEnter, FOnMouseLeave: TNotifyEvent;
  461.     NewItemsRect: TRect;
  462.     FDefaultWidth: Integer;
  463.     FDefaultHeight: Integer;
  464.     procedure SetDefaultWidth(Value: Integer);
  465.     procedure SetDefaultHeight(Value: Integer);
  466.     procedure SetDefItemFont(Value: TFont);
  467.     procedure CloseSysMenu;
  468.     procedure AddButtons;
  469.     procedure DeleteButtons;
  470.     procedure CheckButtons(BI: TspBorderIcons);
  471.     procedure TrackScrollMenu;
  472.     procedure CalcRects;
  473.     procedure SetMainMenu(Value: TMainMenu);
  474.     procedure TestMouse(Sender: TObject);
  475.     procedure TestMorph(Sender: TObject);
  476.     procedure PaintMenuBar(Cnvs: TCanvas);
  477.     procedure WMEraseBkgnd(var Message: TWMEraseBkgnd); message WM_ERASEBKGND;
  478.     procedure WMCloseSkinMenu(var Message: TMessage); message WM_CLOSESKINMENU; 
  479.     procedure WMSize(var Message: TWMSIZE); message WM_SIZE;
  480.     procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
  481.     procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
  482.     procedure TestActive(X, Y: Integer);
  483.     procedure Notification(AComponent: TComponent;
  484.                            Operation: TOperation); override;
  485.     procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
  486.       X, Y: Integer); override;
  487.     procedure MouseUp(Button: TMouseButton; Shift: TShiftState;
  488.       X, Y: Integer); override;
  489.     procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
  490.     procedure ClearObjects;
  491.     procedure DrawSkinObject(AObject: TspMenuBarObject);
  492.     procedure MenuEnter;
  493.     procedure MenuExit;
  494.     procedure MenuClose;
  495.     function CheckReturnKey: Boolean;
  496.     procedure NextMainMenuItem;
  497.     procedure PriorMainMenuItem;
  498.     function FindHotKeyItem(CharCode: Integer): Boolean;
  499.     function GetMarkerRect: TRect;
  500.     procedure DrawMarker(Cnvs: TCanvas);
  501.     procedure MDIChildMaximize;
  502.     procedure MDIChildRestore;
  503.   public
  504.     //
  505.     SkinRect, ItemsRect: TRect;
  506.     MenuBarItem: String;
  507.     MaxButton, MinButton, SysMenuButton, CloseButton: String;
  508.     TrackMarkColor, TrackMarkActiveColor: Integer;
  509.     Picture: TBitMap;
  510.     //
  511.     ObjectList: TList;
  512.     //
  513.     ChildMenuIn: Boolean;
  514.     //
  515.     constructor Create(AOwner: TComponent); override;
  516.     destructor Destroy; override;
  517.     function GetChildMainMenu: TMainMenu;
  518.     procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override;
  519.     procedure Paint; override;
  520.     procedure CreateMenu;
  521.     procedure ChangeSkinData; override;
  522.     procedure BeforeChangeSkinData; override;
  523.     procedure GetSkinData; override;
  524.     procedure UpDateItems;
  525.   published
  526.     property ScrollMenu: Boolean read FScrollMenu write FScrollMenu;
  527.     property DefItemFont: TFont read FDefItemFont write SetDefItemFont;
  528.     property DefaultWidth: Integer read FDefaultWidth write SetDefaultWidth;
  529.     property DefaultHeight: Integer read FDefaultHeight write SetDefaultHeight;
  530.     property PopupToUp: Boolean read FPopupToUp write FPopupToUp;
  531.     property DynamicSkinForm: TspDynamicSkinForm read DSF write DSF;
  532.     property MainMenu: TMainMenu read FMainMenu write SetMainMenu;
  533.     property Anchors;
  534.     property Visible;
  535.     property Enabled;
  536.     property OnMainMenuItemClick: TMainMenuItemClick
  537.       read FOnMainMenuItemClick write FOnMainMenuItemClick; 
  538.     property OnMouseEnter: TNotifyEvent read FOnMouseEnter write FOnMouseEnter;
  539.     property OnMouseLeave: TNotifyEvent read FOnMouseLeave write FOnMouseLeave;
  540.     property OnItemMouseEnter: TspItemEnterEvent read FOnItemMouseEnter write FOnItemMouseEnter;
  541.     property OnItemMouseLeave: TspItemLeaveEvent read FOnItemMouseLeave write FOnItemMouseLeave;
  542.     property OnMouseDown;
  543.     property OnMouseMove;
  544.     property OnMouseUp;
  545.     property OnClick;
  546.   end;
  547.   TspSkinMDITabsBar = class;
  548.   TspDynamicSkinForm = class(TComponent)
  549.   private
  550.     FAlwaysShowInTray: Boolean;
  551.     FLogoBitMapTransparent: Boolean;
  552.     FLogoBitMap: TBitMap;
  553.     FAlwaysMinimizeToTray: Boolean;
  554.     FIcon: TIcon;
  555.     FShowIcon: Boolean;
  556.     ButtonsInLeft: boolean;
  557.     FMaximizeOnFullScreen: Boolean;
  558.     FSkinHint: TspSkinHint;
  559.     FShowObjectHint: Boolean;
  560.     FUseSkinCursors: Boolean;
  561.     FSkinSupport: Boolean;
  562.     FDefCaptionFont: TFont;
  563.     FDefInActiveCaptionFont: TFont;
  564.     FMDIChildMaximized: Boolean;
  565.     FFormActive: Boolean;
  566.     FOnMinimizeToTray: TNotifyEvent;
  567.     FOnRestoreFromTray: TNotifyEvent;
  568.     FTrayIcon: TspTrayIcon;
  569.     FUseDefaultSysMenu: Boolean;
  570.     FSysMenu: TPopupMenu;
  571.     FSysTrayMenu: TspSkinPopupMenu;
  572.     FInShortCut: Boolean;
  573.     FMainMenuBar: TspSkinMainMenuBar;
  574.     FMDITabsBar: TspSkinMDITabsBar;
  575.     FFullDrag: Boolean;
  576.     FFormWidth, FFormHeight: Integer;
  577.     FSizeMove: Boolean;
  578.     FSupportNCArea: Boolean;
  579.     FRollUpState, MaxRollUpState: Boolean;
  580.     FBorderIcons: TspBorderIcons;
  581.     RMTop, RMBottom, RMLeft, RMRight: TBitMap;
  582.     BlackColor: TColor;
  583.     MouseIn: Boolean;
  584.     OldBoundsRect: TRect;
  585.     OldHeight: Integer;
  586.     NewLTPoint, NewRBPoint, NewRTPoint, NewLBPoint: TPoint;
  587.     NewClRect: TRect;
  588.     NewCaptionRect, NewButtonsRect: TRect;
  589.     NewButtonsOffset: Integer;
  590.     NewButtonsInLeft: Boolean;
  591.     NewMaskRectArea: TRect;
  592.     NewHitTestLTPoint,
  593.     NewHitTestRTPoint,
  594.     NewHitTestLBPoint,
  595.     NewHitTestRBPoint: TPoint;
  596.     NewDefCaptionRect: TRect;
  597.     FSizeable: Boolean;
  598.     FMinHeight, FMinWidth: Integer;
  599.     OldWindowProc: TWndMethod;
  600.     FClientInstance: Pointer;
  601.     FPrevClientProc: Pointer;
  602.     FSD: TspSkinData;
  603.     FMSD: TspSkinData;
  604.     FMainMenu: TMainMenu;
  605.     FSystemMenu: TPopupMenu;
  606.     FDraggAble: Boolean;
  607.     FIsDragging: Boolean;
  608.     FOldX, FOldY: Integer;
  609.     FOnChangeSkinData: TNotifyEvent;
  610.     FOnActivate: TNotifyEvent;
  611.     FOnDeActivate: TNotifyEvent;
  612.     FOnChangeRollUpState: TNotifyEvent;
  613.     FInChangeSkinData: Boolean;
  614.     FWindowState: TWindowState;
  615.     FMagneticSize: Byte;
  616.     FMenusAlphaBlend: Boolean;
  617.     FMenusAlphaBlendValue: Byte;
  618.     FMenusAlphaBlendAnimation: Boolean;
  619.     FAlphaBlend: Boolean;
  620.     FAlphaBlendAnimation: Boolean;
  621.     FAlphaBlendValue: Byte;
  622.     VisibleControls: TList;
  623.     OldAppMessage: TMessageEvent;
  624.     procedure CheckMDIMainMenu;
  625.     procedure CheckMDIBar;
  626.     procedure SetLogoBitMap(Value: TBitMap);
  627.     function GetUseSkinFontInMenu: Boolean;
  628.     procedure SetUseSkinFontInMenu(Value: Boolean);
  629.     procedure SetShowIcon(Value: Boolean);
  630.     procedure GetIconSize(var X, Y: Integer);
  631.     procedure GetIcon;
  632.     procedure DrawFormIcon(Cnvs: TCanvas; X, Y: Integer);
  633.     procedure SetMenusAlphaBlend(Value: Boolean);
  634.     procedure SetMenusAlphaBlendAnimation(Value: Boolean);
  635.     procedure SetMenusAlphaBlendValue(Value: Byte);
  636.     function GetDefCaptionRect: TRect;
  637.     function GetDefCaptionHeight: Integer;
  638.     function GetDefButtonSize: Integer;
  639.     procedure SetDefaultMenuItemHeight(Value: Integer);
  640.     function GetDefaultMenuItemHeight: Integer;
  641.     procedure SetDefaultMenuItemFont(Value: TFont);
  642.     function GetDefaultMenuItemFont: TFont;
  643.     procedure SetDefCaptionFont(Value: TFont);
  644.     procedure SetDefInActiveCaptionFont(Value: TFont);
  645.     procedure SetBorderIcons(Value: TspBorderIcons);
  646.     procedure NewAppMessage(var Msg: TMsg; var Handled: Boolean);
  647.     procedure HookApp;
  648.     procedure UnHookApp;
  649.     function GetMaximizeMDIChild: TForm;
  650.     function IsMDIChildMaximized: Boolean;
  651.     procedure ResizeMDIChilds;
  652.     function GetMDIWorkArea: TRect;
  653.     procedure UpDateForm;
  654.     procedure FormClientWindowProcHook(var Message: TMessage);
  655.     procedure TSM_Restore(Sender: TObject);
  656.     procedure TSM_Close(Sender: TObject);
  657.     procedure SM_Restore(Sender: TObject);
  658.     procedure SM_Max(Sender: TObject);
  659.     procedure SM_Min(Sender: TObject);
  660.     procedure SM_RollUp(Sender: TObject);
  661.     procedure SM_Close(Sender: TObject);
  662.     procedure SM_MinToTray(Sender: TObject);
  663.     procedure TrayIconDBLCLK(Sender: TObject);
  664.     procedure TrackSystemMenu(X, Y: Integer);
  665.     procedure UpDateActiveObjects;
  666.     procedure CreateSysMenu;
  667.     procedure CreateUserSysMenu;
  668.     procedure CreateSysTrayMenu;
  669.     function GetSystemMenu: TMenuItem;
  670.     procedure CalcRects;
  671.     procedure FormShortCut(var Msg: TWMKey; var Handled: Boolean);
  672.     procedure ChangeSkinData;
  673.     procedure SetRollUpFormRegion;
  674.     procedure CreateRollUpForm;
  675.     procedure CreateRollUpForm2;
  676.     procedure RestoreRollUpForm;
  677.     procedure RestoreRollUpForm2;
  678.     procedure SetRollUpState(Value: Boolean);
  679.     procedure SetTrayIcon(Value: TspTrayIcon);
  680.     procedure BeforeUpDateSkinControls(AFSD: Integer; WC: TWinControl);
  681.     procedure UpDateSkinControls(AFSD: Integer; WC: TWinControl);
  682.     procedure CheckObjects;
  683.     procedure SetWindowState(Value: TWindowState);
  684.     procedure SetSkinData(Value: TspSkinData);
  685.     procedure SetMenusSkinData(Value: TspSkinData);
  686.     procedure CheckSize;
  687.     procedure NewWndProc(var Message: TMessage);
  688.     function NewHitTest(P: TPoint): Integer;
  689.     function NewNCHitTest(P: TPoint): Integer;
  690.     function NewDefNCHitTest(P: TPoint): Integer;
  691.     procedure CreateNewRegion(FCanScale: Boolean);
  692.     procedure CreateNewForm(FCanScale: Boolean);
  693.     procedure FormChangeActive(AUpDate: Boolean);
  694.     procedure DoMaximize;
  695.     procedure DoNormalize;
  696.     procedure DoMinimize;
  697.     function InForm(P: TPoint): Boolean;
  698.     function PtInMask(P: TPoint): Boolean;
  699.     function CanScale: Boolean;
  700.     procedure CreateMainMenu;
  701.     procedure CheckWindowState;
  702.   protected
  703.     InMenu: Boolean;
  704.     InMainMenu: Boolean;
  705.     FRgn: HRGN;
  706.     NewMainMenuRect: TRect;
  707.     NewIconRect: TRect;
  708.     MorphTimer: TTimer;
  709.     AnimateTimer: TTimer;
  710.     MouseTimer: TTimer;
  711.     FMagnetic: Boolean;
  712.     FOnSkinMenuOpen: TNotifyEvent;
  713.     FOnSkinMenuClose: TNotifyEvent;
  714.     FOnChangeClientRect: TChangeClientRectEvent;
  715.     FOnMainMenuEnter: TNotifyEvent;
  716.     FOnMainMenuExit: TNotifyEvent;
  717.     FOnMouseEnterEvent: TMouseEnterEvent;
  718.     FOnMouseLeaveEvent: TMouseLeaveEvent;
  719.     FOnMouseUpEvent : TspMouseUpEvent;
  720.     FOnMouseDownEvent : TMouseDownEvent;
  721.     FOnMouseMoveEvent: TMouseMoveEvent;
  722.     FOnPaintEvent: TPaintEvent;
  723.     FOnSwitchChangeStateEvent: TSwitchChangeStateEvent;
  724.     FOnTrackBarChangeValueEvent: TTrackBarChangeValueEvent;
  725.     FOnFrameRegulatorChangeValueEvent: TFrameRegulatorChangeValueEvent;
  726.     ActiveObject, OldActiveObject, MouseCaptureObject: Integer;
  727.     OldWindowState: TWindowState;
  728.     procedure DrawLogoBitMap(C: TCanvas);
  729.     procedure CorrectCaptionText(C: TCanvas; var S: String; W: Integer);
  730.     procedure CheckMenuVisible(var Msg: Cardinal);
  731.     procedure FormKeyDown(Message: TMessage);
  732.     function CanNCSupport: Boolean;
  733.     function GetFullDragg: Boolean;
  734.     function GetMinimizeCoord: TPoint;
  735.     function CanObjectTest(ARollUp: Boolean): Boolean;
  736.     procedure PointToNCPoint(var P: TPoint);
  737.     procedure ActivateMenu;
  738.     function CheckReturnKey: Boolean;
  739.     procedure NextMainMenuItem;
  740.     procedure PriorMainMenuItem;
  741.     function CanNextMainMenuItem: Boolean;
  742.     function CanPriorMainMenuItem: Boolean;
  743.     function FindHotKeyItem(CharCode: Integer): Boolean;
  744.     procedure SetMainMenu(Value: TMainMenu);
  745.     procedure StartDragg(X, Y: Integer);
  746.     procedure EndDragg;
  747.     procedure DoMagnetic(var L, T: Integer; W, H: Integer);
  748.     
  749.     procedure TestCursors;
  750.     procedure TestMouse(Sender: TObject);
  751.     procedure TestMorph(Sender: TObject);
  752.     procedure TestAnimate(Sender: TObject);
  753.     procedure TestActive(X, Y: Integer; InFrm: Boolean);
  754.     procedure MouseDBlClick;
  755.     procedure MouseDown(Button: TMouseButton;  X, Y: Integer);
  756.     procedure MouseMove(X, Y: Integer);
  757.     procedure MouseUp(Button: TMouseButton; X, Y: Integer);
  758.     procedure CreateRealBitMap(DestB, SourceB: TBitMap);
  759.     function CalcRealObjectRect(R: TRect): TRect;
  760.     procedure CalcAllRealObjectRect;
  761.     procedure ControlsToAreas;
  762.     procedure Notification(AComponent: TComponent;
  763.                            Operation: TOperation); override;
  764.     procedure LoadObjects;
  765.     procedure LoadDefObjects;
  766.     procedure SwitchChangeStateEvent(IDName: String; State: TSwitchState);
  767.     procedure TrackBarChangeValueEvent(IDName: String; Value: Integer);
  768.     procedure FrameRegulatorChangeValueEvent(IDName: String; Value: Integer);
  769.     procedure MouseEnterEvent(IDName: String);
  770.     procedure MouseLeaveEvent(IDName: String);
  771.     procedure MouseUpEvent(IDName: String;
  772.                            X, Y: Integer; ObjectRect: TRect;
  773.                            Button: TMouseButton);
  774.     procedure MouseDownEvent(IDName: String;
  775.                              X, Y: Integer; ObjectRect: TRect;
  776.                              Button: TMouseButton);
  777.     procedure MouseMoveEvent(IDName: String; X, Y: Integer;
  778.                              ObjectRect: TRect);
  779.     procedure PaintEvent(IDName: String; Canvas: TCanvas; ObjectRect: TRect);
  780.     procedure LinkControlsToAreas;
  781.     procedure SetDefaultCaptionText(AValue: String);
  782.     procedure SkinMainMenuClose;
  783.     procedure SkinMenuClose2;
  784.     procedure ArangeMinimizedChilds;
  785.     function GetAutoRenderingInActiveImage: Boolean;
  786.     procedure SetAlphaBlendValue(Value: Byte);
  787.     procedure SetAlphaBlend(Value: Boolean);
  788.   public
  789.     SkinMenu: TspSkinMenu;
  790.     FForm: TForm;
  791.     ObjectList, AreaList: TList;
  792.     procedure AddChildToMenu(Child: TCustomForm);
  793.     procedure AddChildToBar(Child: TCustomForm);
  794.     procedure DeleteChildFromMenu(Child: TCustomForm);
  795.     procedure DeleteChildFromBar(Child: TCustomForm);
  796.     procedure RefreshMDIBarTab(Child: TCustomForm);
  797.     procedure MDIItemClick(Sender: TObject);
  798.     procedure UpDateChildCaptionInMenu(Child: TCustomForm);
  799.     procedure UpDateChildActiveInMenu;
  800.     function GetMinWidth: Integer;
  801.     function GetMinHeight: Integer;
  802.     function GetMaxWidth: Integer;
  803.     function GetMaxHeight: Integer;
  804.     procedure MinimizeAll;
  805.     procedure MaximizeAll;
  806.     procedure RestoreAll;
  807.     procedure Tile;
  808.     procedure Cascade;
  809.     procedure CloseAll;
  810.     function GetFormActive: Boolean;
  811.     procedure MinimizeToTray;
  812.     procedure RestoreFromTray;
  813.     procedure SkinMenuOpen;
  814.     procedure SkinMenuClose;
  815.     procedure DrawSkinObject(AObject: TspActiveSkinObject);
  816.     procedure SetFormStyle(FS: TFormStyle);
  817.     procedure LinkControlToArea(AreaName: String; Control: TControl);
  818.     procedure UnLinkControlFromArea(Control: TControl);
  819.     procedure UpdateMainMenu(ARedraw: Boolean);
  820.     procedure PopupSkinMenu(Menu: TMenu; P: TPoint);
  821.     procedure PopupSkinMenu1(Menu: TMenu; R: TRect; PopupUp: Boolean);
  822.     procedure ClearObjects;
  823.     function GetIndex(AIDName: String): Integer;
  824.     constructor Create(AOwner: TComponent); override;
  825.     destructor Destroy; override;
  826.     procedure Paint(DC: HDC);
  827.     procedure PaintNCSkin;
  828.     procedure PaintBG(DC: HDC);
  829.     procedure PaintBG2(DC: HDC);
  830.     procedure PaintBG3(DC: HDC);
  831.     //
  832.     procedure PaintNCDefault;
  833.     procedure PaintBGDefault(DC: HDC);
  834.     procedure PaintMDIBGDefault(DC: HDC);
  835.     procedure CalcDefRects;
  836.     //
  837.     procedure SetSupportNCArea(Value: Boolean);
  838.     procedure SetEnabled(AIDName: String; Value: Boolean);
  839.     procedure CaptionSetText(AIDName, AText: String);
  840.     procedure AnimateStart(AIDName: String);
  841.     procedure AnimateStop(AIDName: String);
  842.     procedure BitLabelSetText(AIDName: String; AValue: String);
  843.     procedure GaugeSetValue(AIDName: String; AValue: Integer);
  844.     procedure FrameGaugeSetValue(AIDName: String; AValue: Integer);
  845.     procedure ButtonSetDown(AIDName: String; ADown: Boolean);
  846.     function ButtonGetDown(AIDName: String): Boolean;
  847.     procedure SwitchSetState(AIDName: String; AState: TSwitchState);
  848.     function SwitchGetState(AIDName: String): TSwitchState;
  849.     function TrackBarGetValue(AIDName: String): Integer;
  850.     procedure TrackBarSetValue(AIDName: String; AValue: Integer);
  851.     function FrameRegulatorGetValue(AIDName: String): Integer;
  852.     procedure FrameRegulatorSetValue(AIDName: String; AValue: Integer);
  853.     procedure LabelSetText(AIDName, ATextValue: String);
  854.     procedure UserObjectDraw(AIDName: String);
  855.     procedure LinkMenu(AIDName: String; AMenu: TMenu; APopupUp: Boolean);
  856.     //
  857.     property RollUpState: Boolean read FRollUpState write SetRollUpState;
  858.     property WindowState: TWindowState read FWindowState write SetWindowState;
  859.   published
  860.     property AlwaysShowInTray: Boolean read FAlwaysShowInTray write FAlwaysShowInTray;
  861.     property LogoBitMap: TBitMap read FLogoBitMap write SetLogoBitMap;
  862.     property LogoBitMapTransparent: Boolean
  863.       read FLogoBitMapTransparent
  864.       write FLogoBitMapTransparent;
  865.     property AlwaysMinimizeToTray: Boolean
  866.       read FAlwaysMinimizeToTray write FAlwaysMinimizeToTray;
  867.     property UseSkinFontInMenu: boolean
  868.       read GetUseSkinFontInMenu write SetUseSkinFontInMenu;
  869.     property ShowIcon: Boolean read FShowIcon write SetShowIcon;
  870.     property MaximizeOnFullScreen: Boolean
  871.       read FMaximizeOnFullScreen write FMaximizeOnFullScreen;
  872.     property SkinHint: TspSkinHint read FSkinHint write FSkinHint;
  873.     property ShowObjectHint: Boolean read FShowObjectHint write FShowObjectHint;
  874.     property UseSkinCursors: Boolean read FUseSkinCursors write FUseSkinCursors;
  875.     property DefCaptionFont: TFont read FDefCaptionFont write SetDefCaptionFont;
  876.     property DefInActiveCaptionFont: TFont read FDefInActiveCaptionFont write SetDefInActiveCaptionFont;
  877.     property DefMenuItemHeight: Integer
  878.       read GetDefaultMenuItemHeight write SetDefaultMenuItemHeight;
  879.     property DefMenuItemFont: TFont
  880.       read GetDefaultMenuItemFont write SetDefaultMenuItemFont;
  881.     property TrayIcon: TspTrayIcon read FTrayIcon write SetTrayIcon;
  882.     property UseDefaultSysMenu: Boolean
  883.       read FUseDefaultSysMenu write FUseDefaultSysMenu;
  884.     property MainMenuBar: TspSkinMainMenuBar read FMainMenuBar write FMainMenuBar;
  885.     property MDITabsBar: TspSkinMDITabsBar read FMDITabsBar write FMDITabsBar;
  886.     property SupportNCArea: Boolean read FSupportNCArea
  887.                                     write SetSupportNCArea;
  888.     property AlphaBlendAnimation: Boolean read
  889.       FAlphaBlendAnimation write FAlphaBlendAnimation;                                  
  890.     property AlphaBlendValue: Byte read FAlphaBlendValue
  891.                                    write SetAlphaBlendValue;
  892.     property AlphaBlend: Boolean read FAlphaBlend
  893.                                        write SetAlphaBlend;
  894.     property MenusAlphaBlend: Boolean
  895.       read FMenusAlphaBlend write SetMenusAlphaBlend;
  896.     property MenusAlphaBlendAnimation: Boolean
  897.       read FMenusAlphaBlendAnimation write SetMenusAlphaBlendAnimation;
  898.     property MenusAlphaBlendValue: Byte
  899.       read FMenusAlphaBlendValue write SetMenusAlphaBlendValue;
  900.       
  901.     property MainMenu: TMainMenu read FMainMenu write SetMainMenu;
  902.     property SystemMenu: TPopupMenu read FSystemMenu write FSystemMenu;
  903.     property SkinData: TspSkinData read FSD write SetSkinData;
  904.     property MenusSkinData: TspSkinData read FMSD write SetMenusSkinData;
  905.     property MinHeight: Integer read FMinHeight write  FMinHeight;
  906.     property MinWidth: Integer read FMinWidth write  FMinWidth;
  907.     property Sizeable: Boolean read FSizeable write FSizeable;
  908.     property DraggAble: Boolean read FDraggAble write FDraggAble;
  909.     property Magnetic: Boolean read  FMagnetic write FMagnetic;
  910.     property MagneticSize: Byte read  FMagneticSize write FMagneticSize;
  911.     property BorderIcons: TspBorderIcons read FBorderIcons write SetBorderIcons;
  912.     property OnChangeClientRect: TChangeClientRectEvent
  913.       read FOnChangeClientRect write FOnChangeClientRect;
  914.     property OnChangeSkinData: TNotifyEvent read FOnChangeSkinData
  915.                                             write FOnChangeSkinData;
  916.     property OnMouseUpEvent: TspMouseUpEvent read FOnMouseUpEvent
  917.                                            write FOnMouseUpEvent;
  918.     property OnMouseDownEvent: TMouseDownEvent read FOnMouseDownEvent
  919.                                                write FOnMouseDownEvent;
  920.     property OnMouseMoveEvent: TMouseMoveEvent read FOnMouseMoveEvent
  921.                                                write FOnMouseMoveEvent;
  922.     property OnMouseEnterEvent: TMouseEnterEvent read FOnMouseEnterEvent
  923.                                                  write FOnMouseEnterEvent;
  924.     property OnMouseLeaveEvent: TMouseLeaveEvent read FOnMouseLeaveEvent
  925.                                                  write FOnMouseLeaveEvent;
  926.     property OnPaintEvent: TPaintEvent read FOnPaintEvent
  927.                                        write FOnPaintEvent;
  928.     property OnSwitchChangeStateEvent: TSwitchChangeStateEvent
  929.                                        read FOnSwitchChangeStateEvent
  930.                                        write FOnSwitchChangeStateEvent;
  931.     property OnTrackBarChangeValueEvent: TTrackBarChangeValueEvent
  932.                                        read FOnTrackBarChangeValueEvent
  933.                                        write FOnTrackBarChangeValueEvent;
  934.     property OnFrameRegulatorChangeValueEvent: TFrameRegulatorChangeValueEvent
  935.                                        read FOnFrameRegulatorChangeValueEvent
  936.                                        write FOnFrameRegulatorChangeValueEvent;
  937.     property OnActivate: TNotifyEvent read FOnActivate write  FOnActivate;
  938.     property OnDeActivate: TNotifyEvent read FOnDeActivate write  FOnDeActivate;
  939.     property OnSkinMenuOpen: TNotifyEvent read FOnSkinMenuOpen
  940.                                           write FOnSkinMenuOpen;
  941.     property OnSkinMenuClose: TNotifyEvent read FOnSkinMenuClose
  942.                                           write FOnSkinMenuClose;
  943.     property OnChangeRollUpState: TNotifyEvent read FOnChangeRollUpState
  944.                                                write FOnChangeRollUpState;
  945.     property OnMainMenuEnter: TNotifyEvent read FOnMainMenuEnter
  946.                                            write FOnMainMenuEnter;
  947.     property OnMainMenuExit: TNotifyEvent read FOnMainMenuExit
  948.                                            write FOnMainMenuExit;
  949.     property OnMinimizeToTray: TNotifyEvent
  950.       read FOnMinimizeToTray write FOnMinimizeToTray;
  951.     property OnRestoreFromTray: TNotifyEvent
  952.       read FOnRestoreFromTray write FOnRestoreFromTray;
  953.   end;
  954.   TspMDITab = class(TObject)
  955.   protected
  956.     TabsBar: TspSkinMDITabsBar;
  957.   public
  958.     Active, MouseIn: Boolean;
  959.     ObjectRect: TRect;
  960.     Child: TCustomForm;
  961.     constructor Create(AParentBar: TspSkinMDITabsBar; AChild: TCustomForm);
  962.     procedure Draw(Cnvs: TCanvas);
  963.   end;
  964.   TspMDITabMouseEnterEvent = procedure (MDITab: TspMDITab) of object;
  965.   TspMDITabMouseLeaveEvent = procedure (MDITab: TspMDITab) of object;
  966.   TspSkinMDITabsBar = class(TspSkinControl)
  967.   private
  968.     FOnTabMouseEnter: TspMDITabMouseEnterEvent;
  969.     FOnTabMouseLeave: TspMDITabMouseLeaveEvent;
  970.     FDefaultTabWidth: Integer;
  971.     FDefaultHeight: Integer;
  972.     FDefaultFont: TFont;
  973.     ActiveTabIndex, OldTabIndex: Integer;
  974.     procedure SetDefaultHeight(Value: Integer);
  975.     procedure SetDefaultFont(Value: TFont);
  976.     procedure CalcObjectRects;
  977.     procedure TestActive(X, Y: Integer);
  978.     procedure CheckActive;
  979.   protected
  980.     procedure CreateControlDefaultImage(B: TBitMap); override;
  981.     procedure CreateControlSkinImage(B: TBitMap); override;
  982.     procedure ClearObjects;
  983.     procedure GetSkinData; override;
  984.     procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
  985.     procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
  986.     procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
  987.                         X, Y: Integer); override;
  988.   public
  989.     ObjectList: TList;
  990.     Picture: TBitMap;
  991.     TabRect, ActiveTabRect, MouseInTabRect: TRect;
  992.     TabsBGRect: TRect;
  993.     TabLeftOffset, TabRightOffset: Integer;
  994.     FontName: String;
  995.     FontStyle: TFontStyles;
  996.     FontHeight: Integer;
  997.     FontColor, ActiveFontColor, MouseInFontColor: TColor;
  998.     UpDown: String;
  999.     constructor Create(AOwner: TComponent); override;
  1000.     destructor Destroy; override;
  1001.     function GetTab(X, Y: Integer): TspMDITab;
  1002.     function GetTabIndex(X, Y: Integer): Integer;
  1003.     procedure AddTab(Child: TCustomForm);
  1004.     procedure DeleteTab(Child: TCustomForm);
  1005.     procedure ChangeSkinData; override;
  1006.   published
  1007.     property DefaultHeight: Integer read FDefaultHeight write SetDefaultHeight;
  1008.     property DefaultFont: TFont read FDefaultFont write SetDefaultFont;
  1009.     property DefaultTabWidth: Integer read FDefaultTabWidth write FDefaultTabWidth;
  1010.     property Align;
  1011.     property PopupMenu;
  1012.     property DockSite;
  1013.     property DragCursor;
  1014.     property DragKind;
  1015.     property DragMode;
  1016.     property Enabled;
  1017.     property ParentShowHint;
  1018.     property ShowHint;
  1019.     property TabOrder;
  1020.     property TabStop;
  1021.     property Visible;
  1022.     property OnTabMouseEnter: TspMDITabMouseEnterEvent
  1023.       read FOnTabMouseEnter write FOnTabMouseEnter;
  1024.     property OnTabMouseLeave: TspMDITabMouseLeaveEvent
  1025.       read FOnTabMouseLeave write FOnTabMouseLeave;
  1026.     property OnCanResize;
  1027.     property OnClick;
  1028.     property OnConstrainedResize;
  1029.     property OnDockDrop;
  1030.     property OnDockOver;
  1031.     property OnDblClick;
  1032.     property OnDragDrop;
  1033.     property OnDragOver;
  1034.     property OnEndDock;
  1035.     property OnEndDrag;
  1036.     property OnEnter;
  1037.     property OnExit;
  1038.     property OnGetSiteInfo;
  1039.     property OnMouseDown;
  1040.     property OnMouseMove;
  1041.     property OnMouseUp;
  1042.     property OnResize;
  1043.     property OnStartDock;
  1044.     property OnStartDrag;
  1045.     property OnUnDock;
  1046.     property OnContextPopup;
  1047.   end;
  1048.   function GetDynamicSkinFormComponent(AForm: TForm): TspDynamicSkinForm;
  1049.   function GetMDIChildDynamicSkinFormComponent: TspDynamicSkinForm;
  1050.   function GetMDIChildDynamicSkinFormComponent2: TspDynamicSkinForm;
  1051. implementation
  1052.   Uses spConst;
  1053. type
  1054.   PAreaInfo = ^TAreaInfo;
  1055.   TAreaInfo = record
  1056.     Control: TControl;
  1057.     AreaRect: TRect;
  1058.   end;
  1059. const
  1060.    WS_EX_LAYERED = $80000; 
  1061.    InActiveBrightnessKf = 0.5;
  1062.    InActiveDarknessKf = 0.3;
  1063.    InActiveNoiseAmount = 50;
  1064.    MorphInc = 0.1;
  1065.    MouseTimerInterval = 50;
  1066.    MorphTimerInterval = 20;
  1067.    AnimateTimerInterval = 25;
  1068.    HTNCACTIVE = HTOBJECT;
  1069.    TRACKMARKEROFFSET = 5;
  1070.    DEFCAPTIONHEIGHT = 19;
  1071.    DEFBUTTONSIZE = 17;
  1072.    DEFTOOLCAPTIONHEIGHT = 15;
  1073.    DEFTOOLBUTTONSIZE = 13;
  1074.    DEFFORMMINWIDTH = 130;
  1075.    TMI_RESTORENAME = 'TRAY_DSF_RESTORE';
  1076.    TMI_CLOSENAME = 'TRAY_DSF_CLOSE';
  1077.    MI_MINNAME = 'DSF_MINITEM';
  1078.    MI_MAXNAME = 'DSF_MAXITEM';
  1079.    MI_CLOSENAME = 'DSF_CLOSE';
  1080.    MI_RESTORENAME = 'DSF_RESTORE';
  1081.    MI_MINTOTRAYNAME = 'DSF_MINTOTRAY';
  1082.    MI_ROLLUPNAME = 'DSF_ROLLUP';
  1083.   
  1084.    MI_CHILDITEM = '_DSFCHILDITEM'; 
  1085.    WM_MDICHANGESIZE = WM_USER + 206;
  1086.    WM_MDICHILDMAX = WM_USER + 207;
  1087.    WM_MDICHILDRESTORE = WM_USER + 208;
  1088. function GetDynamicSkinFormComponent;
  1089. var
  1090.   i: Integer;
  1091. begin
  1092.   Result := nil;
  1093.   for i := 0 to AForm.ComponentCount - 1 do
  1094.     if AForm.Components[i] is TspDynamicSkinForm
  1095.     then
  1096.       begin
  1097.         Result := (AForm.Components[i] as TspDynamicSkinForm);
  1098.         Break;
  1099.       end;
  1100. end;
  1101. function GetMDIChildDynamicSkinFormComponent;
  1102. var
  1103.   i: Integer;
  1104. begin
  1105.   Result := nil;
  1106.   for i := 0 to Application.MainForm.MDIChildCount - 1 do
  1107.   begin
  1108.     Result := GetDynamicSkinFormComponent(Application.MainForm.MDIChildren[i]);
  1109.     if (Result <> nil) and (Result.WindowState = wsMaximized)
  1110.     then
  1111.       Break
  1112.     else
  1113.       Result := nil;
  1114.   end;
  1115. end;
  1116. function GetMDIChildDynamicSkinFormComponent2;
  1117. begin
  1118.   if (Application.MainForm <> nil) and (Application.MainForm.ActiveMDIChild <> nil)
  1119.   then
  1120.     Result := GetDynamicSkinFormComponent(Application.MainForm.ActiveMDIChild)
  1121.   else
  1122.    Result := nil;
  1123. end;
  1124. //============= TspActiveSkinObject  =============//
  1125. constructor TspActiveSkinObject.Create;
  1126. begin
  1127.   Parent := AParent;
  1128.   SD := Parent.SkinData;
  1129.   Enabled := True;
  1130.   Visible := True;
  1131.   FMorphKf := 0;
  1132.   if AData <> nil
  1133.   then
  1134.     begin
  1135.       with AData do
  1136.       begin
  1137.         Self.IDName := IDName;
  1138.         Self.Hint := Hint;
  1139.         Self.SkinRectInAPicture := SkinRectInAPicture;
  1140.         Self.SkinRect := SkinRect;
  1141.         Self.ActiveSkinRect := ActiveSkinRect;
  1142.         Self.Morphing := Morphing;
  1143.         Self.MorphKind := MorphKind;
  1144.         Self.CursorIndex := CursorIndex;
  1145.         Self.RollUp := RollUp;
  1146.         if (ActivePictureIndex <> - 1) and
  1147.            (ActivePictureIndex < SD.FActivePictures.Count)
  1148.         then
  1149.           ActivePicture := TBitMap(SD.FActivePictures.Items[ActivePictureIndex])
  1150.         else
  1151.           begin
  1152.             ActivePicture := nil;
  1153.             ActiveSkinRect := NullRect;
  1154.           end;
  1155.       end;
  1156.       ObjectRect := SkinRect;
  1157.       if RollUp then Picture := SD.FRollUpPicture else Picture := SD.FPicture;
  1158.     end;
  1159. end;
  1160. procedure TspActiveSkinObject.ReDraw;
  1161. begin
  1162.   if Morphing
  1163.   then Parent.MorphTimer.Enabled := True
  1164.   else Parent.DrawSkinObject(Self);
  1165. end;
  1166. procedure TspActiveSkinObject.DblClick;
  1167. begin
  1168. end;
  1169. procedure TspActiveSkinObject.MouseDown(X, Y: Integer; Button: TMouseButton);
  1170. begin
  1171.   Parent.MouseDownEvent(IDName, X, Y, ObjectRect, Button);
  1172. end;
  1173. procedure TspActiveSkinObject.MouseUp(X, Y: Integer; Button: TMouseButton);
  1174. begin
  1175.   if FMouseIn then Parent.MouseUpEvent(IDName, X, Y, ObjectRect, Button);
  1176. end;
  1177. procedure TspActiveSkinObject.MouseMove(X, Y: Integer);
  1178. begin
  1179.   Parent.MouseMoveEvent(IDName, X, Y, ObjectRect);
  1180. end;
  1181. procedure TspActiveSkinObject.MouseEnter;
  1182. begin
  1183.   FMouseIn := True;
  1184.   Active := True;
  1185.   if not IsNullRect(ActiveSkinRect) then ReDraw;
  1186.   Parent.MouseEnterEvent(IDName);
  1187. end;
  1188. procedure TspActiveSkinObject.MouseLeave;
  1189. begin
  1190.   FMouseIn := False;
  1191.   Active := False;
  1192.   if not IsNullRect(ActiveSkinRect) then ReDraw;
  1193.   Parent.MouseLeaveEvent(IDName);
  1194. end;
  1195. function TspActiveSkinObject.CanMorphing;
  1196. begin
  1197.   Result := (Active and (MorphKf < 1)) or
  1198.             (not Active and (MorphKf > 0));
  1199. end;
  1200. procedure TspActiveSkinObject.DoMorphing;
  1201. begin
  1202.   if Active
  1203.   then MorphKf := MorphKf + MorphInc
  1204.   else MorphKf := MorphKf - MorphInc;
  1205.   Parent.DrawSkinObject(Self);
  1206. end;
  1207. procedure TspActiveSkinObject.Draw;
  1208. procedure CreateObjectImage(B: TBitMap; AActive: Boolean);
  1209. begin
  1210.   B.Width := RectWidth(ObjectRect);
  1211.   B.Height := RectHeight(ObjectRect);
  1212.   with B.Canvas do
  1213.   begin
  1214.     if AActive
  1215.     then
  1216.       CopyRect(Rect(0, 0, B.Width, B.Height), ActivePicture.Canvas, ActiveSkinRect)
  1217.     else
  1218.       if SkinRectInApicture
  1219.       then
  1220.         CopyRect(Rect(0, 0, B.Width, B.Height), ActivePicture.Canvas, SkinRect)
  1221.       else
  1222.         CopyRect(Rect(0, 0, B.Width, B.Height), Picture.Canvas, SkinRect);
  1223.   end;
  1224. end;
  1225. var
  1226.   PBuffer, APBuffer: TspEffectBmp;
  1227.   Buffer, ABuffer: TBitMap;
  1228.   ASR, SR: TRect;
  1229. begin
  1230.   ASR := ActiveSkinRect;
  1231.   SR := SkinRect;
  1232.   if not Morphing or
  1233.      ((Active and (MorphKf = 1)) or (not Active and (MorphKf  = 0)))
  1234.   then
  1235.     begin
  1236.       if Active and not IsNullRect(ASR)
  1237.       then
  1238.         Cnvs.CopyRect(ObjectRect, ActivePicture.Canvas, ASR)
  1239.       else
  1240.         if UpDate or SkinRectInApicture
  1241.         then
  1242.           begin
  1243.             if SkinRectInApicture
  1244.             then
  1245.               Cnvs.CopyRect(ObjectRect, ActivePicture.Canvas, SR)
  1246.             else
  1247.               Cnvs.CopyRect(ObjectRect, Picture.Canvas, SR);
  1248.           end;
  1249.     end
  1250.   else
  1251.     begin
  1252.       Buffer := TBitMap.Create;
  1253.       ABuffer := TBitMap.Create;
  1254.       CreateObjectImage(Buffer, False);
  1255.       CreateObjectImage(ABuffer, True);
  1256.       PBuffer := TspEffectBmp.CreateFromhWnd(Buffer.Handle);
  1257.       APBuffer := TspEffectBmp.CreateFromhWnd(ABuffer.Handle);
  1258.       case MorphKind of
  1259.         mkDefault: PBuffer.Morph(APBuffer, MorphKf);
  1260.         mkGradient: PBuffer.MorphGrad(APBuffer, MorphKf);
  1261.         mkLeftGradient: PBuffer.MorphLeftGrad(APBuffer, MorphKf);
  1262.         mkRightGradient: PBuffer.MorphRightGrad(APBuffer, MorphKf);
  1263.         mkLeftSlide: PBuffer.MorphLeftSlide(APBuffer, MorphKf);
  1264.         mkRightSlide: PBuffer.MorphRightSlide(APBuffer, MorphKf);
  1265.         mkPush: PBuffer.MorphPush(APBuffer, MorphKf);
  1266.       end;
  1267.       PBuffer.Draw(Cnvs.Handle, ObjectRect.Left, ObjectRect.Top);
  1268.       PBuffer.Free;
  1269.       APBuffer.Free;
  1270.       Buffer.Free;
  1271.       ABuffer.Free;
  1272.     end;
  1273. end;
  1274. procedure TspActiveSkinObject.SetMorphKf(Value: Double);
  1275. begin
  1276.   FMorphKf := Value;
  1277.   if FMorphKf < 0 then FMorphKf := 0 else
  1278.   if FMorphKf > 1 then FMorphKf := 1;
  1279. end;
  1280. procedure TspUserObject.Draw;
  1281. begin
  1282.   Parent.PaintEvent(IDName, Cnvs, ObjectRect);
  1283. end;
  1284. //============= TspSkinTrackBarObject ============//
  1285. constructor TspSkinTrackBarObject.Create;
  1286. begin
  1287.   inherited Create(AParent, AData);
  1288.   with TspDataSkinTrackBar(AData) do
  1289.   begin
  1290.     Self.ButtonRect := ButtonRect;
  1291.     Self.ActiveButtonRect := ActiveButtonRect;
  1292.     Self.BeginPoint := BeginPoint;
  1293.     Self.EndPoint := EndPoint;
  1294.     Self.MinValue := MinValue;
  1295.     Self.MaxValue := MaxValue;
  1296.     Self.MouseDownChangeValue := MouseDownChangeValue;
  1297.   end;
  1298.   if abs(BeginPoint.Y - EndPoint.Y) < abs(EndPoint.X - BeginPoint.X)
  1299.   then
  1300.     TrackKind := tkHorizontal
  1301.   else
  1302.     TrackKind := tkVertical;
  1303.   FValue := MinValue;
  1304.   FButtonPos := CalcButtonPos(FValue);
  1305. end;
  1306. function TspSkinTrackBarObject.CalcButtonRect;
  1307. var
  1308.   L, T: Integer;
  1309. begin
  1310.   L := P.X - RectWidth(ButtonRect) div 2;
  1311.   T := P.Y - RectHeight(ButtonRect) div 2;
  1312.   Result := Rect(L, T,
  1313.                  L + RectWidth(ButtonRect), T + RectHeight(ButtonRect));
  1314. end;
  1315. function TspSkinTrackBarObject.CalcValue;
  1316. var
  1317.   kf: Double;
  1318. begin
  1319.   kf := 0;
  1320.   case TrackKind of
  1321.     tkHorizontal:
  1322.       kf := (FButtonPos.X - BeginPoint.X) / (EndPoint.X - BeginPoint.X);
  1323.     tkVertical:
  1324.       kf := 1 - (FButtonPos.Y - EndPoint.Y) / (BeginPoint.Y - EndPoint.Y);
  1325.   end;
  1326.   Result := MinValue + Round((MaxValue - MinValue) * kf);
  1327. end;
  1328. function TspSkinTrackBarObject.CalcButtonPos;
  1329. var
  1330.   kf: Double;
  1331. begin
  1332.   kf := (Value - MinValue) / (MaxValue - MinValue);
  1333.   case TrackKind of
  1334.     tkHorizontal:
  1335.       Result := Point(BeginPoint.X + Round((EndPoint.X - BeginPoint.X) * kf),
  1336.                       BeginPoint.Y);
  1337.     tkVertical:
  1338.       Result := Point(BeginPoint.X,
  1339.                       EndPoint.Y + Round((BeginPoint.Y - EndPoint.Y) *
  1340.                       (1 - kf)));
  1341.   end;
  1342. end;
  1343. procedure TspSkinTrackBarObject.SimplySetValue;
  1344. begin
  1345.   FValue := AValue;
  1346.   if FValue < MinValue then FValue := MinValue;
  1347.   if FValue > MaxValue then FValue := MaxValue;
  1348.   FOldButtonPos := FbuttonPos;
  1349.   FButtonPos := CalcButtonPos(Value);
  1350.   Parent.TrackBarChangeValueEvent(IDName, FValue);
  1351. end;
  1352. procedure TspSkinTrackBarObject.SetValue;
  1353. begin
  1354.   if FValue <> AValue
  1355.   then
  1356.     begin
  1357.       FValue := AValue;
  1358.       if FValue < MinValue then FValue := MinValue;
  1359.       if FValue > MaxValue then FValue := MaxValue;
  1360.       FOldButtonPos := FbuttonPos;
  1361.       FButtonPos := CalcButtonPos(Value);
  1362.       Parent.DrawSkinObject(Self);
  1363.       Parent.TrackBarChangeValueEvent(IDName, FValue);
  1364.     end;
  1365. end;
  1366. procedure TspSkinTrackBarObject.SetButtonPos;
  1367. begin
  1368.   if (FButtonPos.X <> AValue.X) or (FButtonPos.Y <> AValue.Y)
  1369.   then
  1370.     begin
  1371.       FOldButtonPos := FbuttonPos;
  1372.       FButtonPos := AValue;
  1373.       FValue := CalcValue(FButtonPos);
  1374.       Parent.DrawSkinObject(Self);
  1375.       Parent.TrackBarChangeValueEvent(IDName, FValue);
  1376.     end;
  1377. end;
  1378. procedure TspSkinTrackBarObject.Draw;
  1379. var
  1380.   BRect: TRect;
  1381.   Buffer: TBitMap;
  1382.   BR: TRect;
  1383. begin
  1384.   if MoveActive and not IsNullRect(ActiveButtonRect)
  1385.   then BRect := ActiveButtonRect
  1386.   else BRect := ButtonRect;
  1387.   Buffer := TBitMap.Create;
  1388.   Buffer.Width := RectWidth(SkinRect);
  1389.   Buffer.Height := RectHeight(SkinRect);
  1390.   BR := CalcButtonRect(FButtonPos);
  1391.   //
  1392.   with Buffer.Canvas do
  1393.   begin
  1394.     case TrackKind of
  1395.       tkHorizontal:
  1396.         begin
  1397.           if IsNullRect(ActiveSkinRect)
  1398.           then
  1399.             CopyRect(Rect(0, 0, Buffer.Width, Buffer.Height),
  1400.                      Picture.Canvas, SkinRect)
  1401.           else
  1402.             begin
  1403.               CopyRect(Rect(0, 0, FButtonPos.X, Buffer.Height),
  1404.                        ActivePicture.Canvas,
  1405.                        Rect(ActiveSkinRect.Left, ActiveSkinRect.Top,
  1406.                             ActiveSkinRect.Left + FButtonPos.X, ActiveSkinRect.Bottom));
  1407.               CopyRect(Rect(FButtonPos.X, 0, Buffer.Width, Buffer.Height),
  1408.                        Picture.Canvas,
  1409.                        Rect(SkinRect.Left + FButtonPos.X, SkinRect.Top,
  1410.                             SkinRect.Right, SkinRect.Bottom));
  1411.             end;
  1412.         end;
  1413.       tkVertical:
  1414.         begin
  1415.           if IsNullRect(ActiveSkinRect)
  1416.           then
  1417.             CopyRect(Rect(0, 0, Buffer.Width, Buffer.Height),
  1418.                      Picture.Canvas, SkinRect)
  1419.           else
  1420.             begin
  1421.               CopyRect(Rect(0, 0, Buffer.Width, FButtonPos.Y),
  1422.                        Picture.Canvas,
  1423.                        Rect(SkinRect.Left, SkinRect.Top,
  1424.                             SkinRect.Right, SkinRect.Top + FButtonPos.Y));
  1425.               CopyRect(Rect(0, FButtonPos.Y, Buffer.Width, Buffer.Height),
  1426.                        ActivePicture.Canvas,
  1427.                        Rect(ActiveSkinRect.Left, ActiveSkinRect.Top + FButtonPos.Y,
  1428.                             ActiveSkinRect.Right, ActiveSkinRect.Bottom));
  1429.             end;
  1430.         end;
  1431.     end;
  1432.     CopyRect(BR, ActivePicture.Canvas, BRect);
  1433.   end;
  1434.   Cnvs.Draw(ObjectRect.Left, ObjectRect.Top, Buffer);
  1435.   Buffer.Free;
  1436. end;
  1437. procedure TspSkinTrackBarObject.MouseDown(X, Y: Integer; Button: TMouseButton);
  1438. var
  1439.   X1, Y1: Integer;
  1440. begin
  1441.   X1 := X - ObjectRect.Left;
  1442.   Y1 := Y - ObjectRect.Top;
  1443.   if PtInRect(CalcButtonRect(FButtonPos), Point(X1, Y1)) and (Button = mbLeft)
  1444.   then
  1445.     begin
  1446.       MoveActive := True;
  1447.       FOldMPoint.X := X1;
  1448.       FOldMPoint.Y := Y1;
  1449.       if not IsNullRect(ActiveButtonRect)
  1450.       then Parent.DrawSkinObject(Self);
  1451.     end
  1452.   else
  1453.     if MouseDownChangeValue and (Button = mbLeft)
  1454.     then
  1455.       case TrackKind of
  1456.         tkHorizontal:
  1457.           begin
  1458.             if X1 < BeginPoint.X then X1 := BeginPoint.X;
  1459.             if X1 > EndPoint.X then X1 := EndPoint.X;
  1460.             ButtonPos := Point(X1, BeginPoint.Y);
  1461.           end;
  1462.         tkVertical:
  1463.           begin
  1464.             if Y1 < EndPoint.Y then Y1 := EndPoint.Y;
  1465.             if Y1 > BeginPoint.Y then Y1 := BeginPoint.Y;
  1466.             ButtonPos := Point(BeginPoint.X, Y1);
  1467.           end;
  1468.      end;
  1469.   inherited MouseDown(X, Y, Button);
  1470. end;
  1471. procedure TspSkinTrackBarObject.MouseUp(X, Y: Integer; Button: TMouseButton);
  1472. begin
  1473.   if MoveActive and (Button = mbLeft)
  1474.   then
  1475.     begin
  1476.       MoveActive := False;
  1477.       if not IsNullRect(ActiveButtonRect)
  1478.       then
  1479.         Parent.DrawSkinObject(Self);
  1480.     end;
  1481.   inherited MouseUp(X, Y, Button);
  1482. end;
  1483. procedure TspSkinTrackBarObject.MouseMove(X, Y: Integer);
  1484. var
  1485.   X1, Y1: Integer;
  1486.   TestPos: Integer;
  1487. begin
  1488.   X1 := X - ObjectRect.Left;
  1489.   Y1 := Y - ObjectRect.Top;
  1490.   if MoveActive
  1491.   then
  1492.     case TrackKind of
  1493.       tkHorizontal:
  1494.         begin
  1495.           TestPos := FButtonPos.X + X1 - FOldMPoint.X;
  1496.           if (TestPos >= BeginPoint.X) and (TestPos <= EndPoint.X)
  1497.           then
  1498.             ButtonPos := Point(TestPos, FButtonPos.Y);
  1499.         end;
  1500.         tkVertical:
  1501.           begin
  1502.             TestPos := FButtonPos.Y + Y1 - FOldMPoint.Y;
  1503.             if (TestPos >= EndPoint.Y) and (TestPos <= BeginPoint.Y)
  1504.             then ButtonPos := Point(FButtonPos.X, TestPos);
  1505.           end;
  1506.     end;
  1507.   FOldMPoint := Point(X1, Y1);
  1508.   inherited MouseMove(X, Y);
  1509. end;
  1510. //============= TspSkinSwitchObject ==============//
  1511. constructor TspSkinSwitchObject.Create;
  1512. begin
  1513.   inherited Create(AParent, AData);
  1514.   FState := swsOff;
  1515. end;
  1516. procedure TspSkinSwitchObject.SetState;
  1517. begin
  1518.   FState := Value;
  1519.   if FState = swsOn then Active := True else Active := False;
  1520.   ReDraw;
  1521.   Parent.SwitchChangeStateEvent(IDName, FState);
  1522. end;
  1523. procedure TspSkinSwitchObject.SimpleSetState(Value: TSwitchState);
  1524. begin
  1525.   FState := Value;
  1526.   Active := FState = swsOn;
  1527.   if Active then FMorphKf := 1;
  1528. end;
  1529. procedure TspSkinSwitchObject.MouseDown;
  1530. begin
  1531.   if Button = mbLeft
  1532.   then
  1533.     if State = swsOff then State := swsOn else State := swsOff;
  1534.   inherited MouseDown(X, Y, Button);
  1535. end;
  1536. procedure TspSkinSwitchObject.MouseEnter;
  1537. begin
  1538.   FMouseIn := True;
  1539.   Parent.MouseEnterEvent(IDName);
  1540. end;
  1541. procedure TspSkinSwitchObject.MouseLeave;
  1542. begin
  1543.   FMouseIn := False;
  1544.   Parent.MouseLeaveEvent(IDName);
  1545. end;
  1546. //============= TspSkinButtonObject ============= //
  1547. constructor TspSkinButtonObject.Create;
  1548. begin
  1549.   inherited Create(AParent, AData);
  1550.   GroupIndex := -1;
  1551.   if AData <> nil
  1552.   then 
  1553.   with TspDataSkinButton(AData) do
  1554.   begin
  1555.     Self.DownRect := DownRect;
  1556.     Self.DisableSkinRect := DisableSkinRect;
  1557.     Self.GroupIndex := GroupIndex;
  1558.   end;
  1559.   MenuItem := nil;
  1560.   FPopupUp := False;
  1561. end;
  1562. procedure TspSkinButtonObject.Draw;
  1563. begin
  1564.   if not Enabled and not IsNullRect(DisableSkinRect)
  1565.   then
  1566.     Cnvs.CopyRect(ObjectRect, ActivePicture.Canvas, DisableSkinRect)
  1567.   else
  1568.   if (FDown and not IsNullRect(DownRect)) and
  1569.      ((GroupIndex <> -1) or FMouseIn)
  1570.   then
  1571.     Cnvs.CopyRect(ObjectRect, ActivePicture.Canvas, DownRect)
  1572.   else
  1573.     inherited Draw(Cnvs, UpDate);
  1574. end;
  1575. procedure TspSkinButtonObject.SetDown;
  1576. procedure DoAllUp;
  1577. var
  1578.   i, j: Integer;
  1579. begin
  1580.   j := GroupIndex;
  1581.   if j <> -1 then
  1582.   for i := 0 to Parent.ObjectList.Count - 1 do
  1583.     if (TspActiveSkinObject(Parent.ObjectList.Items[i]) is TspSkinButtonObject) and
  1584.        (TspActiveSkinObject(Parent.ObjectList.Items[i]).IDName <> IDName)
  1585.     then
  1586.       with TspSkinButtonObject(Parent.ObjectList.Items[i]) do
  1587.         if (j = GroupIndex) and FDown
  1588.         then
  1589.           begin
  1590.             SetDown(False);
  1591.             Break;
  1592.           end;
  1593. end;
  1594. begin
  1595.   FDown := Value;
  1596.   if IsNullRect(DownRect) and not FDown then Exit;
  1597.   if IsNullRect(DownRect) and FDown
  1598.   then
  1599.     begin
  1600.       DoAllUp;
  1601.       Exit;
  1602.     end
  1603.   else
  1604.     if FDown
  1605.     then
  1606.       begin
  1607.         if Morphing then MorphKf := 1;
  1608.         Parent.DrawSkinObject(Self);
  1609.         DoAllUp;
  1610.       end
  1611.     else
  1612.       begin
  1613.         if (GroupIndex <> -1) or (MenuItem <> nil) then Active := False;
  1614.         if Morphing and not IsNullRect(DownRect)
  1615.         then
  1616.           Parent.DrawSkinObject(Self);
  1617.         ReDraw;
  1618.       end;
  1619. end;
  1620. procedure TspSkinButtonObject.TrackMenu;
  1621. var
  1622.   R: TRect;
  1623.   Menu: TMenu;
  1624.   P: TPoint;
  1625. begin
  1626.   if MenuItem = nil then Exit;
  1627.   if MenuItem.Count = 0 then Exit;
  1628.   R := ObjectRect;
  1629.   if Parent.FForm.FormStyle = fsMDIChild
  1630.   then
  1631.     begin
  1632.       if Parent.FSkinSupport
  1633.       then
  1634.         P := Point(-Parent.NewClRect.Left, -Parent.NewClRect.Top)
  1635.       else
  1636.         P := Point(- 3, -Parent.GetDefCaptionHeight - 3);
  1637.       P := Parent.FForm.ClientToScreen(P);
  1638.       OffsetRect(R, P.X, P.Y);
  1639.     end
  1640.   else
  1641.     OffsetRect(R, Parent.FForm.Left, Parent.FForm.Top);
  1642.   Menu := MenuItem.GetParentMenu;
  1643.   if Menu is TspSkinPopupMenu
  1644.   then
  1645.     TspSkinPopupMenu(Menu).PopupFromRect(R, FPopupUp)
  1646.   else
  1647.     begin
  1648.       Parent.SkinMenuOpen;
  1649.       if Menu is TspSkinMainMenu
  1650.       then
  1651.         Parent.SkinMenu.Popup(nil, TspSkinMainMenu(Menu).SkinData, 0, R, MenuItem, FPopupUp)
  1652.       else
  1653.         if Parent.MenusSkinData = nil
  1654.         then
  1655.           Parent.SkinMenu.Popup(nil, Parent.SkinData, 0, R, MenuItem, FPopupUp)
  1656.         else
  1657.           Parent.SkinMenu.Popup(nil, Parent.MenusSkinData, 0, R, MenuItem, FPopupUp);
  1658.     end;
  1659. end;
  1660. procedure TspSkinButtonObject.MouseDown;
  1661. begin
  1662.   if not Enabled then Exit;
  1663.   if (Button = mbLeft) and not FDown
  1664.   then
  1665.     begin
  1666.       SetDown(True);
  1667.       TrackMenu;
  1668.     end;
  1669.   inherited MouseDown(X, Y, Button);
  1670. end;
  1671. procedure TspSkinButtonObject.MouseUp;
  1672. begin
  1673.   if not Enabled then Exit;
  1674.   if (Button <> mbLeft)
  1675.   then
  1676.     begin
  1677.       inherited MouseUp(X, Y, Button);
  1678.       Exit;
  1679.     end;
  1680.   if (MenuItem = nil) and FDown and (GroupIndex = -1)
  1681.   then
  1682.     SetDown(False);
  1683.   inherited MouseUp(X, Y, Button);
  1684. end;
  1685. procedure TspSkinButtonObject.MouseEnter;
  1686. begin
  1687.   FMouseIn := True;
  1688.   Active := True;
  1689.   if IsNullRect(DownRect) or not FDown
  1690.   then
  1691.     begin
  1692.       if not IsNullRect(ActiveSkinRect) then ReDraw;
  1693.     end
  1694.   else
  1695.     if not (FDown and (GroupIndex <> -1))
  1696.     then
  1697.       begin
  1698.         if FDown
  1699.         then
  1700.           Parent.DrawSkinObject(Self)
  1701.         else
  1702.           if not IsNullRect(ActiveSkinRect) and (GroupIndex = -1) then ReDraw;
  1703.     end;
  1704.   Parent.MouseEnterEvent(IDName);
  1705. end;
  1706. procedure TspSkinButtonObject.MouseLeave;
  1707. begin
  1708.   FMouseIn := False;
  1709.   if not (FDown and not IsNullRect(DownRect) and
  1710.          ((MenuItem <> nil) or (GroupIndex <> -1)))
  1711.   then
  1712.     begin
  1713.       Active := False;
  1714.       if Morphing and FDown then Morphkf := 1;
  1715.       if (not IsNullRect(ActiveSkinRect)) or
  1716.          (not IsNullRect(DownRect) and (GroupIndex = -1)) then Redraw;
  1717.     end;
  1718.   Parent.MouseLeaveEvent(IDName);
  1719. end;
  1720. //============= TspSkinStdButtonObject =================//
  1721. constructor TspSkinStdButtonObject.Create;
  1722. begin
  1723.   inherited Create(AParent, AData);
  1724.   if AData <> nil
  1725.   then
  1726.     with TspDataSkinStdButton(AData) do
  1727.     begin
  1728.       Self.Command := Command;
  1729.       Self.RestoreRect := RestoreRect;
  1730.       Self.RestoreActiveRect := RestoreActiveRect;
  1731.       Self.RestoreDownRect := RestoreDownRect;
  1732.       FSkinSupport := True;
  1733.     end
  1734.   else
  1735.     FSkinSupport := False;
  1736. end;
  1737. procedure TspSkinStdButtonObject.DefaultDraw(Cnvs: TCanvas);
  1738. var
  1739.   Buffer: TBitMap;
  1740.   R: TRect;
  1741.   IX, IY: Integer;
  1742.   IC: TColor;
  1743. begin
  1744.   if (Command = cmSysMenu) and Parent.FShowIcon
  1745.   then
  1746.     begin
  1747.       Parent.DrawFormIcon(Cnvs, ObjectRect.Left, ObjectRect.Top);
  1748.       Exit;
  1749.     end;
  1750.   Buffer := TBitMap.Create;
  1751.   Buffer.Width := RectWidth(ObjectRect);
  1752.   Buffer.Height := RectHeight(ObjectRect);
  1753.   R := Rect(0, 0, Buffer.Width, Buffer.Height);
  1754.   with Buffer.Canvas do
  1755.   begin
  1756.     if FDown and FMouseIn
  1757.     then
  1758.       begin
  1759.         Frame3D(Buffer.Canvas, R, SP_XP_BTNFRAMECOLOR, SP_XP_BTNFRAMECOLOR, 1);
  1760.         Brush.Color := SP_XP_BTNDOWNCOLOR;
  1761.         FillRect(R);
  1762.       end
  1763.     else
  1764.       if FMouseIn
  1765.       then
  1766.         begin
  1767.           Frame3D(Buffer.Canvas, R, SP_XP_BTNFRAMECOLOR, SP_XP_BTNFRAMECOLOR, 1);
  1768.           Brush.Color := SP_XP_BTNACTIVECOLOR;
  1769.           FillRect(R);
  1770.         end
  1771.       else
  1772.         begin
  1773.           Brush.Color := clBtnFace;
  1774.           FillRect(R);
  1775.         end;
  1776.   end;
  1777.   IX := Buffer.Width div 2 - 5;
  1778.   IY := Buffer.Height div 2 - 4;
  1779.   if FDown and FMouseIn
  1780.   then
  1781.     begin
  1782.       Inc(IX);
  1783.       Inc(IY);
  1784.     end;
  1785.   if Enabled
  1786.   then
  1787.     IC := clBtnText
  1788.   else
  1789.     IC := clBtnShadow;
  1790.   case Command of
  1791.     cmClose:
  1792.       DrawCloseImage(Buffer.Canvas, IX, IY, IC);
  1793.     cmMaximize:
  1794.       if Parent.WindowState = wsMaximized
  1795.       then DrawRestoreImage(Buffer.Canvas, IX, IY, IC)
  1796.       else DrawMaximizeImage(Buffer.Canvas, IX, IY, IC);
  1797.     cmMinimize:
  1798.       if Parent.WindowState = wsMinimized
  1799.       then DrawRestoreImage(Buffer.Canvas, IX, IY, IC)
  1800.       else DrawMinimizeImage(Buffer.Canvas, IX, IY, IC);
  1801.     cmRollUp:
  1802.       if Parent.RollUpState
  1803.       then
  1804.         DrawRestoreRollUpImage(Buffer.Canvas, IX, IY, IC)
  1805.       else
  1806.         DrawRollUpImage(Buffer.Canvas, IX, IY, IC);
  1807.     cmSysMenu:
  1808.       DrawSysMenuImage(Buffer.Canvas, IX, IY, IC);
  1809.   end;
  1810.   Cnvs.Draw(ObjectRect.Left, ObjectRect.Top, Buffer);
  1811.   Buffer.Free;
  1812. end;
  1813. function TspSkinStdButtonObject.CanMorphing: Boolean;
  1814. begin
  1815.   if (Command = cmSysMenu) and Parent.ShowIcon and
  1816.      (SkinRectInAPicture)
  1817.   then
  1818.     Result := False
  1819.   else
  1820.     Result := inherited CanMorphing;
  1821. end;
  1822. procedure TspSkinStdButtonObject.Draw;
  1823. procedure CreateRestoreObjectImage(B: TBitMap; AActive: Boolean);
  1824. begin
  1825.   B.Width := RectWidth(ObjectRect);
  1826.   B.Height := RectHeight(ObjectRect);
  1827.   with B.Canvas do
  1828.   begin
  1829.     if AActive
  1830.     then
  1831.       CopyRect(Rect(0, 0, B.Width, B.Height), ActivePicture.Canvas, RestoreActiveRect)
  1832.     else
  1833.       CopyRect(Rect(0, 0, B.Width, B.Height), ActivePicture.Canvas, RestoreRect);
  1834.   end;
  1835. end;
  1836. var
  1837.   PBuffer, APBuffer: TspEffectBmp;
  1838.   Buffer, ABuffer: TBitMap;
  1839.   ASR, SR: TRect;
  1840.   FRestoreMode: Boolean;
  1841. begin
  1842.   if not FSkinSupport
  1843.   then
  1844.     begin
  1845.       DefaultDraw(Cnvs);
  1846.       Exit;
  1847.     end;
  1848.   if not Enabled
  1849.   then
  1850.     begin
  1851.       inherited;
  1852.       Exit;
  1853.     end;
  1854.   if (Command = cmSysMenu) and Parent.FShowIcon and SkinRectInAPicture
  1855.   then
  1856.     begin
  1857.       Parent.DrawFormIcon(Cnvs, ObjectRect.Left, ObjectRect.Top);
  1858.       FMorphKf := 0;
  1859.       Exit;
  1860.     end;
  1861.   FRestoreMode := False;
  1862.   case Command of
  1863.     cmMaximize:
  1864.       if Parent.WindowState = wsMaximized
  1865.       then FRestoreMode := True;
  1866.     cmMinimize:
  1867.       if Parent.WindowState = wsMinimized
  1868.       then FRestoreMode := True;
  1869.     cmRollUp:
  1870.       if Parent.RollUpState
  1871.       then FRestoreMode := True;
  1872.   end;
  1873.   if IsNullRect(RestoreRect) or not FRestoreMode
  1874.   then
  1875.     inherited
  1876.   else
  1877.     begin
  1878.       if FDown and not IsNullRect(RestoreDownRect) and FMouseIn
  1879.       then
  1880.         Cnvs.CopyRect(ObjectRect, ActivePicture.Canvas, RestoreDownRect)
  1881.       else
  1882.         begin
  1883.           ASR := RestoreActiveRect;
  1884.           SR := RestoreRect;
  1885.           if not Morphing or
  1886.           ((Active and (MorphKf = 1)) or (not Active and (MorphKf  = 0)))
  1887.           then
  1888.             begin
  1889.               if Active and not IsNullRect(ASR)
  1890.               then
  1891.                 Cnvs.CopyRect(ObjectRect, ActivePicture.Canvas, ASR)
  1892.               else
  1893.                 Cnvs.CopyRect(ObjectRect, ActivePicture.Canvas, SR);
  1894.             end
  1895.           else
  1896.             begin
  1897.               Buffer := TBitMap.Create;
  1898.               ABuffer := TBitMap.Create;
  1899.               CreateRestoreObjectImage(Buffer, False);
  1900.               CreateRestoreObjectImage(ABuffer, True);
  1901.               PBuffer := TspEffectBmp.CreateFromhWnd(Buffer.Handle);
  1902.               APBuffer := TspEffectBmp.CreateFromhWnd(ABuffer.Handle);
  1903.               case MorphKind of
  1904.                 mkDefault: PBuffer.Morph(APBuffer, MorphKf);
  1905.                 mkGradient: PBuffer.MorphGrad(APBuffer, MorphKf);
  1906.                 mkLeftGradient: PBuffer.MorphLeftGrad(APBuffer, MorphKf);
  1907.                 mkRightGradient: PBuffer.MorphRightGrad(APBuffer, MorphKf);
  1908.                 mkLeftSlide: PBuffer.MorphLeftSlide(APBuffer, MorphKf);
  1909.                 mkRightSlide: PBuffer.MorphRightSlide(APBuffer, MorphKf);
  1910.                 mkPush: PBuffer.MorphPush(APBuffer, MorphKf);
  1911.               end;
  1912.               PBuffer.Draw(Cnvs.Handle, ObjectRect.Left, ObjectRect.Top);
  1913.               PBuffer.Free;
  1914.               APBuffer.Free;
  1915.               Buffer.Free;
  1916.               ABuffer.Free;
  1917.             end;
  1918.         end;
  1919.     end;
  1920. end;
  1921. procedure TspSkinStdButtonObject.DoMax;
  1922. begin
  1923.   if Parent.SupportNCArea
  1924.   then
  1925.     begin
  1926.      if Parent.WindowState = wsMaximized
  1927.      then Parent.WindowState := wsNormal
  1928.      else Parent.WindowState := wsMaximized;
  1929.     end
  1930.   else
  1931.     if Parent.WindowState <> wsMaximized
  1932.     then Parent.WindowState := wsMaximized
  1933.     else Parent.WindowState := wsNormal;
  1934. end;
  1935. procedure TspSkinStdButtonObject.DoMin;
  1936. begin
  1937.   if Parent.SupportNCArea
  1938.   then
  1939.     begin
  1940.       if Parent.WindowState = wsMinimized
  1941.       then Parent.WindowState := wsNormal
  1942.       else Parent.WindowState := wsMinimized;
  1943.     end
  1944.   else
  1945.     Parent.WindowState := wsMinimized;
  1946. end;
  1947. procedure TspSkinStdButtonObject.DoClose;
  1948. begin
  1949.   Parent.FForm.Close;
  1950. end;
  1951. procedure TspSkinStdButtonObject.DoRollUp;
  1952. begin
  1953.   Parent.RollUpState := not Parent.RollUpState;
  1954. end;
  1955. procedure TspSkinStdButtonObject.DoCommand;
  1956. begin
  1957.   case Command of
  1958.     cmClose: DoClose;
  1959.     cmMinimize:
  1960.       if Parent.AlwaysMinimizeToTray
  1961.       then
  1962.         Parent.MinimizeToTray
  1963.       else
  1964.         DoMin;
  1965.     cmMaximize: DoMax;
  1966.     cmRollUp: DoRollUp;
  1967.   end;
  1968. end;
  1969. procedure TspSkinStdButtonObject.DblClick;
  1970. begin
  1971.   if Command = cmSysMenu then DoClose;
  1972. end;
  1973. procedure TspSkinStdButtonObject.MouseDown ;
  1974. begin
  1975.   if not Enabled then Exit;
  1976.   if (Button = mbLeft) and not FDown
  1977.   then
  1978.     begin
  1979.       SetDown(True);
  1980.       if (Command = cmSysMenu)
  1981.       then
  1982.         begin
  1983.           Self.MenuItem := Parent.GetSystemMenu;
  1984.           TrackMenu;
  1985.         end;
  1986.     end;
  1987. end;
  1988. procedure TspSkinStdButtonObject.MouseUp;
  1989. begin
  1990.   if (Command = cmClose)
  1991.   then
  1992.     begin
  1993.       inherited;
  1994.       if Active and (Button = mbLeft) then DoCommand;
  1995.     end
  1996.   else
  1997.     begin
  1998.       if Active and (Button = mbLeft) then DoCommand;
  1999.       inherited;
  2000.     end;
  2001. end;
  2002. //==============TspSkinMainMenuItem=============//
  2003. constructor TspSkinMainMenuItem.Create;
  2004. begin
  2005.   inherited Create(AParent, AData);
  2006.   with TspDataSkinMainMenuItem(AData) do
  2007.   begin
  2008.     Self.FontName := FontName;
  2009.     Self.FontHeight := FontHeight;
  2010.     Self.FontStyle := FontStyle;
  2011.     Self.FontColor := FontColor;
  2012.     Self.ActiveFontColor := ActiveFontColor;
  2013.     Self.DownFontColor := DownFontColor;
  2014.     Self.TextRct := TextRct;
  2015.     Self.DownRect := DownRect;
  2016.     Self.LO := ItemLO;
  2017.     Self.RO := ItemRO;
  2018.   end;
  2019.   if IsNullRect(DownRect) then
  2020.     if IsNullRect(ActiveSkinRect)
  2021.     then DownRect := SkinRect else DownRect := ActiveSkinRect;
  2022.   if IsNullRect(ActiveSkinRect) then Morphing := False;
  2023.   OldEnabled := Enabled;
  2024.   Visible := True;
  2025. end;
  2026. procedure TspSkinMainMenuItem.SetDown;
  2027. begin
  2028.   FDown := Value;
  2029.   if FDown
  2030.   then
  2031.     begin
  2032.       Parent.DrawSkinObject(Self);
  2033.       TrackMenu;
  2034.       if not Parent.InMainMenu
  2035.       then
  2036.         begin
  2037.           Parent.InMainMenu := True;
  2038.           if Assigned(Parent.FOnMainMenuEnter) then Parent.FOnMainMenuEnter(Parent);
  2039.         end;
  2040.     end
  2041.   else
  2042.     begin
  2043.       Active := False;
  2044.       if Morphing then MorphKf := 1;
  2045.       ReDraw;
  2046.     end;
  2047. end;
  2048. procedure TspSkinMainMenuItem.SearchActive;
  2049. var
  2050.   i: Integer;
  2051. begin
  2052.   for i := 0 to Parent.ObjectList.Count - 1 do
  2053.    if (TspActiveSkinObject(Parent.ObjectList.Items[i]) is TspSkinMainMenuItem)
  2054.       and (TspSkinMainMenuItem(Parent.ObjectList.Items[i]).IDName <> IDName)
  2055.       and (TspSkinMainMenuItem(Parent.ObjectList.Items[i]).Active)
  2056.    then
  2057.      begin
  2058.        TspSkinMainMenuItem(Parent.ObjectList.Items[i]).MouseLeave;
  2059.        Break;
  2060.      end;
  2061. end;
  2062. function TspSkinMainMenuItem.SearchDown;
  2063. var
  2064.   i: Integer;
  2065. begin
  2066.   Result := False;
  2067.   for i := 0 to Parent.ObjectList.Count - 1 do
  2068.    if (TspActiveSkinObject(Parent.ObjectList.Items[i]) is TspSkinMainMenuItem)
  2069.       and (TspSkinMainMenuItem(Parent.ObjectList.Items[i]).IDName <> IDName)
  2070.       and (TspSkinMainMenuItem(Parent.ObjectList.Items[i]).FDown)
  2071.    then
  2072.      begin
  2073.        TspSkinMainMenuItem(Parent.ObjectList.Items[i]).SetDown(False);
  2074.        Result := True;
  2075.        Break;
  2076.      end;
  2077. end;
  2078. procedure TspSkinMainMenuItem.Draw;
  2079. function CalcObjectRect(Cnvs: TCanvas): TRect;
  2080. var
  2081.   w, i, j: Integer;
  2082.   R, TR: TRect;
  2083. begin
  2084.   w := TextRct.Left + RectWidth(SkinRect) - TextRct.Right;
  2085.   with Cnvs do
  2086.   begin
  2087.     Font.Name := FontName;
  2088.     Font.Style := FontStyle;
  2089.     Font.Height := FontHeight;
  2090.   end;
  2091.   TR := Rect(0, 0, 0, 0);
  2092.   DrawText(Cnvs.Handle, PChar(MenuItem.Caption),
  2093.     Length(MenuItem.Caption), TR, DT_CALCRECT or DT_CENTER);
  2094.   w := w + RectWidth(TR) + 2;
  2095.   R := Rect(0, 0, 0, 0);
  2096.   j := Parent.ObjectList.IndexOf(Self);
  2097.   for i := j - 1  downto 0 do
  2098.     if TspActiveSkinObject(Parent.ObjectList.Items[i]) is TspSkinMainMenuItem
  2099.     then
  2100.       begin
  2101.         R.Left := TspActiveSkinObject(Parent.ObjectList.Items[i]).ObjectRect.Right;
  2102.         Break;
  2103.       end;
  2104.   if R.Left = 0 then R.Left := Parent.NewMainMenuRect.Left;
  2105.   R.Top := Parent.NewMainMenuRect.Top;
  2106.   R.Right := R.Left + w;
  2107.   R.Bottom := R.Top + RectHeight(SkinRect);
  2108.   TempObjectRect := NullRect;
  2109.   with Parent do
  2110.   begin
  2111.     if SupportNCArea and not UpDate and (R.Top > NewClRect.Bottom)
  2112.     then
  2113.       begin
  2114.         TempObjectRect := R;
  2115.         OffsetRect(R, 0, -NewClRect.Bottom);
  2116.       end;  
  2117.   end;
  2118.   Result := R;
  2119. end;
  2120. procedure CreateItemImage(B: TBitMap; Rct: TRect; AActive: Boolean);
  2121. var
  2122.   XO, w, XCnt: Integer;
  2123.   TR: TRect;
  2124.   X: Integer;
  2125. begin
  2126.   B.Width := RectWidth(ObjectRect);
  2127.   B.Height := RectHeight(ObjectRect);
  2128.   with B.Canvas do
  2129.   begin
  2130.     if LO <> 0 then
  2131.        CopyRect(Rect(0, 0, LO, B.Height), ActivePicture.Canvas,
  2132.                 Rect(Rct.Left, Rct.Top, Rct.Left + LO, Rct.Bottom));
  2133.     if RO <> 0 then
  2134.        CopyRect(Rect(B.Width - RO, 0, B.Width, B.Height),
  2135.                 ActivePicture.Canvas,
  2136.                 Rect(Rct.Right - RO, Rct.Top, Rct.Right, Rct.Bottom));
  2137.     Inc(Rct.Left, LO);
  2138.     Dec(Rct.Right, RO);
  2139.     w := RectWidth(Rct);
  2140.     XCnt := (B.Width - LO - RO) div w;
  2141.     for X := 0 to XCnt do
  2142.     begin
  2143.       if LO + X * w + w > B.Width - RO
  2144.       then XO := LO + X * w + w - (B.Width - RO)
  2145.       else XO := 0;
  2146.       B.Canvas.CopyRect(Rect(LO + X * w, 0, LO + X * w + w - XO,
  2147.                         B.Height),
  2148.                         ActivePicture.Canvas,
  2149.                         Rect(Rct.Left, Rct.Top, Rct.Right - XO, Rct.Bottom));
  2150.     end;
  2151.     Brush.Style := bsClear;
  2152.     if FDown
  2153.     then
  2154.       Font.Color := DownFontColor
  2155.     else
  2156.       if AActive
  2157.       then Font.Color := ActiveFontColor
  2158.       else
  2159.         if MenuItem.Enabled
  2160.         then Font.Color := FontColor
  2161.         else Font.Color := UnEnabledFontColor;
  2162.     Font.Name := FontName;
  2163.     Font.Style := FontStyle;
  2164.     Font.Height := FontHeight;
  2165.     TR := TextRct;
  2166.     DrawText(B.Canvas.Handle, PChar(MenuItem.Caption),
  2167.       Length(MenuItem.Caption), TR, DT_CALCRECT);
  2168.     Inc(TR.Right, 2);
  2169.     DrawText(B.Canvas.Handle, PChar(MenuItem.Caption),
  2170.       Length(MenuItem.Caption), TR, DT_CENTER or DT_VCENTER);
  2171.   end;
  2172. end;
  2173. var
  2174.   Buffer, ABuffer: TBitMap;
  2175.   PBuffer, APBuffer: TspEffectBmp;
  2176. begin
  2177.   if IsNullRect(SkinRect) or IsNullRect(TextRct) then Exit;
  2178.   Buffer := TBitMap.Create;
  2179.   ObjectRect := CalcObjectRect(Buffer.Canvas);
  2180.   if ObjectRect.Right > Parent.NewMainMenuRect.Right
  2181.   then
  2182.     begin
  2183.       if Visible
  2184.       then
  2185.         begin
  2186.           OldEnabled := Enabled;
  2187.           Enabled := False;
  2188.           Visible := False;
  2189.         end;
  2190.       Buffer.Free;
  2191.       Exit;
  2192.     end
  2193.   else
  2194.     if not Visible
  2195.     then
  2196.       begin
  2197.         Visible := True;
  2198.         Enabled := OldEnabled;
  2199.       end;
  2200.   if FDown
  2201.   then
  2202.     begin
  2203.       CreateItemImage(Buffer, DownRect, True);
  2204.       Cnvs.Draw(ObjectRect.Left, ObjectRect.Top, Buffer);
  2205.     end
  2206.   else
  2207.     if not Morphing or
  2208.        ((Active and (MorphKf = 1)) or (not Active and (MorphKf  = 0)))
  2209.     then
  2210.       begin
  2211.         if Active
  2212.         then
  2213.           begin
  2214.             if isNullRect(ActiveSkinRect)
  2215.             then
  2216.               CreateItemImage(Buffer, SkinRect, True)
  2217.             else
  2218.               CreateItemImage(Buffer, ActiveSkinRect, True);
  2219.           end
  2220.         else CreateItemImage(Buffer, SkinRect, False);
  2221.         Cnvs.Draw(ObjectRect.Left, ObjectRect.Top, Buffer);
  2222.       end
  2223.     else
  2224.       begin
  2225.         CreateItemImage(Buffer, SkinRect, False);
  2226.         ABuffer := TBitMap.Create;
  2227.         CreateItemImage(ABuffer, ActiveSkinRect, True);
  2228.         PBuffer := TspEffectBmp.CreateFromhWnd(Buffer.Handle);
  2229.         APBuffer := TspEffectBmp.CreateFromhWnd(ABuffer.Handle);
  2230.         case MorphKind of
  2231.           mkDefault: PBuffer.Morph(APBuffer, MorphKf);
  2232.           mkGradient: PBuffer.MorphGrad(APBuffer, MorphKf);
  2233.           mkLeftGradient: PBuffer.MorphLeftGrad(APBuffer, MorphKf);
  2234.           mkRightGradient: PBuffer.MorphRightGrad(APBuffer, MorphKf);
  2235.           mkLeftSlide: PBuffer.MorphLeftSlide(APBuffer, MorphKf);
  2236.           mkRightSlide: PBuffer.MorphRightSlide(APBuffer, MorphKf);
  2237.           mkPush: PBuffer.MorphPush(APBuffer, MorphKf);
  2238.         end;
  2239.         PBuffer.Draw(Cnvs.Handle, ObjectRect.Left, ObjectRect.Top);
  2240.         PBuffer.Free;
  2241.         APBuffer.Free;
  2242.         ABuffer.Free;
  2243.       end;
  2244.   Buffer.Free;
  2245.   with Parent do
  2246.   begin
  2247.     if SupportNCArea and not UpDate and not IsNullRect(TempObjectRect)
  2248.     then
  2249.       ObjectRect := TempObjectRect;
  2250.   end;
  2251. end;
  2252. procedure TspSkinMainMenuItem.MouseEnter;
  2253. begin
  2254.   if SearchDown
  2255.   then
  2256.     begin
  2257.       Active := True;
  2258.       FMouseIn := True;
  2259.       if Morphing then MorphKf := 1;
  2260.       SetDown(True);
  2261.     end
  2262.   else
  2263.     begin
  2264.       SearchActive;
  2265.       FMouseIn := True;
  2266.       Active := True;
  2267.       ReDraw;
  2268.     end;
  2269. end;
  2270. procedure TspSkinMainMenuItem.MouseLeave;
  2271. begin
  2272.   Active := False;
  2273.   FMouseIn := False;
  2274.   if Morphing and FDown then MorphKf := 0;
  2275.   Redraw;
  2276.   Parent.MouseLeaveEvent(IDName);
  2277. end;
  2278. procedure TspSkinMainMenuItem.TrackMenu;
  2279. var
  2280.   R: TRect;
  2281.   Menu: TMenu;
  2282.   P: TPoint;
  2283. begin
  2284.   Parent.SkinMenuOpen;
  2285.   R := ObjectRect;
  2286.   if Parent.FForm.FormStyle = fsMDIChild
  2287.   then
  2288.     begin
  2289.       if Parent.FSkinSupport
  2290.       then
  2291.         P := Point(-Parent.NewClRect.Left, -Parent.NewClRect.Top)
  2292.       else
  2293.         P := Point(- 3, -Parent.GetDefCaptionHeight - 3);
  2294.       P := Parent.FForm.ClientToScreen(P);
  2295.       OffsetRect(R, P.X, P.Y);
  2296.     end
  2297.   else
  2298.     OffsetRect(R, Parent.FForm.Left, Parent.FForm.Top);
  2299.   Menu := MenuItem.GetParentMenu;
  2300.   if (Menu is TspSkinMainMenu) and (TspSkinMainMenu(Menu).SkinData <> nil)
  2301.   then
  2302.     Parent.SkinMenu.Popup(nil, TspSkinMainMenu(Menu).SkinData, 0, R, MenuItem,
  2303.       TspSkinMainMenu(Menu).SkinData.MainMenuPopupUp)
  2304.   else
  2305.     if Parent.MenusSkinData = nil
  2306.     then
  2307.       Parent.SkinMenu.Popup(nil, Parent.SkinData, 0, R, MenuItem, Parent.FSD.MainMenuPopupUp)
  2308.     else
  2309.       Parent.SkinMenu.Popup(nil, Parent.MenusSkinData, 0, R, MenuItem, Parent.FSD.MainMenuPopupUp);
  2310. end;
  2311. procedure TspSkinMainMenuItem.MouseDown;
  2312. var
  2313.   Menu: TMenu;
  2314. begin
  2315.   if not Enabled then Exit;
  2316.   if Button = mbLeft
  2317.   then
  2318.     begin
  2319.       if MenuItem.Count <> 0 then SetDown(True)
  2320.       else
  2321.         begin
  2322.           SetDown(False);
  2323.           Parent.InMenu := False;
  2324.           Menu := MenuItem.GetParentMenu;
  2325.           Menu.DispatchCommand(MenuItem.Command);
  2326.         end;
  2327.      end;
  2328.   inherited MouseDown(X, Y, Button);
  2329. end;
  2330. //==============TspSkinFrameObject===============//
  2331. constructor TspSkinFrameObject.Create;
  2332. begin
  2333.   inherited;
  2334.   FFrame := 1;
  2335. end;
  2336. procedure TspSkinFrameObject.SetFrame(Value: Integer);
  2337. begin
  2338.   if Value < CountFrames then FFrame := Value;
  2339.   Parent.DrawSkinObject(Self);
  2340. end;
  2341. procedure TspSkinFrameObject.Draw;
  2342. var
  2343.   R: TRect;
  2344. begin
  2345.   case FramesPlacement of
  2346.     fpHorizontal:
  2347.       R := Rect(ActiveSkinRect.Left + (FFrame - 1) * FrameW, ActiveSkinRect.Top,
  2348.                 ActiveSkinRect.Left + FFrame * FrameW,
  2349.                 ActiveSkinRect.Top + FrameH);
  2350.     fpVertical:
  2351.       R := Rect(ActiveSkinRect.Left, ActiveSkinRect.Top + (FFrame - 1) * FrameH,
  2352.                 ActiveSkinRect.Left + FrameW,
  2353.                 ActiveSkinRect.Top + FFrame * FrameH);
  2354.   end;
  2355.   Cnvs.CopyRect(ObjectRect, ActivePicture.Canvas, R);
  2356. end;
  2357. //=================TspSkinFrameGaugeObject=================//
  2358. constructor TspSkinFrameGaugeObject.Create;
  2359. begin
  2360.   inherited;
  2361.   FValue := 0;
  2362.   with TspDataSkinFrameGaugeObject(AData) do
  2363.   begin
  2364.     Self.MinValue := MinValue;
  2365.     Self.MaxValue := MaxValue;
  2366.     Self.CountFrames := CountFrames;
  2367.     Self.FramesPlacement := FramesPlacement;
  2368.   end;
  2369.   if CountFrames > 0 then
  2370.   case FramesPlacement of
  2371.     fpHorizontal:
  2372.       begin
  2373.         FrameW := RectWidth(ActiveSkinRect) div CountFrames;
  2374.         FrameH := RectHeight(ActiveSkinRect);
  2375.       end;
  2376.     fpVertical:
  2377.       begin
  2378.         FrameH := RectHeight(ActiveSkinRect) div CountFrames;
  2379.         FrameW := RectWidth(ActiveSkinRect);
  2380.       end;
  2381.   end;
  2382. end;
  2383. procedure TspSkinFrameGaugeObject.MouseEnter;
  2384. begin
  2385.   FMouseIn := True;
  2386.   Active := True;
  2387.   Parent.MouseEnterEvent(IDName);
  2388. end;
  2389. procedure TspSkinFrameGaugeObject.MouseLeave;
  2390. begin
  2391.   FMouseIn := False;
  2392.   Active := False;
  2393.   Parent.MouseLeaveEvent(IDName);
  2394. end;
  2395. procedure TspSkinFrameGaugeObject.SimplySetValue;
  2396. begin
  2397.   if (FValue = AValue) or (AValue > MaxValue) or
  2398.      (AValue < MinValue) then Exit;
  2399.   FValue := AValue;
  2400. end;
  2401. procedure TspSkinFrameGaugeObject.SetValue;
  2402. begin
  2403.   if (FValue = AValue) or (AValue > MaxValue) or
  2404.      (AValue < MinValue) then Exit;
  2405.   FValue := AValue;
  2406.   Parent.DrawSkinObject(Self);
  2407. end;
  2408. function TspSkinFrameGaugeObject.CalcFrame;
  2409. var
  2410.   FValInc: Integer;
  2411. begin
  2412.   FValInc := (MaxValue - MinValue) div (CountFrames - 1);
  2413.   if FValInc = 0
  2414.   then
  2415.     Result := 1
  2416.   else
  2417.     Result := Abs(FValue - MinValue) div FValInc + 1;
  2418. end;
  2419. procedure TspSkinFrameGaugeObject.Draw;
  2420. begin
  2421.   if CountFrames > 1 then FFrame := CalcFrame else FFrame := 1;
  2422.   inherited;
  2423. end;
  2424. //==============TspSkinFrameRegulatorObject================//
  2425. constructor TspSkinFrameRegulatorObject.Create;
  2426. begin
  2427.   inherited;
  2428.   FValue := 0;
  2429.   with TspDataSkinFrameregulatorObject(AData) do
  2430.   begin
  2431.     Self.MinValue := MinValue;
  2432.     Self.MaxValue := MaxValue;
  2433.     Self.CountFrames := CountFrames;
  2434.     Self.FramesPlacement := FramesPlacement;
  2435.     Self.Kind := Kind;
  2436.   end;
  2437.   if CountFrames > 0 then
  2438.   case FramesPlacement of
  2439.     fpHorizontal:
  2440.       begin
  2441.         FrameW := RectWidth(ActiveSkinRect) div CountFrames;
  2442.         FrameH := RectHeight(ActiveSkinRect);
  2443.       end;
  2444.     fpVertical:
  2445.       begin
  2446.         FrameH := RectHeight(ActiveSkinRect) div CountFrames;
  2447.         FrameW := RectWidth(ActiveSkinRect);
  2448.       end;
  2449.   end;
  2450.   if FValue < MinValue then FValue := MinValue;
  2451.   if FValue > MaxValue then FValue := MaxValue;
  2452. end;
  2453. procedure TspSkinFrameRegulatorObject.CalcValue;
  2454. var
  2455.   Offset: Integer;
  2456.   Plus: Boolean;
  2457.   FW: Integer;
  2458. begin
  2459.   FW := 0;
  2460.   case Kind of
  2461.     rkRound: if FrameW > FrameH then FW := FrameH else FW := FrameW;
  2462.     rkVertical: FW := FrameH;
  2463.     rkHorizontal: FW := FrameW;
  2464.   end;
  2465.   FPixInc := FW div (CountFrames - 1);
  2466.   FValInc := (MaxValue - MinValue) div (CountFrames - 1);
  2467.   if FPixInc = 0 then FPixInc := 1;
  2468.   if FValInc = 0 then FValInc := 1;
  2469.   Plus := CurV >= StartV;
  2470.   if Plus
  2471.   then Offset := CurV - StartV
  2472.   else Offset := StartV - CurV;
  2473.   if Offset >= FPixInc
  2474.   then
  2475.     begin
  2476.       StartV := CurV;
  2477.       if Plus
  2478.       then TempValue := TempValue + FValInc
  2479.       else TempValue := TempValue - FValInc;
  2480.       if TempValue < MinValue then TempValue := MinValue;
  2481.       if TempValue > MaxValue then TempValue := MaxValue;
  2482.       Value := TempValue;
  2483.     end;
  2484. end;
  2485. procedure TspSkinFrameRegulatorObject.SetValue;
  2486. begin
  2487.   if (FValue = AValue) or (AValue > MaxValue) or
  2488.      (AValue < MinValue) then Exit;
  2489.   FValue := AValue;
  2490.   Parent.DrawSkinObject(Self);
  2491.   Parent.FrameRegulatorChangeValueEvent(IDName, FValue);
  2492. end;
  2493. procedure TspSkinFrameRegulatorObject.SimplySetValue;
  2494. begin
  2495.   if (FValue = AValue) or (AValue > MaxValue) or
  2496.      (AValue < MinValue) then Exit;
  2497.   FValue := AValue;
  2498.   Parent.FrameRegulatorChangeValueEvent(IDName, FValue);
  2499. end;
  2500. function TspSkinFrameRegulatorObject.CalcFrame;
  2501. var
  2502.   FValInc: Integer;
  2503. begin
  2504.   FValInc := (MaxValue - MinValue) div (CountFrames - 1);
  2505.   if FValInc = 0
  2506.   then
  2507.     Result := 1
  2508.   else
  2509.     Result := Abs(FValue - MinValue) div FValInc + 1;
  2510. end;
  2511. procedure TspSkinFrameRegulatorObject.Draw;
  2512. begin
  2513.   if CountFrames > 1 then FFrame := CalcFrame else FFrame := 1;
  2514.   inherited;
  2515. end;
  2516. procedure TspSkinFrameRegulatorObject.MouseDown(X, Y: Integer; Button: TMouseButton);
  2517. var
  2518.   X1, Y1: Integer;
  2519. begin
  2520.   X1 := X - ObjectRect.Left;
  2521.   Y1 := Y - ObjectRect.Top;
  2522.   FDown := True;
  2523.   TempValue := FValue;
  2524.   case Kind of
  2525.     rkRound: StartV := X1 - Y1;
  2526.     rkVertical: StartV := -Y1;
  2527.     rkHorizontal: StartV := X1;
  2528.   end;
  2529.   inherited MouseDown(X, Y, Button);
  2530. end;
  2531. procedure TspSkinFrameRegulatorObject.MouseUp(X, Y: Integer; Button: TMouseButton);
  2532. begin
  2533.   FDown := False;
  2534.   inherited MouseUp(X, Y, Button);
  2535. end;
  2536. procedure TspSkinFrameRegulatorObject.MouseMove(X, Y: Integer);
  2537. var
  2538.   X1, Y1: Integer;
  2539. begin
  2540.   X1 := X - ObjectRect.Left;
  2541.   Y1 := Y - ObjectRect.Top;
  2542.   if FDown
  2543.   then
  2544.     begin
  2545.       case Kind of
  2546.         rkRound: CurV := X1 - Y1;
  2547.         rkVertical: CurV := -Y1;
  2548.         rkHorizontal: CurV := X1;
  2549.       end;
  2550.       CalcValue;
  2551.     end;
  2552.   inherited MouseMove(X, Y);
  2553. end;
  2554. //==============TspSkinAnimateObject==================//
  2555. constructor TspSkinAnimateObject.Create;
  2556. begin
  2557.   inherited Create(AParent, AData);
  2558.   Increment := True;
  2559.   FFrame := 1;
  2560.   FInc := AnimateTimerInterval;
  2561.   TimerInterval := TspDataSkinAnimate(AData).TimerInterval;
  2562.   if TimerInterval < FInc then TimerInterval := FInc;
  2563.   with  TspDataSkinAnimate(AData) do
  2564.   begin
  2565.     Self.CountFrames := CountFrames;
  2566.     Self.Cycle := Cycle;
  2567.     Self.ButtonStyle := ButtonStyle;
  2568.     Self.Command := Command;
  2569.   end;
  2570.   FPopupUp := False;
  2571.   MenuItem := nil;
  2572. end;
  2573. procedure TspSkinAnimateObject.DoMax;
  2574. begin
  2575.   if Parent.SupportNCArea
  2576.   then
  2577.     begin
  2578.      if Parent.WindowState = wsMaximized
  2579.      then Parent.WindowState := wsNormal
  2580.      else Parent.WindowState := wsMaximized;
  2581.     end
  2582.   else
  2583.     if Parent.WindowState <> wsMaximized
  2584.     then Parent.WindowState := wsMaximized
  2585.     else Parent.WindowState := wsNormal;
  2586. end;
  2587. procedure TspSkinAnimateObject.DoMin;
  2588. begin
  2589.   if Parent.SupportNCArea
  2590.   then
  2591.     begin
  2592.       if Parent.WindowState = wsMinimized
  2593.       then Parent.WindowState := wsNormal
  2594.       else Parent.WindowState := wsMinimized;
  2595.     end
  2596.   else
  2597.     Parent.WindowState := wsMinimized;
  2598. end;
  2599. procedure TspSkinAnimateObject.DoClose;
  2600. begin
  2601.   Parent.FForm.Close;
  2602. end;
  2603. procedure TspSkinAnimateObject.DoRollUp;
  2604. begin
  2605.   Parent.RollUpState := not Parent.RollUpState;
  2606. end;
  2607. procedure TspSkinAnimateObject.DoCommand;
  2608. begin
  2609.   case Command of
  2610.     cmClose: DoClose;
  2611.     cmMinimize:
  2612.       begin
  2613.         if not Parent.AlwaysMinimizeToTray
  2614.         then
  2615.           DoMin
  2616.         else
  2617.           Parent.MinimizeToTray;
  2618.       end;
  2619.     cmMaximize: DoMax;
  2620.     cmSysMenu:
  2621.       begin
  2622.         MenuItem := Parent.GetSystemMenu;
  2623.         TrackMenu;
  2624.       end;
  2625.     cmDefault:
  2626.       if MenuItem <> nil then TrackMenu;
  2627.     cmRollUp: DoRollUp;  
  2628.   end;
  2629. end;
  2630. procedure TspSkinAnimateObject.TrackMenu;
  2631. var
  2632.   R: TRect;
  2633.   Menu: TMenu;
  2634.   P: TPoint;
  2635. begin
  2636.   if MenuItem = nil then Exit;
  2637.   if MenuItem.Count = 0 then Exit;
  2638.   R := ObjectRect;
  2639.   if Parent.FForm.FormStyle = fsMDIChild
  2640.   then
  2641.     begin
  2642.       if Parent.FSkinSupport
  2643.       then
  2644.         P := Point(-Parent.NewClRect.Left, -Parent.NewClRect.Top)
  2645.       else
  2646.         P := Point(- 3, -Parent.GetDefCaptionHeight - 3);
  2647.       P := Parent.FForm.ClientToScreen(P);
  2648.       OffsetRect(R, P.X, P.Y);
  2649.     end
  2650.   else
  2651.     OffsetRect(R, Parent.FForm.Left, Parent.FForm.Top);
  2652.   Menu := MenuItem.GetParentMenu;
  2653.   if Menu is TspSkinPopupMenu
  2654.   then
  2655.     TspSkinPopupMenu(Menu).PopupFromRect(R, FPopupUp)
  2656.   else
  2657.     begin
  2658.       Parent.SkinMenuOpen;
  2659.       if Parent.MenusSkinData = nil
  2660.       then
  2661.         Parent.SkinMenu.Popup(nil, Parent.SkinData, 0, R, MenuItem, FPopupUp)
  2662.       else
  2663.         Parent.SkinMenu.Popup(nil, Parent.MenusSkinData, 0, R, MenuItem, FPopupUp);
  2664.     end;
  2665. end;
  2666. procedure TspSkinAnimateObject.DblCLick;
  2667. begin
  2668.   if Command = cmSysMenu then DoClose;
  2669. end;
  2670. procedure TspSkinAnimateObject.MouseUp;
  2671. begin
  2672.   inherited;
  2673.   if FMouseIn and ButtonStyle and (Button = mbLeft)
  2674.   then DoCommand;
  2675. end;
  2676. procedure TspSkinAnimateObject.SetFrame;
  2677. begin
  2678.   if Increment
  2679.   then
  2680.     begin
  2681.       if Value > CountFrames then FFrame := 1 else FFrame := Value;
  2682.     end
  2683.   else
  2684.     begin
  2685.       if Value < 1 then FFrame := CountFrames else FFrame := Value;
  2686.     end;
  2687.   Parent.DrawSkinObject(Self);
  2688. end;
  2689. procedure TspSkinAnimateObject.Start;
  2690. begin
  2691.   FInc := AnimateTimerInterval;
  2692.   FFrame := 1;
  2693.   Active := True;
  2694.   if not Parent.AnimateTimer.Enabled
  2695.   then
  2696.     Parent.AnimateTimer.Enabled := True;
  2697. end;
  2698. procedure TspSkinAnimateObject.Stop;
  2699. begin
  2700.   Frame := 1;
  2701.   Active := False;
  2702.   FInc := AnimateTimerInterval;
  2703. end;
  2704. procedure TspSkinAnimateObject.ChangeFrame;
  2705. begin
  2706.   if FInc >= TimerInterval
  2707.   then
  2708.     begin
  2709.       if Increment
  2710.       then
  2711.         begin
  2712.           Frame := Frame + 1;
  2713.           if not Cycle and (FFrame = CountFrames) then Active := False;
  2714.         end
  2715.       else
  2716.         begin
  2717.           Frame := Frame - 1;
  2718.           if FFrame = 1 then Active := False;
  2719.         end;
  2720.       FInc := AnimateTimerInterval;
  2721.     end
  2722.   else
  2723.     Inc(FInc, AnimateTimerInterval);
  2724. end;
  2725. procedure TspSkinAnimateObject.MouseEnter;
  2726. begin
  2727.   FMouseIn := True;
  2728.   if ButtonStyle
  2729.   then
  2730.     begin
  2731.       Active := True;
  2732.       Increment := True;
  2733.       if not Parent.AnimateTimer.Enabled
  2734.       then
  2735.         Parent.AnimateTimer.Enabled := True;
  2736.     end;
  2737.   Parent.MouseEnterEvent(IDName);
  2738. end;
  2739. procedure TspSkinAnimateObject.MouseLeave;
  2740. begin
  2741.   if not FMouseIn then Exit;
  2742.   FMouseIn := False;
  2743.   if ButtonStyle
  2744.   then
  2745.     begin
  2746.       Active := True;
  2747.       Increment := False;
  2748.       if not Parent.AnimateTimer.Enabled
  2749.       then
  2750.         Parent.AnimateTimer.Enabled := True;
  2751.     end;
  2752.   Parent.MouseLeaveEvent(IDName);
  2753. end;
  2754. procedure TspSkinAnimateObject.Draw;
  2755. var
  2756.   FW, FH: Integer;
  2757. begin
  2758.   FW := RectWidth(SkinRect);
  2759.   FH := RectHeight(SkinRect);
  2760.   Cnvs.CopyRect(ObjectRect, ActivePicture.Canvas,
  2761.            Rect(ActiveSkinRect.Left + (FFrame - 1) * FW, ActiveSkinRect.Top,
  2762.                 ActiveSkinRect.Left + FFrame * FW,
  2763.                 ActiveSkinRect.Top + FH));
  2764. end;
  2765. //==============TspSkinGaugeObject====================//
  2766. constructor TspSkinGaugeObject.Create;
  2767. begin
  2768.   inherited Create(AParent, AData);
  2769.   with TspDataSkinGauge(AData) do
  2770.   begin
  2771.     Self.MinValue := MinValue;
  2772.     Self.MaxValue := MaxValue;
  2773.     Self.Kind := Kind;
  2774.   end;
  2775.   FValue := MinValue;
  2776.   FProgressPos := CalcProgressPos;
  2777.   FOldProgressPos := FProgressPos;
  2778. end;
  2779. function TspSkinGaugeObject.CalcProgressPos;
  2780. var
  2781.   kf: Double;
  2782. begin
  2783.   kf := (FValue - MinValue) / (MaxValue - MinValue);
  2784.   case Kind of
  2785.     gkHorizontal:
  2786.       Result := Point(Round(RectWidth(SkinRect) * kf), 0);
  2787.     gkVertical:
  2788.       Result := Point(0, Round(RectHeight(SkinRect) * (1 - kf)));
  2789.   end;
  2790. end;
  2791. procedure TspSkinGaugeObject.SimplySetValue;
  2792. begin
  2793.   if FValue <> AValue
  2794.   then
  2795.     begin
  2796.       FValue := AValue;
  2797.       if FValue < MinValue then FValue := MinValue;
  2798.       if FValue > MaxValue then FValue := MaxValue;
  2799.       FOldProgressPos := FProgressPos;
  2800.       FProgressPos := CalcProgressPos;
  2801.     end;
  2802. end;
  2803. procedure TspSkinGaugeObject.SetValue;
  2804. begin
  2805.   SimplySetValue(AValue);
  2806.   Parent.DrawSkinObject(Self);
  2807. end;
  2808. procedure TspSkinGaugeObject.Draw;
  2809. var
  2810.   Buffer: TbitMap;
  2811. begin
  2812.   if (FValue = MinValue) and not UpDate
  2813.   then
  2814.     Exit
  2815.   else
  2816.     begin
  2817.       Buffer := TBitMap.Create;
  2818.       Buffer.Width := RectWidth(ObjectRect);
  2819.       Buffer.Height := RectHeight(ObjectRect);
  2820.       case Kind of
  2821.         gkHorizontal:
  2822.           with Buffer do
  2823.           begin
  2824.             Canvas.CopyRect(Rect(FProgressPos.X, 0, Width, Height),
  2825.                             Picture.Canvas,
  2826.                             Rect(SkinRect.Left + FProgressPos.X,
  2827.                                  SkinRect.Top,
  2828.                                  SkinRect.Right, SkinRect.Bottom));
  2829.             Canvas.CopyRect(Rect(0, 0, FProgressPos.X, Height),
  2830.                             ActivePicture.Canvas,
  2831.                             Rect(ActiveSkinRect.Left, ActiveSkinRect.Top,
  2832.                                  ActiveSkinRect.Left + FProgressPos.X,
  2833.                                  ActiveSkinRect.Bottom));
  2834.           end;
  2835.         gkVertical:
  2836.           with Buffer do
  2837.           begin
  2838.             Canvas.CopyRect(Rect(0, 0, Width, FProgressPos.Y),
  2839.                             Picture.Canvas,
  2840.                             Rect(SkinRect.Left, SkinRect.Top,
  2841.                             SkinRect.Right,
  2842.                             SkinRect.Top + FProgressPos.Y));
  2843.             Canvas.CopyRect(Rect(0, FProgressPos.Y, Width, Height),
  2844.                             ActivePicture.Canvas,
  2845.                             Rect(ActiveSkinRect.Left,
  2846.                                  ActiveSkinRect.Top + FProgressPos.Y,
  2847.                                  ActiveSkinRect.Right, ActiveSkinRect.Bottom));
  2848.           end;
  2849.         end;
  2850.       Cnvs.Draw(ObjectRect.Left, ObjectRect.Top, Buffer);
  2851.       Buffer.Free;
  2852.     end;
  2853. end;
  2854. procedure TspSkinGaugeObject.MouseEnter;
  2855. begin
  2856.   FMouseIn := True;
  2857.   Active := True;
  2858.   Parent.MouseEnterEvent(IDName);
  2859. end;
  2860. procedure TspSkinGaugeObject.MouseLeave;
  2861. begin
  2862.   FMouseIn := False;
  2863.   Active := False;
  2864.   Parent.MouseLeaveEvent(IDName);
  2865. end;
  2866. //==============TspSkinBitLabelObject=================//
  2867. constructor TspSkinBitLabelObject.Create;
  2868. begin
  2869.   inherited Create(AParent, AData);
  2870.   with TspDataSkinBitLabel(AData) do
  2871.   begin
  2872.     FTextValue := TextValue;
  2873.     Self.SymbolWidth := SymbolWidth;
  2874.     Self.SymbolHeight := SymbolHeight;
  2875.     Self.Symbols := Symbols;
  2876.   end;
  2877. end;
  2878. procedure TspSkinBitLabelObject.Draw;
  2879. var
  2880.   Buffer: TBitMap;
  2881.   SymbolX, SymbolY: Integer;
  2882. procedure GetSymbolPos(Ch: Char);
  2883. var
  2884.   i, j: Integer;
  2885. begin
  2886.   SymbolX := -1;
  2887.   SymbolY := -1;
  2888.   for i := 0 to Symbols.Count - 1 do
  2889.   begin
  2890.     j := Pos(Ch, Symbols[i]);
  2891.     if j <> 0
  2892.     then
  2893.       begin
  2894.         SymbolX := j - 1;
  2895.         SymbolY := i;
  2896.         Exit;
  2897.       end;
  2898.   end;
  2899. end;
  2900. var
  2901.   i: Integer;
  2902.   XO: Integer;
  2903. begin
  2904.   Buffer := TBitMap.Create;
  2905.   Buffer.Width := RectWidth(SkinRect);
  2906.   Buffer.Height := RectHeight(SkinRect);
  2907.   with Buffer.Canvas do
  2908.   begin
  2909.     CopyRect(Rect(0, 0, Buffer.Width, Buffer.Height),
  2910.              Picture.Canvas, SkinRect);
  2911.     for i := 1 to Length(FTextValue) do
  2912.     begin
  2913.       if (i * SymbolWidth) > Buffer.Width
  2914.       then XO := i * SymbolWidth - Buffer.Width
  2915.       else XO := 0;
  2916.       GetSymbolPos(FTextValue[i]);
  2917.       if SymbolX <> -1
  2918.       then
  2919.         begin
  2920.           Buffer.Canvas.CopyRect(
  2921.             Rect((i - 1) * SymbolWidth, 0, i * SymbolWidth - XO, SymbolHeight),
  2922.             ActivePicture.Canvas,
  2923.             Rect(ActiveSkinRect.Left + SymbolX * SymbolWidth,
  2924.                  ActiveSkinRect.Top + SymbolY * SymbolHeight,
  2925.                  ActiveSkinRect.Left + (SymbolX + 1) * SymbolWidth - XO,
  2926.                  ActiveSkinRect.Top + (SymbolY + 1) * SymbolHeight));
  2927.           if XO > 0 then Break;       
  2928.         end;       
  2929.     end;
  2930.   end;
  2931.   Cnvs.Draw(ObjectRect.Left, ObjectRect.Top, Buffer);
  2932.   Buffer.Free;
  2933. end;
  2934. procedure TspSkinBitLabelObject.SetTextValue;
  2935. begin
  2936.   FTextValue := AValue;
  2937.   if AUpDate then Parent.DrawSkinObject(Self);
  2938. end;
  2939. //==============TspSkinLabelObject ===================//
  2940. constructor TspSkinLabelObject.Create;
  2941. begin
  2942.   inherited Create(AParent, AData);
  2943.   with TspDataSkinLabel(AData) do
  2944.   begin
  2945.     Self.FTextValue := TextValue;
  2946.     Self.FontName := FontName;
  2947.     Self.FontStyle := FontStyle;
  2948.     Self.FontHeight := FontHeight;
  2949.     Self.FontColor := FontColor;
  2950.     Self.ActiveFontColor := ActiveFontColor;
  2951.     Self.Alignment := Alignment;
  2952.   end;
  2953. end;
  2954. procedure TspSkinLabelObject.SetTextValue;
  2955. begin
  2956.   FTextValue := AValue;
  2957.   if AUpDate then Parent.DrawSkinObject(Self);
  2958. end;
  2959. procedure TspSkinLabelObject.MouseEnter;
  2960. begin
  2961.   FMouseIn := True;
  2962.   Active := True;
  2963.   if (not IsNullRect(ActiveSkinRect)) or (ActiveFontColor <> FontColor)
  2964.   then
  2965.     ReDraw;
  2966.   Parent.MouseEnterEvent(IDName);
  2967. end;
  2968. procedure TspSkinLabelObject.MouseLeave;
  2969. begin
  2970.   FMouseIn := False;
  2971.   Active := False;
  2972.   if not IsNullRect(ActiveSkinRect) or (ActiveFontColor <> FontColor)
  2973.   then
  2974.     ReDraw;
  2975.   Parent.MouseLeaveEvent(IDName);
  2976. end;
  2977. procedure TspSkinLabelObject.Draw;
  2978. var
  2979.   PBuffer, APBuffer: TspEffectBmp;
  2980.   Buffer, ABuffer: TBitMap;
  2981.   ASR, SR: TRect;
  2982. procedure DrawLabelText(R: TRect; Cnvs: TCanvas; AActive: Boolean);
  2983. var
  2984.   X, Y: Integer;
  2985. begin
  2986.   X := R.Left;
  2987.   case Alignment of
  2988.     taRightJustify: X := R.Right - Cnvs.TextWidth(FTextValue);
  2989.     taCenter: X := R.Left + (R.Right - R.Left) div 2 - Cnvs.TextWidth(FTextValue) div 2;
  2990.   end;
  2991.   with Cnvs do
  2992.   begin
  2993.     Y := R.Top + (R.Bottom - R.Top) div 2 - TextHeight(FTextValue) div 2;
  2994.     Brush.Style := bsClear;
  2995.     Font.Name := FontName;
  2996.     Font.Style := FontStyle;
  2997.     Font.Height := FontHeight;
  2998.     if AActive
  2999.     then
  3000.       Font.Color := ActiveFontColor
  3001.     else
  3002.       Font.Color := FontColor;
  3003.     TextRect(R, X, Y, FTextValue);
  3004.   end;
  3005. end;
  3006. procedure CreateLabelImage(B: TBitMap; AActive: Boolean; ATextActive: Boolean);
  3007. begin
  3008.   B.Width := RectWidth(ObjectRect);
  3009.   B.Height := RectHeight(ObjectRect);
  3010.   with B.Canvas do
  3011.   begin
  3012.     if AActive
  3013.     then
  3014.       CopyRect(Rect(0, 0, B.Width, B.Height), ActivePicture.Canvas, ActiveSkinRect)
  3015.     else
  3016.       CopyRect(Rect(0, 0, B.Width, B.Height), Picture.Canvas, SkinRect);
  3017.   end;
  3018.   DrawLabelText(Rect(0, 0, B.Width, B.Height), B.Canvas, ATextActive);
  3019. end;
  3020. begin
  3021.   ASR := ActiveSkinRect;
  3022.   SR := SkinRect;
  3023.   if not Morphing or
  3024.      ((Active and (MorphKf = 1)) or (not Active and (MorphKf  = 0)))
  3025.   then
  3026.     begin
  3027.       if Active// and not IsNullRect(ASR)
  3028.       then
  3029.         begin
  3030.           if not IsNullRect(ASR)
  3031.           then
  3032.             begin
  3033.               Buffer := TBitMap.Create;
  3034.               CreateLabelImage(Buffer, True, True);
  3035.               Cnvs.Draw(ObjectRect.Left, ObjectRect.Top, Buffer);
  3036.               Buffer.Free;
  3037.             end
  3038.           else
  3039.             if (ActiveFontColor <> FontColor)
  3040.             then
  3041.               begin
  3042.                 Buffer := TBitMap.Create;
  3043.                 CreateLabelImage(Buffer, False, True);
  3044.                 Cnvs.Draw(ObjectRect.Left, ObjectRect.Top, Buffer);
  3045.                 Buffer.Free;
  3046.               end
  3047.          end
  3048.       else
  3049.         begin
  3050.           Buffer := TBitMap.Create;
  3051.           CreateLabelImage(Buffer, False, False);
  3052.           Cnvs.Draw(ObjectRect.Left, ObjectRect.Top, Buffer);
  3053.           Buffer.Free;
  3054.         end;
  3055.     end
  3056.   else
  3057.     begin
  3058.       Buffer := TBitMap.Create;
  3059.       ABuffer := TBitMap.Create;
  3060.       CreateLabelImage(Buffer, False, False);
  3061.       if isNullRect(ActiveSkinRect)
  3062.       then
  3063.         CreateLabelImage(ABuffer, False, True)
  3064.       else
  3065.         CreateLabelImage(ABuffer, True, True);
  3066.       PBuffer := TspEffectBmp.CreateFromhWnd(Buffer.Handle);
  3067.       APBuffer := TspEffectBmp.CreateFromhWnd(ABuffer.Handle);
  3068.       case MorphKind of
  3069.         mkDefault: PBuffer.Morph(APBuffer, MorphKf);
  3070.         mkGradient: PBuffer.MorphGrad(APBuffer, MorphKf);
  3071.         mkLeftGradient: PBuffer.MorphLeftGrad(APBuffer, MorphKf);
  3072.         mkRightGradient: PBuffer.MorphRightGrad(APBuffer, MorphKf);
  3073.         mkLeftSlide: PBuffer.MorphLeftSlide(APBuffer, MorphKf);
  3074.         mkRightSlide: PBuffer.MorphRightSlide(APBuffer, MorphKf);
  3075.         mkPush: PBuffer.MorphPush(APBuffer, MorphKf);
  3076.       end;
  3077.       PBuffer.Draw(Cnvs.Handle, ObjectRect.Left, ObjectRect.Top);
  3078.       PBuffer.Free;
  3079.       APBuffer.Free;
  3080.       Buffer.Free;
  3081.       ABuffer.Free;
  3082.     end;
  3083. end;
  3084. //============= TspSkinCaptionObject ==================//
  3085. constructor TspSkinCaptionObject.Create;
  3086. begin
  3087.   inherited Create(AParent, AData);
  3088.   FTextValue := '';
  3089.   with TspDataSkinCaption(AData) do
  3090.   begin
  3091.     Self.FontName := FontName;
  3092.     Self.FontStyle := FontStyle;
  3093.     Self.FontHeight := FontHeight;
  3094.     Self.FontColor := FontColor;
  3095.     Self.ActiveFontColor := ActiveFontColor;
  3096.     Self.Alignment := Alignment;
  3097.     Self.TextRct := TextRct;
  3098.     Self.DefaultCaption := DefaultCaption;
  3099.     Self.Shadow := Shadow;
  3100.     Self.ShadowColor := ShadowColor;
  3101.     Self.ActiveShadowColor := ActiveShadowColor;
  3102.     Self.FrameRect := FrameRect;
  3103.     Self.ActiveFrameRect := ActiveFrameRect;
  3104.     Self.FrameLeftOffset := FrameLeftOffset; 
  3105.     Self.FrameRightOffset := FrameRightOffset;
  3106.     Self.FrameTextRect := FrameTextRect; 
  3107.   end;
  3108. end;
  3109. procedure TspSkinCaptionObject.MouseDown;
  3110. begin
  3111.   with Parent do
  3112.   begin
  3113.     if not SupportNCArea and
  3114.     (WindowState <> wsMaximized) then StartDragg(X, Y);
  3115.     MouseDownEvent(IDName, X, Y, ObjectRect, Button);
  3116.   end;
  3117. end;
  3118. procedure TspSkinCaptionObject.MouseUp;
  3119. begin
  3120.   with Parent do
  3121.   begin
  3122.     if not SupportNCArea then EndDragg;
  3123.     MouseUpEvent(IDName, X, Y, ObjectRect, Button);
  3124.   end;
  3125. end;
  3126. procedure TspSkinCaptionObject.SetTextValue(Value: String);
  3127. begin
  3128.   FTextValue := Value;
  3129.   Parent.DrawSkinObject(Self);
  3130. end;
  3131. procedure TspSkinCaptionObject.SimpleSetTextValue(Value: String);
  3132. begin
  3133.   FTextValue := Value;
  3134. end;
  3135. procedure TspSkinCaptionObject.MouseEnter;
  3136. begin
  3137.   FMouseIn := True;
  3138.   Parent.MouseEnterEvent(IDName);
  3139. end;
  3140. procedure TspSkinCaptionObject.MouseLeave;
  3141. begin
  3142.   FMouseIn := False;
  3143.   Parent.MouseLeaveEvent(IDName);
  3144. end;
  3145. procedure TspSkinCaptionObject.Draw;
  3146. var
  3147.   Image, ActiveImage: TBitMap;
  3148.   tx, ty: Integer;
  3149.   EB1, EB2: TspEffectBmp;
  3150.   RealTextRect: TRect;
  3151.   SR, ASR: TRect;
  3152.   CaptionKind: Integer;
  3153. function GetCaptionKind: Integer;
  3154. begin
  3155.   if (RectWidth(SR) = RectWidth(ObjectRect)) and
  3156.      (RectHeight(SR) = RectHeight(ObjectRect))
  3157.   then Result := 0 else
  3158.   if (SR.Top <= SD.LTPoint.Y) and (SR.Bottom < SD.RTPoint.Y)
  3159.   then Result := 1 else
  3160.   if  (SR.Top >= SD.LBPoint.Y) and (SR.Bottom > SD.RBPoint.Y)
  3161.   then Result := 2 else
  3162.   if (SR.Top <= SD.LTPoint.Y) and (SR.Bottom > SD.LBPoint.Y)
  3163.   then Result := 3 else Result := 4;
  3164. end;
  3165. procedure CnvSetFont(Cnv: TCanvas; FColor: TColor);
  3166. begin
  3167.   with Cnv do
  3168.   begin
  3169.     Font.Name := FontName;
  3170.     Font.Style := FontStyle;
  3171.     Font.Height := FontHeight;
  3172.     Font.Color := FColor;
  3173.     Font.CharSet := Parent.DefCaptionFont.Charset;
  3174.   end;
  3175. end;
  3176. function CorrectText(Cnv: TCanvas; var S1: String): String;
  3177. var
  3178.   w: Integer;
  3179.   S: String;
  3180. begin
  3181.   S := S1;
  3182.   w := RectWidth(RealTextRect);
  3183.   Parent.CorrectCaptionText(Cnv, S, w);
  3184.   Result := S;
  3185. end;
  3186. procedure CreateCaptionHBitMap(DestB: TBitMap; SourceRect: TRect; SourceB: TBitMap);
  3187. var
  3188.   X, XCnt: Integer;
  3189.   w: Integer;
  3190.   R: TRect;
  3191.   XO, LO, RO: Integer;
  3192. begin
  3193.   LO := 0;
  3194.   RO := 0;
  3195.   case CaptionKind of
  3196.     1: begin
  3197.          LO := SD.LTPoint.X - SR.Left;
  3198.          RO := SR.Right - SD.RTPoint.X;
  3199.        end;
  3200.     2: begin
  3201.          LO := SD.LBPoint.X - SR.Left;
  3202.          RO := SR.Right - SD.RBPoint.X;
  3203.        end;
  3204.   end;
  3205.   DestB.Width := RectWidth(ObjectRect);
  3206.   DestB.Height := RectHeight(ObjectRect);
  3207.   R := Rect(SourceRect.Left + LO, SourceRect.Top,
  3208.             SourceRect.Right - RO, SourceRect.Bottom);
  3209.   if (LO = 0) and (RO = 0)
  3210.   then
  3211.     DestB.Canvas.CopyRect(Rect(0, 0, DestB.Width, DestB.Height),
  3212.                           SourceB.Canvas, R)
  3213.   else
  3214.     begin
  3215.       w := RectWidth(R);
  3216.       XCnt := DestB.Width div w;
  3217.       for X := 0 to XCnt do
  3218.       begin
  3219.         if X * w + w > DestB.Width
  3220.         then XO := X * w + w - DestB.Width else XO := 0;
  3221.         Dec(R.Right, XO);
  3222.         DestB.Canvas.CopyRect(Rect(X * w, 0, X * w + w - XO, DestB.Height),
  3223.                               SourceB.Canvas, R);
  3224.       end;
  3225.    end;
  3226.   with DestB.Canvas do
  3227.   begin
  3228.     if LO <> 0
  3229.     then
  3230.       CopyRect(Rect(0, 0, LO, DestB.Height),
  3231.                SourceB.Canvas, Rect(SourceRect.Left, SourceRect.Top,
  3232.                                     SourceRect.Left + LO, SourceRect.Bottom));
  3233.     if RO <> 0
  3234.     then
  3235.       CopyRect(Rect(DestB.Width - RO, 0, DestB.Width, DestB.Height),
  3236.                SourceB.Canvas, Rect(SourceRect.Right - RO, SourceRect.Top,
  3237.                                     SourceRect.Right, SourceRect.Bottom));
  3238.   end;
  3239. end;
  3240. procedure CreateCaptionVBitMap(DestB: TBitMap; SourceRect: TRect; SourceB: TBitMap);
  3241. var
  3242.   Y, YCnt: Integer;
  3243.   h: Integer;
  3244.   R: TRect;
  3245.   YO, TpO, BtO: Integer;
  3246. begin
  3247.   TpO := 0;
  3248.   BtO := 0;
  3249.   case CaptionKind of
  3250.     3: begin
  3251.          TpO := SD.LTPoint.Y - SR.Top;
  3252.          BtO := SR.Bottom - SD.LBPoint.Y;
  3253.        end;
  3254.     4: begin
  3255.          TpO := SD.RTPoint.Y - SR.Top;
  3256.          BtO := SR.Bottom - SD.RBPoint.Y;
  3257.        end;
  3258.   end;
  3259.   DestB.Width := RectWidth(ObjectRect);
  3260.   DestB.Height := RectHeight(ObjectRect);
  3261.   R := Rect(SourceRect.Left, SourceRect.Top + TpO,
  3262.             SourceRect.Right, SourceRect.Bottom - BtO);
  3263.   h := RectHeight(R);
  3264.   YCnt := DestB.Height div h;
  3265.   for Y := 0 to YCnt do
  3266.   begin
  3267.     if Y * h + h > DestB.Height
  3268.     then YO := Y * h + h - DestB.Height else YO := 0;
  3269.     Dec(R.Bottom, YO); 
  3270.     DestB.Canvas.CopyRect(Rect(0, Y * h, DestB.Width, Y * h + h - YO),
  3271.                           SourceB.Canvas, R);
  3272.   end;
  3273.   with DestB.Canvas do
  3274.   begin
  3275.     if TpO <> 0
  3276.     then
  3277.       CopyRect(Rect(0, 0, DestB.Width, TpO),
  3278.                SourceB.Canvas, Rect(SourceRect.Left, SourceRect.Top,
  3279.                                     SourceRect.Right, SourceRect.Top + TpO));
  3280.     if BtO <> 0
  3281.     then
  3282.       CopyRect(Rect(0, DestB.Height - BtO, DestB.Width, DestB.Height),
  3283.                SourceB.Canvas, Rect(SourceRect.Left, SourceRect.Bottom - BtO,
  3284.                                     SourceRect.Right, SourceRect.Bottom));
  3285.   end;
  3286. end;
  3287. procedure CalcTextCoord(tw, th: Integer);
  3288. var
  3289.   w, h: Integer;
  3290. begin
  3291.   w := RectWidth(RealTextRect);
  3292.   h := RectHeight(RealTextRect);
  3293.   ty := h div 2 - th div 2 + RealTextRect.Top;
  3294.   case Alignment of
  3295.     taLeftJustify: tx := RealTextRect.Left;
  3296.     taRightJustify: tx := RealTextRect.Right - tw;
  3297.     taCenter: tx := w div 2 - tw div 2 + RealTextRect.Left;
  3298.   end;
  3299. end;
  3300. procedure DrawCaptionText(Cnv: TCanvas; OX, OY: Integer; AActive: Boolean);
  3301. var
  3302.   S1: String;
  3303.   C: TColor;
  3304.   F: TForm;
  3305.   B: TBitMap;
  3306.   FR: TRect;
  3307. begin
  3308.   S1 := Parent.FForm.Caption;
  3309.   if (Parent.FForm.FormStyle = fsMDIForm) and Parent.IsMDIChildMaximized
  3310.   then
  3311.     begin
  3312.       F := Parent.GetMaximizeMDIChild;
  3313.       if F <> nil then S1 := S1 + ' - [' + F.Caption + ']';
  3314.     end;
  3315.   if (S1 = '') or IsNullRect(TextRct) then Exit;
  3316.   S1 := CorrectText(Cnv, S1);
  3317.   with Cnv do
  3318.   begin
  3319.     CalcTextCoord(TextWidth(S1), TextHeight(S1));
  3320.     tx := tx + OX;
  3321.     ty := ty + OY;
  3322.     Brush.Style := bsClear;
  3323.     if not IsNullRect(Self.FrameRect)
  3324.     then
  3325.       begin
  3326.         B := TBitMap.Create;
  3327.         if (AActive) and not IsNullRect(ActiveFrameRect)
  3328.         then FR := ActiveFrameRect
  3329.         else FR := Self.FrameRect;
  3330.         CreateHSkinImage(FrameLeftOffset, FrameRightOffset, B, ActivePicture, FR,
  3331.         TextWidth(S1) + RectWidth(Self.FrameRect) - RectWidth(FrameTextRect),
  3332.         RectHeight(Self.FrameRect));
  3333.         Draw(TX - FrameTextRect.Left, TY - FrameTextRect.Top, B);
  3334.         B.Free;
  3335.       end;
  3336.     if Shadow
  3337.     then
  3338.       begin
  3339.         Font.Charset := Parent.FDefCaptionFont.Charset;
  3340.         C := Font.Color;
  3341.         if AActive
  3342.         then Font.Color := ActiveShadowColor
  3343.         else Font.Color := ShadowColor;
  3344.         TextOut(tx + 1, ty + 1, S1);
  3345.         Font.Color := C;
  3346.       end;
  3347.     TextOut(tx, ty, S1);
  3348.   end;
  3349. end;
  3350. var
  3351.   TextO: Integer;
  3352. begin
  3353.   SR := SkinRect;
  3354.   ASR := ActiveSkinRect;
  3355.   CaptionKind := GetCaptionKind;
  3356.   RealTextRect := TextRct;
  3357.   Active := Parent.GetFormActive;
  3358.   if not IsNullRect(TextRct)
  3359.   then
  3360.     begin
  3361.       TextO := RectWidth(SkinRect) - TextRct.Right;
  3362.       RealTextRect.Right := RectWidth(ObjectRect) - TextO;
  3363.     end;
  3364.   if not IsNullRect(FrameRect)
  3365.   then
  3366.     begin
  3367.       Inc(RealTextRect.Top, FrameTextRect.Top);
  3368.       Inc(RealTextRect.Left, FrameTextRect.Left);
  3369.       Dec(RealTextRect.Right, RectWidth(FrameRect) - FrameTextRect.Right);
  3370.     end;
  3371.   if Parent.SupportNCArea and IsNullRect(ASR)
  3372.   then
  3373.     begin
  3374.       if Active
  3375.       then CnvSetFont(Cnvs, ActiveFontColor)
  3376.       else CnvSetFont(Cnvs, FontColor);
  3377.       DrawCaptionText(Cnvs, ObjectRect.Left, ObjectRect.Top, Active);
  3378.     end
  3379.   else
  3380.   if IsNullRect(ASR) or (not Active and (MorphKf = 0))
  3381.   then
  3382.     begin
  3383.       if not UpDate
  3384.       then
  3385.         begin
  3386.           if Active
  3387.           then CnvSetFont(Cnvs, ActiveFontColor)
  3388.           else CnvSetFont(Cnvs, FontColor);
  3389.           DrawCaptionText(Cnvs, ObjectRect.Left, ObjectRect.Top, Active);
  3390.         end
  3391.        else
  3392.          begin
  3393.            Image := TBitMap.Create;
  3394.            if not Parent.CanScale
  3395.            then
  3396.              begin
  3397.                Image.Width := RectWidth(ObjectRect);
  3398.                Image.Height := RectHeight(ObjectRect);
  3399.                Image.Canvas.CopyRect(Rect(0, 0, Image.Width, Image.Height),
  3400.                                      Picture.Canvas, SkinRect);
  3401.              end
  3402.            else
  3403.              if CaptionKind < 3
  3404.              then
  3405.                CreateCaptionHBitMap(Image, SR, Picture)
  3406.              else
  3407.                CreateCaptionVBitMap(Image, SR, Picture);
  3408.            if Active
  3409.            then CnvSetFont(Image.Canvas, ActiveFontColor)
  3410.            else CnvSetFont(Image.Canvas, FontColor);
  3411.            DrawCaptionText(Image.Canvas, 0, 0, Active);
  3412.            if Parent.GetAutoRenderingInActiveImage and not Active
  3413.            then
  3414.              begin
  3415.                EB1 := TspEffectBmp.CreateFromhWnd(Image.Handle);
  3416.                case Parent.FSD.InActiveEffect of
  3417.                  ieBrightness:
  3418.                    EB1.ChangeBrightness(InActiveBrightnessKf);
  3419.                  ieDarkness:
  3420.                    EB1.ChangeDarkness(InActiveDarknessKf);
  3421.                  ieGrayScale:
  3422.                    EB1.GrayScale;
  3423.                  ieNoise:
  3424.                    EB1.AddMonoNoise(InActiveNoiseAmount);
  3425.                  ieSplitBlur:
  3426.                    EB1.SplitBlur(1);
  3427.                  ieInvert:
  3428.                    EB1.Invert;
  3429.                 end;
  3430.                 EB1.Draw(Cnvs.Handle, ObjectRect.Left, ObjectRect.Top);
  3431.                 EB1.Free;
  3432.               end
  3433.             else
  3434.               Cnvs.Draw(ObjectRect.Left, ObjectRect.Top, Image);
  3435.            Image.Free;
  3436.          end;
  3437.     end
  3438.   else
  3439.     begin
  3440.       ActiveImage := TBitMap.Create;
  3441.       if not Parent.CanScale
  3442.       then
  3443.         begin
  3444.           ActiveImage.Width := RectWidth(ObjectRect);
  3445.           ActiveImage.Height := RectHeight(ObjectRect);
  3446.           ActiveImage.Canvas.CopyRect(Rect(0, 0, ActiveImage.Width, ActiveImage.Height),
  3447.                                       ActivePicture.Canvas, ActiveSkinRect);
  3448.         end
  3449.       else
  3450.         if CaptionKind < 3
  3451.         then
  3452.           CreateCaptionHBitMap(ActiveImage, ASR, ActivePicture)
  3453.         else
  3454.           CreateCaptionVBitMap(ActiveImage, ASR, ActivePicture);
  3455.       CnvSetFont(ActiveImage.Canvas, ActiveFontColor);
  3456.       DrawCaptionText(ActiveImage.Canvas, 0, 0, True);
  3457.       if ((MorphKf = 0) and Active and not Morphing) or
  3458.          (Active and (MorphKf = 1))
  3459.       then
  3460.         Cnvs.Draw(ObjectRect.Left, ObjectRect.Top, ActiveImage)
  3461.       else
  3462.         begin
  3463.           Image := TBitMap.Create;
  3464.           if not Parent.CanScale
  3465.            then
  3466.              begin
  3467.                Image.Width := RectWidth(ObjectRect);
  3468.                Image.Height := RectHeight(ObjectRect);
  3469.                Image.Canvas.CopyRect(Rect(0, 0, Image.Width, Image.Height),
  3470.                                      Picture.Canvas, SkinRect);
  3471.              end
  3472.            else
  3473.             if CaptionKind < 3
  3474.             then
  3475.               CreateCaptionHBitMap(Image, SR, Picture)
  3476.             else
  3477.               CreateCaptionVBitMap(Image, SR, Picture);
  3478.           CnvSetFont(Image.Canvas, FontColor);
  3479.           DrawCaptionText(Image.Canvas, 0, 0, False);
  3480.           // Morphing
  3481.           EB1 := TspEffectBmp.CreateFromhWnd(Image.Handle);
  3482.           EB2 := TspEffectBmp.CreateFromhWnd(ActiveImage.Handle);
  3483.           case MorphKind of
  3484.             mkDefault: EB1.Morph(EB2, MorphKf);
  3485.             mkGradient: EB1.MorphGrad(EB2, MorphKf);
  3486.             mkLeftGradient: EB1.MorphLeftGrad(EB2, MorphKf);
  3487.             mkRightGradient: EB1.MorphRightGrad(EB2, MorphKf);
  3488.             mkLeftSlide: EB1.MorphLeftSlide(EB2, MorphKf);
  3489.             mkRightSlide: EB1.MorphRightSlide(EB2, MorphKf);
  3490.             mkPush: EB1.MorphPush(EB2, MorphKf)
  3491.           end;
  3492.           if Parent.GetAutoRenderingInActiveImage and not Active
  3493.           then
  3494.             case Parent.FSD.InActiveEffect of
  3495.               ieBrightness:
  3496.                 EB1.ChangeBrightness(InActiveBrightnessKf);
  3497.               ieDarkness:
  3498.                 EB1.ChangeDarkness(InActiveDarknessKf);
  3499.               ieGrayScale:
  3500.                 EB1.GrayScale;
  3501.               ieNoise:
  3502.                 EB1.AddMonoNoise(InActiveNoiseAmount);
  3503.               ieSplitBlur:
  3504.                 EB1.SplitBlur(1);
  3505.               ieInvert:
  3506.                 EB1.Invert;
  3507.             end;
  3508.           EB1.Draw(Cnvs.Handle, ObjectRect.Left, ObjectRect.Top);
  3509.           EB1.Free;
  3510.           EB2.Free;
  3511.           //
  3512.           Image.Free;
  3513.         end;
  3514.       ActiveImage.Free;
  3515.     end;
  3516. end;
  3517. //============= TspSkinMainMenu =============//
  3518. constructor TspSkinMainMenu.Create;
  3519. begin
  3520.   inherited Create(AOwner);
  3521.   DSF := nil;
  3522.   FSD := nil;
  3523. end;
  3524. procedure TspSkinMainMenu.Notification;
  3525. begin
  3526.   inherited Notification(AComponent, Operation);
  3527.   if (Operation = opRemove) and (AComponent = FSD) then FSD := nil;
  3528. end;
  3529. // ============= TspSkinMainMenuBar ================//
  3530. constructor TspMenuBarObject.Create;
  3531. begin
  3532.   Parent := AParent;
  3533.   Enabled := True;
  3534.   Visible := True;
  3535.   FMorphKf := 0;
  3536.   FDown := False;
  3537.   Morphing := False;
  3538.   Picture := nil;
  3539.   if AData <> nil then 
  3540.   with AData do
  3541.   begin
  3542.     Self.IDName := IDName;
  3543.     Self.SkinRect := SkinRect;
  3544.     Self.ActiveSkinRect := ActiveSkinRect;
  3545.     Self.DownRect := ActiveSkinRect;
  3546.     Self.Morphing := Morphing;
  3547.     Self.MorphKind := MorphKind;
  3548.     ObjectRect := SkinRect;
  3549.     if (ActivePictureIndex <> - 1) and
  3550.        (ActivePictureIndex < Parent.SkinData.FActivePictures.Count)
  3551.     then
  3552.       Picture := TBitMap(Parent.SkinData.FActivePictures.Items[ActivePictureIndex]);
  3553.   end;
  3554. end;
  3555. procedure TspMenuBarObject.ReDraw;
  3556. begin
  3557.   if Morphing
  3558.   then Parent.MorphTimer.Enabled := True
  3559.   else Parent.DrawSkinObject(Self);
  3560. end;
  3561. procedure TspMenuBarObject.DblClick;
  3562. begin
  3563. end;
  3564. procedure TspMenuBarObject.MouseDown(X, Y: Integer; Button: TMouseButton);
  3565. begin
  3566. end;
  3567. procedure TspMenuBarObject.MouseUp(X, Y: Integer; Button: TMouseButton);
  3568. begin
  3569. end;
  3570. procedure TspMenuBarObject.MouseEnter;
  3571. begin
  3572.   FMouseIn := True;
  3573.   Active := True;
  3574.   ReDraw;
  3575. end;
  3576. procedure TspMenuBarObject.MouseLeave;
  3577. begin
  3578.   FMouseIn := False;
  3579.   Active := False;
  3580.   ReDraw;
  3581. end;
  3582. function TspMenuBarObject.CanMorphing;
  3583. begin
  3584.   Result := not (FDown and not IsNullRect(DownRect)) and
  3585.                 ((Active and (MorphKf < 1)) or
  3586.                 (not Active and (MorphKf > 0)));
  3587. end;
  3588. procedure TspMenuBarObject.DoMorphing;
  3589. begin
  3590.   if Active
  3591.   then MorphKf := MorphKf + MorphInc
  3592.   else MorphKf := MorphKf - MorphInc;
  3593.   Draw(Parent.Canvas);
  3594. end;
  3595. procedure TspMenuBarObject.Draw;
  3596. begin
  3597. end;
  3598. procedure TspMenuBarObject.SetMorphKf(Value: Double);
  3599. begin
  3600.   FMorphKf := Value;
  3601.   if FMorphKf < 0 then FMorphKf := 0 else
  3602.   if FMorphKf > 1 then FMorphKf := 1;
  3603. end;
  3604. // ============== TspSkinMainMenuBarButton ================ //
  3605. constructor TspSkinMainMenuBarButton.Create;
  3606. begin                   
  3607.   inherited Create(AParent, AData);
  3608.   if AData <> nil
  3609.   then
  3610.     with TspDataSkinMainMenuBarButton(AData) do
  3611.     begin
  3612.       Self.Command := Command;
  3613.       Self.DownRect := DownRect;
  3614.       FSkinSupport := True;
  3615.     end
  3616.   else
  3617.     FSkinSupport := False;
  3618. end;
  3619. procedure TspSkinMainMenuBarButton.DefaultDraw(Cnvs: TCanvas);
  3620. var
  3621.   Buffer: TBitMap;
  3622.   R: TRect;
  3623.   IX, IY: Integer;
  3624.   IC: TColor;
  3625. begin
  3626.   Buffer := TBitMap.Create;
  3627.   Buffer.Width := RectWidth(ObjectRect);
  3628.   Buffer.Height := RectHeight(ObjectRect);
  3629.   R := Rect(0, 0, Buffer.Width, Buffer.Height);
  3630.   with Buffer.Canvas do
  3631.   begin
  3632.     if FDown and FMouseIn
  3633.     then
  3634.       begin
  3635.         Frame3D(Buffer.Canvas, R, SP_XP_BTNFRAMECOLOR, SP_XP_BTNFRAMECOLOR, 1);
  3636.         Brush.Color := SP_XP_BTNDOWNCOLOR;
  3637.         FillRect(R);
  3638.       end
  3639.     else
  3640.       if FMouseIn
  3641.       then
  3642.         begin
  3643.           Frame3D(Buffer.Canvas, R, SP_XP_BTNFRAMECOLOR, SP_XP_BTNFRAMECOLOR, 1);
  3644.           Brush.Color := SP_XP_BTNACTIVECOLOR;
  3645.           FillRect(R);
  3646.         end
  3647.       else
  3648.         begin
  3649.           Brush.Color := clBtnFace;
  3650.           FillRect(R);
  3651.         end;
  3652.   end;
  3653.   IX := Buffer.Width div 2 - 5;
  3654.   IY := Buffer.Height div 2 - 4;
  3655.   if FDown and FMouseIn
  3656.   then
  3657.     begin
  3658.       Inc(IX);
  3659.       Inc(IY);
  3660.     end;
  3661.   if Enabled then IC := clBtnText else IC := clBtnShadow;
  3662.   case Command of
  3663.     cmClose: DrawCloseImage(Buffer.Canvas, IX, IY, IC);
  3664.     cmMaximize: DrawRestoreImage(Buffer.Canvas, IX, IY, IC);
  3665.     cmMinimize: DrawMinimizeImage(Buffer.Canvas, IX, IY, IC);
  3666.     cmSysMenu: DrawSysMenuImage(Buffer.Canvas, IX, IY, IC);
  3667.   end;
  3668.   Cnvs.Draw(ObjectRect.Left, ObjectRect.Top, Buffer);
  3669.   Buffer.Free;
  3670. end;
  3671. procedure TspSkinMainMenuBarButton.MouseEnter;
  3672. begin
  3673.   if (Command = cmSysMenu) and FDown
  3674.   then
  3675.     begin
  3676.       FMouseIn := True;
  3677.       Active := True;
  3678.       if Morphing and FDown then MorphKf := 0;
  3679.     end
  3680.   else
  3681.     inherited;
  3682. end;
  3683. procedure TspSkinMainMenuBarButton.MouseLeave;
  3684. begin
  3685.   if (Command = cmSysMenu) and FDown
  3686.   then
  3687.     begin
  3688.       Active := False;
  3689.       FMouseIn := False;
  3690.     end
  3691.   else
  3692.     inherited;
  3693. end;
  3694. procedure TspSkinMainMenuBarButton.Draw;
  3695. procedure CreateObjectImage(B: TBitMap; AActive: Boolean);
  3696. begin
  3697.   B.Width := RectWidth(ObjectRect);
  3698.   B.Height := RectHeight(ObjectRect);
  3699.   with B.Canvas do
  3700.   begin
  3701.     if AActive
  3702.     then
  3703.       CopyRect(Rect(0, 0, B.Width, B.Height), Picture.Canvas, ActiveSkinRect)
  3704.     else
  3705.       CopyRect(Rect(0, 0, B.Width, B.Height), Picture.Canvas, SkinRect);
  3706.   end;
  3707. end;
  3708. var
  3709.   PBuffer, APBuffer: TspEffectBmp;
  3710.   Buffer, ABuffer: TBitMap;
  3711.   ASR, SR: TRect;
  3712. begin
  3713.   if not FSkinSupport or (Picture = nil)
  3714.   then
  3715.     begin
  3716.       DefaultDraw(Cnvs);
  3717.       Exit;
  3718.     end;  
  3719.   if (FDown and not IsNullRect(DownRect)) and FMouseIn
  3720.   then
  3721.     Cnvs.CopyRect(ObjectRect, Picture.Canvas, DownRect)
  3722.   else
  3723.     begin
  3724.       ASR := ActiveSkinRect;
  3725.       SR := SkinRect;
  3726.       if not Morphing or
  3727.         ((Active and (MorphKf = 1)) or (not Active and (MorphKf  = 0)))
  3728.       then
  3729.         begin
  3730.           if Active and not IsNullRect(ASR)
  3731.           then
  3732.             Cnvs.CopyRect(ObjectRect, Picture.Canvas, ASR)
  3733.           else
  3734.             Cnvs.CopyRect(ObjectRect, Picture.Canvas, SR);
  3735.         end
  3736.       else
  3737.         begin
  3738.           Buffer := TBitMap.Create;
  3739.           ABuffer := TBitMap.Create;
  3740.           CreateObjectImage(Buffer, False);
  3741.           CreateObjectImage(ABuffer, True);
  3742.           PBuffer := TspEffectBmp.CreateFromhWnd(Buffer.Handle);
  3743.           APBuffer := TspEffectBmp.CreateFromhWnd(ABuffer.Handle);
  3744.           case MorphKind of
  3745.             mkDefault: PBuffer.Morph(APBuffer, MorphKf);
  3746.             mkGradient: PBuffer.MorphGrad(APBuffer, MorphKf);
  3747.             mkLeftGradient: PBuffer.MorphLeftGrad(APBuffer, MorphKf);
  3748.             mkRightGradient: PBuffer.MorphRightGrad(APBuffer, MorphKf);
  3749.             mkLeftSlide: PBuffer.MorphLeftSlide(APBuffer, MorphKf);
  3750.             mkRightSlide: PBuffer.MorphRightSlide(APBuffer, MorphKf);
  3751.             mkPush: PBuffer.MorphPush(APBuffer, MorphKf);
  3752.           end;
  3753.           PBuffer.Draw(Cnvs.Handle, ObjectRect.Left, ObjectRect.Top);
  3754.           PBuffer.Free;
  3755.           APBuffer.Free;
  3756.           Buffer.Free;
  3757.           ABuffer.Free;
  3758.         end;
  3759.     end;
  3760. end;
  3761. procedure TspSkinMainMenuBarButton.DblClick;
  3762. var
  3763.   DS: TspDynamicSkinForm;
  3764. begin
  3765.   DS := GetMDIChildDynamicSkinFormComponent;
  3766.   if (DS <> nil) and (Command = cmSysMenu)
  3767.   then
  3768.     begin