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

Delphi控件源码

开发平台:

Delphi

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