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

Delphi控件源码

开发平台:

Delphi

  1. {*******************************************************************}
  2. {                                                                   }
  3. {       Almediadev Visual Component Library                         }
  4. {       BusinessSkinForm                                            }
  5. {       Version 2.90                                                }
  6. {                                                                   }
  7. {       Copyright (c) 2000-2004 Almediadev                          }
  8. {       ALL RIGHTS RESERVED                                         }
  9. {                                                                   }
  10. {       Home:  http://www.almdev.com                                }
  11. {       Support: support@almdev.com                                 }
  12. {                                                                   }
  13. {*******************************************************************}
  14. Unit BusinessSkinForm;
  15. {$P+,S-,W-,R-}
  16. {$WARNINGS OFF}
  17. {$HINTS OFF}
  18. interface
  19. uses
  20.   Windows, Messages, Classes, Graphics, Controls, Forms,
  21.   ExtCtrls, bsSkinData, Menus, bsSkinMenus, bsSkinCtrls, bsUtils, bsSkinTabs,
  22.   bsSkinBoxCtrls, bsTrayIcon, bsSkinHint;
  23. type
  24.   TbsBorderIcon = (biSystemMenu, biMinimize, biMaximize, biRollUp, biMinimizeToTray);
  25.   TbsBorderIcons = set of TbsBorderIcon;
  26.   TbsPaintEvent = procedure (IDName: String; Canvas: TCanvas;
  27.                            ObjectRect: TRect) of object;
  28.   TbsMouseEnterEvent= procedure (IDName: String) of object;
  29.   TbsMouseLeaveEvent = procedure (IDName: String) of object;
  30.   TbsMouseUpEvent = procedure (IDName: String;
  31.                              X, Y: Integer; ObjectRect: TRect;
  32.                              Button: TMouseButton) of object;
  33.   TbsMouseDownEvent = procedure (IDName: String;
  34.                                X, Y: Integer; ObjectRect: TRect;
  35.                                Button: TMouseButton) of object;
  36.   TbsMouseMoveEvent = procedure (IDName: String; X, Y: Integer;
  37.                                ObjectRect: TRect) of object;
  38.   TbsActivateCustomObjectEvent = procedure (IDName: String; var ObjectVisible: Boolean) of object;
  39.   TbsBusinessSkinForm = class;
  40.   TbsActiveSkinObject = class(TObject)
  41.   protected
  42.     Parent: TbsBusinessSkinForm;
  43.     FMorphKf: Double;
  44.     FMouseIn: Boolean;
  45.     Picture, ActivePicture: TBitMap;
  46.     procedure SetMorphKf(Value: Double);
  47.     procedure Redraw;
  48.   public
  49.     SD: TbsSkinData;
  50.     IDName: String;
  51.     Hint: String;
  52.     SkinRect: TRect;
  53.     ActiveSkinRect: TRect;
  54.     InActiveSkinRect: TRect;
  55.     ObjectRect: TRect;
  56.     Active: Boolean;
  57.     Morphing: Boolean;
  58.     MorphKind: TbsMorphKind;
  59.     Enabled: Boolean;
  60.     Visible: Boolean;
  61.     SkinRectInAPicture: Boolean;
  62.     function CanMorphing: Boolean; virtual;
  63.     procedure DoMorphing;
  64.     property MorphKf: Double read FMorphKf write SetMorphKf;
  65.     constructor Create(AParent: TbsBusinessSkinForm; AData: TbsDataSkinObject);
  66.     procedure Draw(Cnvs: TCanvas; UpDate: Boolean); virtual;
  67.     procedure DblClick; virtual;
  68.     procedure MouseDown(X, Y: Integer; Button: TMouseButton); virtual;
  69.     procedure MouseUp(X, Y: Integer; Button: TMouseButton); virtual;
  70.     procedure MouseMove(X, Y: Integer); virtual;
  71.     procedure MouseEnter; virtual;
  72.     procedure MouseLeave; virtual;
  73.   end;
  74.   TbsSkinAnimateObject = class(TbsActiveSkinObject)
  75.   protected
  76.     FFrame: Integer;
  77.     FInc: Integer;
  78.     TimerInterval: Integer;
  79.     MenuItem: TMenuItem;
  80.     FPopupUp: Boolean;
  81.     procedure SetFrame(Value: Integer);
  82.     procedure DoMinToTray;
  83.     procedure DoMax;
  84.     procedure DoMin;
  85.     procedure DoRollUp;
  86.     procedure DoClose;
  87.     procedure DoCommand;
  88.     procedure TrackMenu;
  89.   public
  90.     CountFrames: Integer;
  91.     Cycle: Boolean;
  92.     ButtonStyle: Boolean;
  93.     Increment: Boolean;
  94.     Command: TbsStdCommand;
  95.     procedure ChangeFrame;
  96.     procedure Start;
  97.     procedure Stop;
  98.     constructor Create(AParent: TbsBusinessSkinForm;
  99.       AData: TbsDataSkinObject);
  100.     procedure DblCLick; override;
  101.     procedure MouseUp(X, Y: Integer; Button: TMouseButton); override;
  102.     property Frame: Integer read FFrame write SetFrame;
  103.     procedure Draw(Cnvs: TCanvas; UpDate: Boolean); override;
  104.     procedure MouseEnter; override;
  105.     procedure MouseLeave; override;
  106.   end;
  107.   TbsUserObject = class(TbsActiveSkinObject)
  108.   public
  109.     procedure Draw(Cnvs: TCanvas; UpDate: Boolean); override;
  110.   end;
  111.   TbsSkinButtonObject = class(TbsActiveSkinObject)
  112.   protected
  113.     FDown: Boolean;
  114.     FPopupUp: Boolean;
  115.     procedure SetDown(Value: Boolean);
  116.     procedure TrackMenu;
  117.   public
  118.     DisableSkinRect: TRect;
  119.     DownRect: TRect;
  120.     MenuItem: TMenuItem;
  121.     constructor Create(AParent: TbsBusinessSkinForm;
  122.       AData: TbsDataSkinObject);
  123.     property Down: Boolean read FDown write SetDown;
  124.     procedure Draw(Cnvs: TCanvas; UpDate: Boolean); override;
  125.     procedure MouseDown(X, Y: Integer; Button: TMouseButton); override;
  126.     procedure MouseUp(X, Y: Integer; Button: TMouseButton); override;
  127.     procedure MouseEnter; override;
  128.     procedure MouseLeave; override;
  129.     function CanMorphing: Boolean; override;
  130.   end;
  131.   TbsSkinStdButtonObject = class(TbsSkinButtonObject)
  132.   protected
  133.     procedure DoMax;
  134.     procedure DoMin;
  135.     procedure DoClose;
  136.     procedure DoRollUp;
  137.     procedure DoCommand;
  138.     procedure DoMinimizeToTray;
  139.   public
  140.     FSkinSupport: Boolean;
  141.     Command: TbsStdCommand;
  142.     RestoreRect, RestoreActiveRect, RestoreInActiveRect,
  143.     RestoreDownRect: TRect;
  144.     procedure DblClick; override;
  145.     procedure MouseDown(X, Y: Integer; Button: TMouseButton); override;
  146.     procedure MouseUp(X, Y: Integer; Button: TMouseButton); override;
  147.     constructor Create(AParent: TbsBusinessSkinForm;
  148.       AData: TbsDataSkinObject);
  149.     procedure Draw(Cnvs: TCanvas; UpDate: Boolean); override;
  150.     procedure DefaultDraw(Cnvs: TCanvas);
  151.     function CanMorphing: Boolean; override;
  152.   end;
  153.   TbsSkinCaptionObject = class(TbsActiveSkinObject)
  154.   public
  155.     FontName: String;
  156.     FontStyle: TFontStyles;
  157.     FontHeight: Integer;
  158.     FontColor: TColor;
  159.     ActiveFontColor: TColor;
  160.     ShadowColor: TColor;
  161.     ActiveShadowColor: TColor;
  162.     Shadow: Boolean;
  163.     Alignment: TAlignment;
  164.     TextRct: TRect;
  165.     FrameRect, ActiveFrameRect: TRect;
  166.     FrameLeftOffset, FrameRightOffset: Integer;
  167.     FrameTextRect: TRect;
  168.     constructor Create(AParent: TbsBusinessSkinForm;
  169.       AData: TbsDataSkinObject);
  170.     procedure MouseEnter; override;
  171.     procedure MouseLeave; override;
  172.     procedure MouseDown(X, Y: Integer; Button: TMouseButton); override;
  173.     procedure MouseUp(X, Y: Integer; Button: TMouseButton); override;
  174.     procedure Draw(Cnvs: TCanvas; UpDate: Boolean); override;
  175.   end;
  176.   TbsSkinMainMenu = class(TMainMenu)
  177.   protected
  178.     BSF: TbsBusinessSkinForm;
  179.     FSD: TbsSkinData;
  180.     procedure Notification(AComponent: TComponent;
  181.       Operation: TOperation); override;
  182.   public
  183.     constructor Create(AOwner: TComponent); override;
  184.   published
  185.     property SkinData: TbsSkinData read FSD write FSD;
  186.   end;
  187.   // Menu Bar //
  188.   TbsSkinMainMenuBar = class;
  189.   TbsMenuBarObject = class(TObject)
  190.   protected
  191.     Parent: TbsSkinMainMenuBar;
  192.     FMouseIn: Boolean;
  193.     Picture: TBitMap;
  194.     FDown: Boolean;
  195.     FMorphKf: Double;
  196.     procedure Redraw;
  197.     procedure SetMorphKf(Value: Double);
  198.   public
  199.     IDName: String;
  200.     SkinRect: TRect;
  201.     ActiveSkinRect: TRect;
  202.     DownRect: TRect;
  203.     ObjectRect: TRect;
  204.     Active: Boolean;
  205.     Enabled: Boolean;
  206.     Visible: Boolean;
  207.     Morphing: Boolean;
  208.     MorphKind: TbsMorphKind;
  209.     constructor Create(AParent: TbsSkinMainMenuBar; AData: TbsDataSkinObject);
  210.     procedure Draw(Cnvs: TCanvas); virtual;
  211.     procedure MouseDown(X, Y: Integer; Button: TMouseButton); virtual;
  212.     procedure MouseUp(X, Y: Integer; Button: TMouseButton); virtual;
  213.     procedure DblClick; virtual; 
  214.     procedure MouseEnter; virtual;
  215.     procedure MouseLeave; virtual;
  216.     function CanMorphing: Boolean; virtual;
  217.     procedure DoMorphing;
  218.     property MorphKf: Double read FMorphKf write SetMorphKf;
  219.   end;
  220.   TbsSkinMainMenuBarButton = class(TbsMenuBarObject)
  221.   protected
  222.     FSkinSupport: Boolean;
  223.     procedure DoCommand;
  224.   public
  225.     Command: TbsStdCommand;
  226.     constructor Create(AParent: TbsSkinMainMenuBar; AData: TbsDataSkinObject);
  227.     procedure DefaultDraw(Cnvs: TCanvas);
  228.     procedure Draw(Cnvs: TCanvas); override;
  229.     procedure DblClick; override;
  230.     procedure MouseDown(X, Y: Integer; Button: TMouseButton); override;
  231.     procedure MouseUp(X, Y: Integer; Button: TMouseButton); override;
  232.     procedure MouseEnter; override;
  233.     procedure MouseLeave; override;
  234.   end;
  235.   TbsSkinMainMenuBarItem = class(TbsMenuBarObject)
  236.   protected
  237.     FSkinSupport: Boolean;
  238.     TempObjectRect: TRect;
  239.     OldEnabled: Boolean;
  240.     Visible: Boolean;
  241.     function SearchDown: Boolean;
  242.     procedure SearchActive;
  243.     procedure SetDown(Value: Boolean);
  244.     procedure TrackMenu;
  245.   public
  246.     MenuItem: TMenuItem;
  247.     FontName: String;
  248.     FontHeight: Integer;
  249.     FontStyle: TFontStyles;
  250.     UnEnabledFontColor, FontColor,
  251.     ActiveFontColor, DownFontColor: TColor;
  252.     TextRct: TRect;
  253.     DownRect: TRect;
  254.     LO, RO: Integer;
  255.     constructor Create(AParent: TbsSkinMainMenuBar; AData: TbsDataSkinObject);
  256.     procedure DefaultDraw(Cnvs: TCanvas);
  257.     procedure Draw(Cnvs: TCanvas); override;
  258.     procedure MouseEnter; override;
  259.     procedure MouseDown(X, Y: Integer; Button: TMouseButton); override;
  260.     procedure MouseLeave; override;
  261.   end;
  262.   TbsItemEnterEvent = procedure (MenuItem: TMenuItem) of object;
  263.   TbsItemLeaveEvent = procedure (MenuItem: TMenuItem) of object;
  264.   TbsSkinMainMenuBar = class(TbsSkinControl)
  265.   protected
  266.     FOnItemMouseEnter: TbsItemEnterEvent;
  267.     FOnItemMouseLeave: TbsItemLeaveEvent;
  268.     FScrollMenu: Boolean;
  269.     FDefItemFont: TFont;
  270.     FUseSkinFont: Boolean;
  271.     FSkinSupport: Boolean;
  272.     ButtonsCount: Integer;
  273.     FMDIChildMax: Boolean;
  274.     FPopupToUp: Boolean;
  275.     MenuActive: Boolean;
  276.     Scroll: Boolean;
  277.     MarkerActive: Boolean;
  278.     BSF: TbsBusinessSkinForm;
  279.     FMainMenu: TMainMenu;
  280.     MouseTimer: TTimer;
  281.     MorphTimer: TTimer;
  282.     ActiveObject, OldActiveObject, MouseCaptureObject: Integer;
  283.     FOnMouseEnter, FOnMouseLeave: TNotifyEvent;
  284.     NewItemsRect: TRect;
  285.     FDefaultWidth: Integer;
  286.     FDefaultHeight: Integer;
  287.     procedure TestMorph(Sender: TObject);
  288.     procedure SetDefaultWidth(Value: Integer);
  289.     procedure SetDefaultHeight(Value: Integer);
  290.     procedure SetDefItemFont(Value: TFont);
  291.     procedure CloseSysMenu;
  292.     procedure AddButtons;
  293.     procedure DeleteButtons;
  294.     procedure CheckButtons(BI: TbsBorderIcons);
  295.     procedure TrackScrollMenu;
  296.     procedure CalcRects;
  297.     procedure SetMainMenu(Value: TMainMenu);
  298.     procedure TestMouse(Sender: TObject);
  299.       procedure PaintMenuBar(Cnvs: TCanvas);
  300.     procedure WMEraseBkgnd(var Message: TWMEraseBkgnd); message WM_ERASEBKGND;
  301.     procedure WMCloseSkinMenu(var Message: TMessage); message WM_CLOSESKINMENU; 
  302.     procedure WMSize(var Message: TWMSIZE); message WM_SIZE;
  303.     procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
  304.     procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
  305.     procedure TestActive(X, Y: Integer);
  306.     procedure Notification(AComponent: TComponent;
  307.                            Operation: TOperation); override;
  308.     procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
  309.       X, Y: Integer); override;
  310.     procedure MouseUp(Button: TMouseButton; Shift: TShiftState;
  311.       X, Y: Integer); override;
  312.     procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
  313.     procedure ClearObjects;
  314.     procedure DrawSkinObject(AObject: TbsMenuBarObject);
  315.     procedure MenuEnter;
  316.     procedure MenuExit;
  317.     procedure MenuClose;
  318.     function CheckReturnKey: Boolean;
  319.     procedure NextMainMenuItem;
  320.     procedure PriorMainMenuItem;
  321.     function FindHotKeyItem(CharCode: Integer): Boolean;
  322.     function GetMarkerRect: TRect;
  323.     procedure DrawMarker(Cnvs: TCanvas);
  324.     procedure MDIChildMaximize;
  325.     procedure MDIChildRestore;
  326.   public
  327.     //
  328.     SkinRect, ItemsRect: TRect;
  329.     MenuBarItem: String;
  330.     MaxButton, MinButton, SysMenuButton, CloseButton: String;
  331.     TrackMarkColor, TrackMarkActiveColor: Integer;
  332.     Picture: TBitMap;
  333.     //
  334.     ObjectList: TList;
  335.     //
  336.     ChildMenuIn: Boolean;
  337.     //
  338.     constructor Create(AOwner: TComponent); override;
  339.     destructor Destroy; override;
  340.     function GetChildMainMenu: TMainMenu;
  341.     procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override;
  342.     procedure Paint; override;
  343.     procedure CreateMenu;
  344.     procedure ChangeSkinData; override;
  345.     procedure BeforeChangeSkinData; override;
  346.     procedure GetSkinData; override;
  347.     procedure UpDateItems;
  348.   published
  349.     property ScrollMenu: Boolean read FScrollMenu write FScrollMenu;
  350.     property UseSkinFont: Boolean
  351.       read FUseSkinFont write FUseSkinFont;
  352.     property DefItemFont: TFont read FDefItemFont write SetDefItemFont;
  353.     property DefaultWidth: Integer read FDefaultWidth write SetDefaultWidth;
  354.     property DefaultHeight: Integer read FDefaultHeight write SetDefaultHeight;
  355.     property PopupToUp: Boolean read FPopupToUp write FPopupToUp;
  356.     property BusinessSkinForm: TbsBusinessSkinForm read BSF write BSF;
  357.     property MainMenu: TMainMenu read FMainMenu write SetMainMenu;
  358.     property Anchors;
  359.     property Align;
  360.     property Visible;
  361.     property Enabled;
  362.     property OnMouseEnter: TNotifyEvent read FOnMouseEnter write FOnMouseEnter;
  363.     property OnMouseLeave: TNotifyEvent read FOnMouseLeave write FOnMouseLeave;
  364.     property OnItemMouseEnter: TbsItemEnterEvent read FOnItemMouseEnter write FOnItemMouseEnter;
  365.     property OnItemMouseLeave: TbsItemLeaveEvent read FOnItemMouseLeave write FOnItemMouseLeave;
  366.     property OnMouseDown;
  367.     property OnMouseMove;
  368.     property OnMouseUp;
  369.     property OnClick;
  370.   end;
  371.   TbsSkinMDITabsBar = class;
  372.   TbsBusinessSkinForm = class(TComponent)
  373.   private
  374.     FClientWidth, FClientHeight: Integer;
  375.     FHideCaptionButtons: Boolean;
  376.     FAlwaysShowInTray: Boolean;
  377.     FLogoBitMapTransparent: Boolean;
  378.     FLogoBitMap: TBitMap;
  379.     FAlwaysMinimizeToTray: Boolean;
  380.     FIcon: TIcon;
  381.     FShowIcon: Boolean;
  382.     ButtonsInLeft: boolean;
  383.     FMaximizeOnFullScreen: Boolean;
  384.     FAlphaBlend: Boolean;
  385.     FAlphaBlendAnimation: Boolean;
  386.     FAlphaBlendValue: Byte;
  387.     FSkinHint: TbsSkinHint;
  388.     FShowObjectHint: Boolean;
  389.     FUseDefaultObjectHint: Boolean;
  390.     FMenusAlphaBlend: Boolean;
  391.     FMenusAlphaBlendValue: Byte;
  392.     FMenusAlphaBlendAnimation: Boolean;
  393.     FSkinSupport: Boolean;
  394.     FDefCaptionFont: TFont;
  395.     FDefInActiveCaptionFont: TFont;
  396.     FMDIChildMaximized: Boolean;
  397.     FFormActive: Boolean;
  398.     FOnMinimizeToTray: TNotifyEvent;
  399.     FOnRestoreFromTray: TNotifyEvent;
  400.     FTrayIcon: TbsTrayIcon;
  401.     FUseDefaultSysMenu: Boolean;
  402.     FSysMenu: TPopupMenu;
  403.     FSysTrayMenu: TbsSkinPopupMenu;
  404.     FInShortCut: Boolean;
  405.     FMainMenuBar: TbsSkinMainMenuBar;
  406.     FMDITabsBar: TbsSkinMDITabsBar;
  407.     FFullDrag: Boolean;
  408.     FFormWidth, FFormHeight: Integer;
  409.     FSizeMove: Boolean;
  410.     FRollUpState, MaxRollUpState: Boolean;
  411.     FBorderIcons: TbsBorderIcons;
  412.     RMTop, RMBottom, RMLeft, RMRight: TBitMap;
  413.     BlackColor: TColor;
  414.     MouseIn: Boolean;
  415.     OldBoundsRect: TRect;
  416.     OldHeight: Integer;
  417.     NewLTPoint, NewRBPoint, NewRTPoint, NewLBPoint: TPoint;
  418.     NewClRect, NewCaptionRect, NewButtonsRect: TRect;
  419.     NewButtonsOffset: Integer;
  420.     NewButtonsInLeft: Boolean;
  421.     NewMaskRectArea: TRect;
  422.     NewHitTestLTPoint,
  423.     NewHitTestRTPoint,
  424.     NewHitTestLBPoint,
  425.     NewHitTestRBPoint: TPoint;
  426.     NewDefCaptionRect: TRect;
  427.     FMinHeight, FMinWidth: Integer;
  428.     OldWindowProc: TWndMethod;
  429.     FClientInstance: Pointer;
  430.     FPrevClientProc: Pointer;
  431.     FSD: TbsSkinData;
  432.     FMSD: TbsSkinData;
  433.     FMainMenu: TMainMenu;
  434.     FSystemMenu: TPopupMenu;
  435.     FOnChangeSkinData: TNotifyEvent;
  436.     FOnActivate: TNotifyEvent;
  437.     FOnDeActivate: TNotifyEvent;
  438.     FOnChangeRollUpState: TNotifyEvent;
  439.     FInChangeSkinData: Boolean;
  440.     FWindowState: TWindowState;
  441.     FMagneticSize: Byte;
  442.     OldAppMessage: TMessageEvent;
  443.     FOnActivateCustomObject: TbsActivateCustomObjectEvent; 
  444.     procedure CheckMDIMainMenu;
  445.     procedure CheckMDIBar;
  446.     procedure SetLogoBitMap(Value: TBitMap);
  447.     procedure SetShowIcon(Value: Boolean);
  448.     
  449.     procedure UpDateActiveObjects;
  450.     procedure SetMenusAlphaBlend(Value: Boolean);
  451.     procedure SetMenusAlphaBlendAnimation(Value: Boolean);
  452.     procedure SetMenusAlphaBlendValue(Value: Byte);
  453.     function GetDefCaptionRect: TRect;
  454.     function GetDefCaptionHeight: Integer;
  455.     function GetDefButtonSize: Integer;
  456.     function IsSizeAble: Boolean;
  457.     procedure SetDefaultMenuItemHeight(Value: Integer);
  458.     function GetDefaultMenuItemHeight: Integer;
  459.     procedure SetDefaultMenuItemFont(Value: TFont);
  460.     function GetDefaultMenuItemFont: TFont;
  461.     procedure SetDefCaptionFont(Value: TFont);
  462.     procedure SetDefInActiveCaptionFont(Value: TFont);
  463.     procedure SetBorderIcons(Value: TbsBorderIcons);
  464.     procedure NewAppMessage(var Msg: TMsg; var Handled: Boolean);
  465.     procedure HookApp;
  466.     procedure UnHookApp;
  467.     function GetMaximizeMDIChild: TForm;
  468.     function IsMDIChildMaximized: Boolean;
  469.     procedure ResizeMDIChilds;
  470.     function GetMDIWorkArea: TRect;
  471.     procedure UpDateForm;
  472.     procedure FormClientWindowProcHook(var Message: TMessage);
  473.     procedure TSM_Restore(Sender: TObject);
  474.     procedure TSM_Close(Sender: TObject);
  475.     procedure SM_Restore(Sender: TObject);
  476.     procedure SM_Max(Sender: TObject);
  477.     procedure SM_Min(Sender: TObject);
  478.     procedure SM_RollUp(Sender: TObject);
  479.     procedure SM_Close(Sender: TObject);
  480.     procedure SM_MinToTray(Sender: TObject);
  481.     procedure TrayIconDBLCLK(Sender: TObject);
  482.     procedure TrackSystemMenu(X, Y: Integer);
  483.     procedure CreateSysMenu;
  484.     procedure CreateUserSysMenu;
  485.     procedure CreateSysTrayMenu;
  486.     function GetSystemMenu: TMenuItem;
  487.     procedure CalcRects;
  488.     procedure FormShortCut(var Msg: TWMKey; var Handled: Boolean);
  489.     procedure ChangeSkinData;
  490.     procedure CreateRollUpForm;
  491.     procedure RestoreRollUpForm;
  492.     procedure SetRollUpState(Value: Boolean);
  493.     procedure SetTrayIcon(Value: TbsTrayIcon);
  494.     procedure BeforeUpDateSkinControls(AFSD: Integer; WC: TWinControl);
  495.     procedure UpDateSkinControls(AFSD: Integer; WC: TWinControl);
  496.     procedure CheckObjects;
  497.     procedure CheckObjectsHint;
  498.     procedure SetWindowState(Value: TWindowState);
  499.     procedure SetSkinData(Value: TbsSkinData);
  500.     procedure SetMenusSkinData(Value: TbsSkinData);
  501.     procedure NewWndProc(var Message: TMessage);
  502.     function NewNCHitTest(P: TPoint): Integer;
  503.     function NewDefNCHitTest(P: TPoint): Integer;
  504.     procedure CreateNewRegion(FCanScale: Boolean);
  505.     procedure CreateNewForm(FCanScale: Boolean);
  506.     procedure FormChangeActive(AUpDate: Boolean);
  507.     procedure DoMaximize;
  508.     procedure DoNormalize;
  509.     procedure DoMinimize;
  510.     function InForm(P: TPoint): Boolean;
  511.     function PtInMask(P: TPoint): Boolean;
  512.     function CanScale: Boolean;
  513.     procedure SetAlphaBlendValue(Value: Byte);
  514.     procedure SetAlphaBlend(Value: Boolean);
  515.     procedure GetIconSize(var X, Y: Integer);
  516.     procedure GetIcon;
  517.     procedure DrawFormIcon(Cnvs: TCanvas; X, Y: Integer);
  518.     function GetUseSkinFontInMenu: Boolean;
  519.     procedure SetUseSkinFontInMenu(Value: Boolean);
  520.     function GetRealHeight: Integer;
  521.   protected
  522.     InMenu: Boolean;
  523.     InMainMenu: Boolean;
  524.     FRgn: HRGN;
  525.     MouseTimer: TTimer;
  526.     MorphTimer: TTimer;
  527.     AnimateTimer: TTimer;
  528.     FMagnetic: Boolean;
  529.     FOnSkinMenuOpen: TNotifyEvent;
  530.     FOnSkinMenuClose: TNotifyEvent;
  531.     FOnMainMenuEnter: TNotifyEvent;
  532.     FOnMainMenuExit: TNotifyEvent;
  533.     FOnMouseEnterEvent: TbsMouseEnterEvent;
  534.     FOnMouseLeaveEvent: TbsMouseLeaveEvent;
  535.     FOnMouseUpEvent : TbsMouseUpEvent;
  536.     FOnMouseDownEvent : TbsMouseDownEvent;
  537.     FOnMouseMoveEvent: TbsMouseMoveEvent;
  538.     FOnPaintEvent: TbsPaintEvent;
  539.     ActiveObject, OldActiveObject, MouseCaptureObject: Integer;
  540.     OldWindowState: TWindowState;
  541.     procedure DrawLogoBitMap(C: TCanvas);
  542.     procedure CorrectCaptionText(C: TCanvas; var S: String; W: Integer);
  543.     procedure CheckMenuVisible(var Msg: Cardinal);
  544.     procedure FormKeyDown(Message: TMessage);
  545.     function GetFullDragg: Boolean;
  546.     function GetMinimizeCoord: TPoint;
  547.     procedure PointToNCPoint(var P: TPoint);
  548.     function CheckReturnKey: Boolean;
  549.     function CanNextMainMenuItem: Boolean;
  550.     function CanPriorMainMenuItem: Boolean;
  551.     function FindHotKeyItem(CharCode: Integer): Boolean;
  552.     procedure DoMagnetic(var L, T: Integer; W, H: Integer);
  553.     procedure TestMouse(Sender: TObject);
  554.     procedure TestMorph(Sender: TObject);
  555.     procedure TestAnimate(Sender: TObject);
  556.     procedure TestActive(X, Y: Integer; InFrm: Boolean);
  557.     procedure MouseDown(Button: TMouseButton;  X, Y: Integer);
  558.     procedure MouseDBlClick;
  559.     procedure MouseMove(X, Y: Integer);
  560.     procedure MouseUp(Button: TMouseButton; X, Y: Integer);
  561.     function CalcRealObjectRect(R: TRect): TRect;
  562.     procedure CalcAllRealObjectRect;
  563.     procedure Notification(AComponent: TComponent;
  564.                            Operation: TOperation); override;
  565.     procedure LoadObjects;
  566.     procedure LoadDefObjects;
  567.     
  568.     procedure MouseEnterEvent(IDName: String);
  569.     procedure MouseLeaveEvent(IDName: String);
  570.     procedure MouseUpEvent(IDName: String;
  571.                            X, Y: Integer; ObjectRect: TRect;
  572.                            Button: TMouseButton);
  573.     procedure MouseDownEvent(IDName: String;
  574.                              X, Y: Integer; ObjectRect: TRect;
  575.                              Button: TMouseButton);
  576.     procedure MouseMoveEvent(IDName: String; X, Y: Integer;
  577.                              ObjectRect: TRect);
  578.     procedure PaintEvent(IDName: String; Canvas: TCanvas; ObjectRect: TRect);
  579.     procedure SkinMainMenuClose;
  580.     procedure SkinMenuClose2;
  581.     procedure ArangeMinimizedChilds;
  582.     function GetAutoRenderingInActiveImage: Boolean;
  583.   public
  584.     PreviewMode: Boolean;
  585.     SkinMenu: TbsSkinMenu;
  586.     FForm: TForm;
  587.     ObjectList: TList;
  588.     procedure AddChildToMenu(Child: TCustomForm);
  589.     procedure AddChildToBar(Child: TCustomForm);
  590.     procedure RefreshMDIBarTab(Child: TCustomForm);
  591.     procedure DeleteChildFromMenu(Child: TCustomForm);
  592.     procedure DeleteChildFromBar(Child: TCustomForm);
  593.     procedure MDIItemClick(Sender: TObject);
  594.     procedure UpDateChildCaptionInMenu(Child: TCustomForm);
  595.     procedure UpDateChildActiveInMenu;
  596.     function GetMinWidth: Integer;
  597.     function GetMinHeight: Integer;
  598.     function GetMaxWidth: Integer;
  599.     function GetMaxHeight: Integer;
  600.     procedure MinimizeAll;
  601.     procedure MaximizeAll;
  602.     procedure RestoreAll;
  603.     procedure Tile;
  604.     procedure Cascade;
  605.     procedure CloseAll;
  606.     function GetFormActive: Boolean;
  607.     procedure MinimizeToTray;
  608.     procedure RestoreFromTray;
  609.     procedure SkinMenuOpen;
  610.     procedure SkinMenuClose;
  611.     procedure DrawSkinObject(AObject: TbsActiveSkinObject);
  612.     //
  613.     procedure SetFormStyle(FS: TFormStyle);
  614.     procedure PopupSkinMenu(Menu: TMenu; P: TPoint);
  615.     procedure PopupSkinMenu1(Menu: TMenu; R: TRect; PopupUp: Boolean);
  616.     procedure ClearObjects;
  617.     function GetIndex(AIDName: String): Integer;
  618.     constructor Create(AOwner: TComponent); override;
  619.     destructor Destroy; override;
  620.     procedure PaintNCSkin;
  621.     procedure PaintBG(DC: HDC);
  622.     procedure PaintBG2(DC: HDC);
  623.     procedure PaintBG3(DC: HDC);
  624.     //
  625.     procedure PaintNCDefault;
  626.     procedure PaintBGDefault(DC: HDC);
  627.     procedure PaintMDIBGDefault(DC: HDC);
  628.     procedure CalcDefRects;
  629.     //
  630.     procedure SetEnabled(AIDName: String; Value: Boolean);
  631.     procedure UserObjectDraw(AIDName: String);
  632.     procedure LinkMenu(AIDName: String; AMenu: TMenu; APopupUp: Boolean);
  633.     //
  634.     property RollUpState: Boolean read FRollUpState write SetRollUpState;
  635.     property WindowState: TWindowState read FWindowState write SetWindowState;
  636.     property RealHeight: Integer read GetRealHeight write OldHeight;
  637.   published
  638.     property ClientWidth: Integer read FClientWidth write FClientWidth;
  639.     property ClientHeight: Integer read FClientHeight write FClientHeight;
  640.     property HideCaptionButtons: Boolean read
  641.       FHideCaptionButtons write FHideCaptionButtons;
  642.     property AlwaysShowInTray: Boolean read FAlwaysShowInTray write FAlwaysShowInTray;
  643.     property LogoBitMap: TBitMap read FLogoBitMap write SetLogoBitMap;
  644.     property LogoBitMapTransparent: Boolean
  645.       read FLogoBitMapTransparent
  646.       write FLogoBitMapTransparent;
  647.     property AlwaysMinimizeToTray: Boolean
  648.       read FAlwaysMinimizeToTray write FAlwaysMinimizeToTray; 
  649.     property UseSkinFontInMenu: boolean
  650.       read GetUseSkinFontInMenu write SetUseSkinFontInMenu;
  651.     property ShowIcon: Boolean read FShowIcon write SetShowIcon;
  652.     property MaximizeOnFullScreen: Boolean
  653.       read FMaximizeOnFullScreen write FMaximizeOnFullScreen;
  654.     property AlphaBlend: Boolean read FAlphaBlend write SetAlphaBlend;
  655.     property AlphaBlendAnimation: Boolean
  656.       read FAlphaBlendAnimation write FAlphaBlendAnimation;
  657.     property AlphaBlendValue: Byte
  658.       read FAlphaBlendValue write SetAlphaBlendValue;
  659.     property SkinHint: TbsSkinHint read FSkinHint write FSkinHint;
  660.     property ShowObjectHint: Boolean read FShowObjectHint write FShowObjectHint;
  661.     property UseDefaultObjectHint: Boolean read FUseDefaultObjectHint write FUseDefaultObjectHint;
  662.     property MenusAlphaBlend: Boolean
  663.       read FMenusAlphaBlend write SetMenusAlphaBlend;
  664.     property MenusAlphaBlendAnimation: Boolean
  665.       read FMenusAlphaBlendAnimation write SetMenusAlphaBlendAnimation;
  666.     property MenusAlphaBlendValue: Byte
  667.       read FMenusAlphaBlendValue write SetMenusAlphaBlendValue;
  668.     property DefCaptionFont: TFont read FDefCaptionFont write SetDefCaptionFont;
  669.     property DefInActiveCaptionFont: TFont read FDefInActiveCaptionFont write SetDefInActiveCaptionFont;
  670.     property DefMenuItemHeight: Integer
  671.       read GetDefaultMenuItemHeight write SetDefaultMenuItemHeight;
  672.     property DefMenuItemFont: TFont
  673.       read GetDefaultMenuItemFont write SetDefaultMenuItemFont;
  674.     property TrayIcon: TbsTrayIcon read FTrayIcon write SetTrayIcon;
  675.     property UseDefaultSysMenu: Boolean
  676.       read FUseDefaultSysMenu write FUseDefaultSysMenu;
  677.     property MainMenuBar: TbsSkinMainMenuBar read FMainMenuBar write FMainMenuBar;
  678.     property MDITabsBar: TbsSkinMDITabsBar read FMDITabsBar write FMDITabsBar;
  679.     property SystemMenu: TPopupMenu read FSystemMenu write FSystemMenu;
  680.     property SkinData: TbsSkinData read FSD write SetSkinData;
  681.     property MenusSkinData: TbsSkinData read FMSD write SetMenusSkinData;
  682.     property MinHeight: Integer read FMinHeight write  FMinHeight;
  683.     property MinWidth: Integer read FMinWidth write  FMinWidth;
  684.     property Magnetic: Boolean read  FMagnetic write FMagnetic;
  685.     property MagneticSize: Byte read  FMagneticSize write FMagneticSize;
  686.     property BorderIcons: TbsBorderIcons read FBorderIcons write SetBorderIcons;
  687.     property OnChangeSkinData: TNotifyEvent read FOnChangeSkinData
  688.                                             write FOnChangeSkinData;
  689.     property OnMouseUpEvent: TbsMouseUpEvent read FOnMouseUpEvent
  690.                                            write FOnMouseUpEvent;
  691.     property OnMouseDownEvent: TbsMouseDownEvent read FOnMouseDownEvent
  692.                                                write FOnMouseDownEvent;
  693.     property OnMouseMoveEvent: TbsMouseMoveEvent read FOnMouseMoveEvent
  694.                                                write FOnMouseMoveEvent;
  695.     property OnMouseEnterEvent: TbsMouseEnterEvent read FOnMouseEnterEvent
  696.                                                  write FOnMouseEnterEvent;
  697.     property OnMouseLeaveEvent: TbsMouseLeaveEvent read FOnMouseLeaveEvent
  698.                                                  write FOnMouseLeaveEvent;
  699.     property OnPaintEvent: TbsPaintEvent read FOnPaintEvent
  700.                                        write FOnPaintEvent;
  701.     property OnActivate: TNotifyEvent read FOnActivate write  FOnActivate;
  702.     property OnDeActivate: TNotifyEvent read FOnDeActivate write  FOnDeActivate;
  703.     property OnSkinMenuOpen: TNotifyEvent read FOnSkinMenuOpen
  704.                                           write FOnSkinMenuOpen;
  705.     property OnSkinMenuClose: TNotifyEvent read FOnSkinMenuClose
  706.                                           write FOnSkinMenuClose;
  707.     property OnChangeRollUpState: TNotifyEvent read FOnChangeRollUpState
  708.                                                write FOnChangeRollUpState;
  709.     property OnMainMenuEnter: TNotifyEvent read FOnMainMenuEnter
  710.                                            write FOnMainMenuEnter;
  711.     property OnMainMenuExit: TNotifyEvent read FOnMainMenuExit
  712.                                            write FOnMainMenuExit;
  713.     property OnMinimizeToTray: TNotifyEvent
  714.       read FOnMinimizeToTray write FOnMinimizeToTray;
  715.     property OnRestoreFromTray: TNotifyEvent
  716.       read FOnRestoreFromTray write FOnRestoreFromTray;
  717.     property OnActivateCustomObject: TbsActivateCustomObjectEvent
  718.       read FOnActivateCustomObject write FOnActivateCustomObject;
  719.   end;
  720.   TbsMDITab = class(TObject)
  721.   protected
  722.     TabsBar: TbsSkinMDITabsBar;
  723.   public
  724.     Active, MouseIn: Boolean;
  725.     ObjectRect: TRect;
  726.     Child: TCustomForm;
  727.     constructor Create(AParentBar: TbsSkinMDITabsBar; AChild: TCustomForm);
  728.     procedure Draw(Cnvs: TCanvas);
  729.   end;
  730.   TbsMDITabMouseEnterEvent = procedure (MDITab: TbsMDITab) of object;
  731.   TbsMDITabMouseLeaveEvent = procedure (MDITab: TbsMDITab) of object;
  732.   TbsMDITabMouseDownEvent = procedure (Button: TMouseButton; Shift: TShiftState; MDITab: TbsMDITab) of object;
  733.   TbsMDITabMouseUpEvent = procedure (Button: TMouseButton; Shift: TShiftState; MDITab: TbsMDITab) of object;
  734.   TbsSkinMDITabsBar = class(TbsSkinControl)
  735.   private
  736.     IsDrag: Boolean;
  737.     DX, TabDX: Integer;
  738.     FDown: Boolean;
  739.     DragIndex: Integer;
  740.     FOnTabMouseEnter: TbsMDITabMouseEnterEvent;
  741.     FOnTabMouseLeave: TbsMDITabMouseLeaveEvent;
  742.     FOnTabMouseUp: TbsMDITabMouseUpEvent;
  743.     FOnTabMouseDown: TbsMDITabMouseDownEvent;
  744.     FDefaultTabWidth: Integer;
  745.     FDefaultHeight: Integer;
  746.     FDefaultFont: TFont;
  747.     ActiveTabIndex, OldTabIndex: Integer;
  748.     FMoveTabs: Boolean;
  749.     procedure SetDefaultHeight(Value: Integer);
  750.     procedure SetDefaultFont(Value: TFont);
  751.     procedure CalcObjectRects;
  752.     procedure TestActive(X, Y: Integer);
  753.     procedure CheckActive;
  754.   protected
  755.     procedure CreateControlDefaultImage(B: TBitMap); override;
  756.     procedure CreateControlSkinImage(B: TBitMap); override;
  757.     procedure ClearObjects;
  758.     procedure GetSkinData; override;
  759.     procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
  760.     procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
  761.     procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
  762.                         X, Y: Integer); override;
  763.     procedure MouseUp(Button: TMouseButton; Shift: TShiftState;
  764.       X, Y: Integer); override;
  765.     function GetMoveIndex: Integer;  
  766.   public
  767.     ObjectList: TList;
  768.     Picture: TBitMap;
  769.     TabRect, ActiveTabRect, MouseInTabRect: TRect;
  770.     TabsBGRect: TRect;
  771.     TabLeftOffset, TabRightOffset: Integer;
  772.     FontName: String;
  773.     FontStyle: TFontStyles;
  774.     FontHeight: Integer;
  775.     FontColor, ActiveFontColor, MouseInFontColor: TColor;
  776.     UpDown: String;
  777.     constructor Create(AOwner: TComponent); override;
  778.     destructor Destroy; override;
  779.     function GetTab(X, Y: Integer): TbsMDITab;
  780.     function GetTabIndex(X, Y: Integer): Integer;
  781.      procedure AddTab(Child: TCustomForm);
  782.     procedure DeleteTab(Child: TCustomForm);
  783.     procedure ChangeSkinData; override;
  784.   published
  785.     property MoveTabs: Boolean read FMoveTabs write FMoveTabs;
  786.     property DefaultHeight: Integer read FDefaultHeight write SetDefaultHeight;
  787.     property DefaultFont: TFont read FDefaultFont write SetDefaultFont;
  788.     property DefaultTabWidth: Integer read FDefaultTabWidth write FDefaultTabWidth;
  789.     property Align;
  790.     property PopupMenu;
  791.     property DockSite;
  792.     property DragCursor;
  793.     property DragKind;
  794.     property DragMode;
  795.     property Enabled;
  796.     property ParentShowHint;
  797.     property ShowHint;
  798.     property TabOrder;
  799.     property TabStop;
  800.     property Visible;
  801.     property OnTabMouseEnter: TbsMDITabMouseEnterEvent
  802.       read FOnTabMouseEnter write FOnTabMouseEnter;
  803.     property OnTabMouseLeave: TbsMDITabMouseLeaveEvent
  804.       read FOnTabMouseLeave write FOnTabMouseLeave;
  805.     property OnTabMouseUp: TbsMDITabMouseUpEvent
  806.       read FOnTabMouseUp write FOnTabMouseUp;
  807.     property OnTabMouseDown: TbsMDITabMouseDownEvent
  808.       read FOnTabMouseDown write FOnTabMouseDown;
  809.     property OnCanResize;
  810.     property OnClick;
  811.     property OnConstrainedResize;
  812.     property OnDockDrop;
  813.     property OnDockOver;
  814.     property OnDblClick;
  815.     property OnDragDrop;
  816.     property OnDragOver;
  817.     property OnEndDock;
  818.     property OnEndDrag;
  819.     property OnEnter;
  820.     property OnExit;
  821.     property OnGetSiteInfo;
  822.     property OnMouseDown;
  823.     property OnMouseMove;
  824.     property OnMouseUp;
  825.     property OnResize;
  826.     property OnStartDock;
  827.     property OnStartDrag;
  828.     property OnUnDock;
  829.     property OnContextPopup;
  830.   end;
  831.   function GetBusinessSkinFormComponent(AForm: TCustomForm): TbsBusinessSkinForm;
  832.   function GetMDIChildBusinessSkinFormComponent: TbsBusinessSkinForm;
  833.   function GetMDIChildBusinessSkinFormComponent2: TbsBusinessSkinForm;
  834. implementation
  835.    Uses bsEffects, bsConst;
  836. const
  837.    WS_EX_LAYERED = $80000;
  838.    MouseTimerInterval = 50;
  839.    MorphTimerInterval = 20;
  840.    AnimateTimerInterval = 25;
  841.    MorphInc = 0.2;
  842.    // effects cosnts
  843.    InActiveBrightnessKf = 0.5;
  844.    InActiveDarknessKf = 0.3;
  845.    InActiveNoiseAmount = 50;
  846.    //
  847.    HTNCACTIVE = HTOBJECT;
  848.    TRACKMARKEROFFSET = 5;
  849.    DEFCAPTIONHEIGHT = 19;
  850.    DEFBUTTONSIZE = 17;
  851.    DEFTOOLCAPTIONHEIGHT = 15;
  852.    DEFTOOLBUTTONSIZE = 13;
  853.    DEFFORMMINWIDTH = 120;
  854.    TMI_RESTORENAME = 'TRAY_BSF_RESTORE';
  855.    TMI_CLOSENAME = 'TRAY_BSF_CLOSE';
  856.    MI_MINNAME = 'BSF_MINITEM';
  857.    MI_MAXNAME = 'BSF_MAXITEM';
  858.    MI_CLOSENAME = 'BSF_CLOSE';
  859.    MI_RESTORENAME = 'BSF_RESTORE';
  860.    MI_MINTOTRAYNAME = 'BSF_MINTOTRAY';
  861.    MI_ROLLUPNAME = 'BSF_ROLLUP';
  862.    MI_CHILDITEM = '_BSFCHILDITEM';
  863.    WM_MDICHANGESIZE = WM_USER + 206;
  864.    WM_MDICHILDMAX = WM_USER + 207;
  865.    WM_MDICHILDRESTORE = WM_USER + 208;
  866. function GetBusinessSkinFormComponent;
  867. var
  868.   i: Integer;
  869. begin
  870.   Result := nil;
  871.   if AForm <> nil then
  872.   for i := 0 to AForm.ComponentCount - 1 do
  873.     if AForm.Components[i] is TbsBusinessSkinForm
  874.     then
  875.       begin
  876.         Result := (AForm.Components[i] as TbsBusinessSkinForm);
  877.         Break;
  878.       end;
  879. end;
  880. function GetMDIChildBusinessSkinFormComponent;
  881. var
  882.   i: Integer;
  883. begin
  884.   Result := nil;
  885.   for i := 0 to Application.MainForm.MDIChildCount - 1 do
  886.   begin
  887.     Result := GetBusinessSkinFormComponent(Application.MainForm.MDIChildren[i]);
  888.     if (Result <> nil) and (Result.WindowState = wsMaximized)
  889.     then
  890.       Break
  891.     else
  892.       Result := nil;
  893.   end;
  894. end;
  895. function GetMDIChildBusinessSkinFormComponent2;
  896. begin
  897.   if (Application.MainForm <> nil) and (Application.MainForm.ActiveMDIChild <> nil)
  898.   then
  899.     Result := GetBusinessSkinFormComponent(Application.MainForm.ActiveMDIChild)
  900.   else
  901.    Result := nil;
  902. end;
  903. //============= TbsActiveSkinObject  =============//
  904. constructor TbsActiveSkinObject.Create;
  905. begin
  906.   Visible := True;
  907.   Enabled := True;
  908.   Parent := AParent;
  909.   SD := Parent.SkinData;
  910.   FMorphKf := 0;
  911.   Morphing := False;
  912.   if AData <> nil
  913.   then
  914.     begin
  915.       with AData do
  916.       begin
  917.         Self.IDName := IDName;
  918.         Self.Hint := Hint;
  919.         Self.SkinRectInAPicture := SkinRectInAPicture;
  920.         Self.SkinRect := SkinRect;
  921.         Self.ActiveSkinRect := ActiveSkinRect;
  922.         Self.InActiveSkinRect:= InActiveSkinRect;
  923.         Self.Morphing := Morphing;
  924.         Self.MorphKind := MorphKind;
  925.         if (ActivePictureIndex <> - 1) and
  926.            (ActivePictureIndex < SD.FActivePictures.Count)
  927.         then
  928.           ActivePicture := TBitMap(SD.FActivePictures.Items[ActivePictureIndex])
  929.         else
  930.           begin
  931.             ActivePicture := nil;
  932.             ActiveSkinRect := NullRect;
  933.           end;
  934.       end;
  935.       if Morphing and IsNullRect(ActiveSkinRect) then Morphing := False;
  936.       ObjectRect := SkinRect;
  937.       Picture := SD.FPicture;
  938.     end;
  939. end;
  940. procedure TbsActiveSkinObject.ReDraw;
  941. begin
  942.   if Morphing
  943.   then Parent.MorphTimer.Enabled := True
  944.   else Parent.DrawSkinObject(Self);
  945. end;
  946. procedure TbsActiveSkinObject.DblClick;
  947. begin
  948. end;
  949. procedure TbsActiveSkinObject.MouseDown(X, Y: Integer; Button: TMouseButton);
  950. begin
  951.   Parent.MouseDownEvent(IDName, X, Y, ObjectRect, Button);
  952. end;
  953. procedure TbsActiveSkinObject.MouseUp(X, Y: Integer; Button: TMouseButton);
  954. begin
  955.   if FMouseIn then Parent.MouseUpEvent(IDName, X, Y, ObjectRect, Button);
  956. end;
  957. procedure TbsActiveSkinObject.MouseMove(X, Y: Integer);
  958. begin
  959.   Parent.MouseMoveEvent(IDName, X, Y, ObjectRect);
  960. end;
  961. procedure TbsActiveSkinObject.MouseEnter;
  962. begin
  963.   FMouseIn := True;
  964.   Active := True;
  965.   if not IsNullRect(ActiveSkinRect) then ReDraw;
  966.   Parent.MouseEnterEvent(IDName);
  967. end;
  968. procedure TbsActiveSkinObject.MouseLeave;
  969. begin
  970.   FMouseIn := False;
  971.   Active := False;
  972.   if not IsNullRect(ActiveSkinRect) then ReDraw;
  973.   Parent.MouseLeaveEvent(IDName);
  974. end;
  975. function TbsActiveSkinObject.CanMorphing;
  976. begin
  977.   Result := (Active and (MorphKf < 1)) or
  978.             (not Active and (MorphKf > 0));
  979. end;
  980. procedure TbsActiveSkinObject.DoMorphing;
  981. begin
  982.   if Active
  983.   then MorphKf := MorphKf + MorphInc
  984.   else MorphKf := MorphKf - MorphInc;
  985.   Parent.DrawSkinObject(Self);
  986. end;
  987. procedure TbsActiveSkinObject.Draw;
  988. procedure CreateObjectImage(B: TBitMap; AActive: Boolean);
  989. begin
  990.   B.Width := RectWidth(ObjectRect);
  991.   B.Height := RectHeight(ObjectRect);
  992.   with B.Canvas do
  993.   begin
  994.     if AActive
  995.     then
  996.       CopyRect(Rect(0, 0, B.Width, B.Height), ActivePicture.Canvas, ActiveSkinRect)
  997.     else
  998.       if SkinRectInApicture
  999.       then
  1000.         CopyRect(Rect(0, 0, B.Width, B.Height), ActivePicture.Canvas, SkinRect)
  1001.       else
  1002.         CopyRect(Rect(0, 0, B.Width, B.Height), Picture.Canvas, SkinRect);
  1003.   end;
  1004. end;
  1005. var
  1006.   PBuffer, APBuffer: TbsEffectBmp;
  1007.   Buffer, ABuffer: TBitMap;
  1008.   ASR, SR: TRect;
  1009. begin
  1010.   ASR := ActiveSkinRect;
  1011.   SR := SkinRect;
  1012.   if Enabled and (not Parent.GetFormActive) and (not IsNullRect(InActiveSkinRect)) 
  1013.   then
  1014.     begin
  1015.       Cnvs.CopyRect(ObjectRect, ActivePicture.Canvas, InActiveSkinRect)
  1016.     end
  1017.   else
  1018.   if not Morphing or
  1019.      ((Active and (MorphKf = 1)) or (not Active and (MorphKf  = 0)))
  1020.   then
  1021.     begin
  1022.       if Active and not IsNullRect(ASR)
  1023.       then
  1024.         Cnvs.CopyRect(ObjectRect, ActivePicture.Canvas, ASR)
  1025.       else
  1026.         if UpDate or SkinRectInApicture
  1027.         then
  1028.           begin
  1029.             if SkinRectInApicture
  1030.             then
  1031.               Cnvs.CopyRect(ObjectRect, ActivePicture.Canvas, SR)
  1032.             else
  1033.               Cnvs.CopyRect(ObjectRect, Picture.Canvas, SR);
  1034.           end;
  1035.     end
  1036.   else
  1037.     begin
  1038.       Buffer := TBitMap.Create;
  1039.       ABuffer := TBitMap.Create;
  1040.       CreateObjectImage(Buffer, False);
  1041.       CreateObjectImage(ABuffer, True);
  1042.       PBuffer := TbsEffectBmp.CreateFromhWnd(Buffer.Handle);
  1043.       APBuffer := TbsEffectBmp.CreateFromhWnd(ABuffer.Handle);
  1044.       case MorphKind of
  1045.         mkDefault: PBuffer.Morph(APBuffer, MorphKf);
  1046.         mkGradient: PBuffer.MorphGrad(APBuffer, MorphKf);
  1047.         mkLeftGradient: PBuffer.MorphLeftGrad(APBuffer, MorphKf);
  1048.         mkRightGradient: PBuffer.MorphRightGrad(APBuffer, MorphKf);
  1049.         mkLeftSlide: PBuffer.MorphLeftSlide(APBuffer, MorphKf);
  1050.         mkRightSlide: PBuffer.MorphRightSlide(APBuffer, MorphKf);
  1051.         mkPush: PBuffer.MorphPush(APBuffer, MorphKf);
  1052.       end;
  1053.       PBuffer.Draw(Cnvs.Handle, ObjectRect.Left, ObjectRect.Top);
  1054.       PBuffer.Free;
  1055.       APBuffer.Free;
  1056.       Buffer.Free;
  1057.       ABuffer.Free;
  1058.     end;
  1059. end;
  1060. procedure TbsActiveSkinObject.SetMorphKf(Value: Double);
  1061. begin
  1062.   FMorphKf := Value;
  1063.   if FMorphKf < 0 then FMorphKf := 0 else
  1064.   if FMorphKf > 1 then FMorphKf := 1;
  1065. end;
  1066. procedure TbsUserObject.Draw;
  1067. begin
  1068.   Parent.PaintEvent(IDName, Cnvs, ObjectRect);
  1069. end;
  1070. //==============TbsSkinAnimateObject==================//
  1071. constructor TbsSkinAnimateObject.Create;
  1072. begin
  1073.   inherited Create(AParent, AData);
  1074.   Increment := True;
  1075.   FFrame := 1;
  1076.   FInc := AnimateTimerInterval;
  1077.   TimerInterval := TbsDataSkinAnimate(AData).TimerInterval;
  1078.   if TimerInterval < FInc then TimerInterval := FInc;
  1079.   with  TbsDataSkinAnimate(AData) do
  1080.   begin
  1081.     Self.CountFrames := CountFrames;
  1082.     Self.Cycle := Cycle;
  1083.     Self.ButtonStyle := ButtonStyle;
  1084.     Self.Command := Command;
  1085.   end;
  1086.   FPopupUp := False;
  1087.   MenuItem := nil;
  1088. end;
  1089. procedure TbsSkinAnimateObject.DoMinToTray;
  1090. begin
  1091.   Parent.MinimizeToTray;
  1092. end;
  1093. procedure TbsSkinAnimateObject.DoMax;
  1094. begin
  1095.   if Parent.WindowState = wsMaximized
  1096.   then Parent.WindowState := wsNormal
  1097.   else Parent.WindowState := wsMaximized;
  1098. end;
  1099. procedure TbsSkinAnimateObject.DoMin;
  1100. begin
  1101.   if Parent.WindowState = wsMinimized
  1102.   then Parent.WindowState := wsNormal
  1103.   else Parent.WindowState := wsMinimized;
  1104. end;
  1105. procedure TbsSkinAnimateObject.DoClose;
  1106. begin
  1107.   Parent.FForm.Close;
  1108. end;
  1109. procedure TbsSkinAnimateObject.DoRollUp;
  1110. begin
  1111.   Parent.RollUpState := not Parent.RollUpState;
  1112. end;
  1113. procedure TbsSkinAnimateObject.DoCommand;
  1114. begin
  1115.   case Command of
  1116.     cmMinimizeToTray: DoMinToTray;
  1117.     cmClose: DoClose;
  1118.     cmMinimize:
  1119.       begin
  1120.         if not Parent.AlwaysMinimizeToTray
  1121.         then
  1122.           DoMin
  1123.         else
  1124.           Parent.MinimizeToTray;  
  1125.       end;
  1126.     cmMaximize: DoMax;
  1127.     cmSysMenu:
  1128.       begin
  1129.         MenuItem := Parent.GetSystemMenu;
  1130.         TrackMenu;
  1131.       end;
  1132.     cmDefault:
  1133.       if MenuItem <> nil then TrackMenu;
  1134.     cmRollUp: DoRollUp;  
  1135.   end;
  1136. end;
  1137. procedure TbsSkinAnimateObject.TrackMenu;
  1138. var
  1139.   R: TRect;
  1140.   Menu: TMenu;
  1141.   P: TPoint;
  1142. begin
  1143.   if MenuItem = nil then Exit;
  1144.   if MenuItem.Count = 0 then Exit;
  1145.   R := ObjectRect;
  1146.   if Parent.FForm.FormStyle = fsMDIChild
  1147.   then
  1148.     begin
  1149.       if Parent.FSkinSupport
  1150.       then
  1151.         P := Point(-Parent.NewClRect.Left, -Parent.NewClRect.Top)
  1152.       else
  1153.         P := Point(- 3, -Parent.GetDefCaptionHeight - 3);
  1154.       P := Parent.FForm.ClientToScreen(P);
  1155.       OffsetRect(R, P.X, P.Y);
  1156.     end
  1157.   else
  1158.     OffsetRect(R, Parent.FForm.Left, Parent.FForm.Top);
  1159.   Menu := MenuItem.GetParentMenu;
  1160.   if Menu is TbsSkinPopupMenu
  1161.   then
  1162.     TbsSkinPopupMenu(Menu).PopupFromRect(R, FPopupUp)
  1163.   else
  1164.     begin
  1165.       Parent.SkinMenuOpen;
  1166.       if Parent.MenusSkinData = nil
  1167.       then
  1168.         Parent.SkinMenu.Popup(nil, Parent.SkinData, 0, R, MenuItem, FPopupUp)
  1169.       else
  1170.         Parent.SkinMenu.Popup(nil, Parent.MenusSkinData, 0, R, MenuItem, FPopupUp);
  1171.     end;
  1172. end;
  1173. procedure TbsSkinAnimateObject.DblCLick;
  1174. begin
  1175.   if Command = cmSysMenu then DoClose;
  1176. end;
  1177. procedure TbsSkinAnimateObject.MouseUp;
  1178. begin
  1179.   inherited;
  1180.   if FMouseIn and ButtonStyle and (Button = mbLeft)
  1181.   then DoCommand;
  1182. end;
  1183. procedure TbsSkinAnimateObject.SetFrame;
  1184. begin
  1185.   if Increment
  1186.   then
  1187.     begin
  1188.       if Value > CountFrames then FFrame := 1 else FFrame := Value;
  1189.     end
  1190.   else
  1191.     begin
  1192.       if Value < 1 then FFrame := CountFrames else FFrame := Value;
  1193.     end;  
  1194.   Parent.DrawSkinObject(Self);
  1195. end;
  1196. procedure TbsSkinAnimateObject.Start;
  1197. begin
  1198.   FInc := AnimateTimerInterval;
  1199.   FFrame := 1;
  1200.   Active := True;
  1201.   if not Parent.AnimateTimer.Enabled
  1202.   then
  1203.     Parent.AnimateTimer.Enabled := True;
  1204. end;
  1205. procedure TbsSkinAnimateObject.Stop;
  1206. begin
  1207.   Frame := 1;
  1208.   Active := False;
  1209.   FInc := AnimateTimerInterval;
  1210. end;
  1211. procedure TbsSkinAnimateObject.ChangeFrame;
  1212. begin
  1213.   if FInc >= TimerInterval
  1214.   then
  1215.     begin
  1216.       if Increment
  1217.       then
  1218.         begin
  1219.           Frame := Frame + 1;
  1220.           if not Cycle and (FFrame = CountFrames) then Active := False;
  1221.         end
  1222.       else
  1223.         begin
  1224.           Frame := Frame - 1;
  1225.           if FFrame = 1 then Active := False;
  1226.         end;
  1227.       FInc := AnimateTimerInterval;
  1228.     end
  1229.   else
  1230.     Inc(FInc, AnimateTimerInterval);
  1231. end;
  1232. procedure TbsSkinAnimateObject.MouseEnter;
  1233. begin
  1234.   FMouseIn := True;
  1235.   if ButtonStyle
  1236.   then
  1237.     begin
  1238.       Active := True;
  1239.       Increment := True;
  1240.       if not Parent.AnimateTimer.Enabled
  1241.       then
  1242.         Parent.AnimateTimer.Enabled := True;
  1243.     end;
  1244.   Parent.MouseEnterEvent(IDName);
  1245. end;
  1246. procedure TbsSkinAnimateObject.MouseLeave;
  1247. begin
  1248.   if not FMouseIn then Exit;
  1249.   FMouseIn := False;
  1250.   if ButtonStyle
  1251.   then
  1252.     begin
  1253.       Active := True;
  1254.       Increment := False;
  1255.       if not Parent.AnimateTimer.Enabled
  1256.       then
  1257.         Parent.AnimateTimer.Enabled := True;
  1258.     end;
  1259.   Parent.MouseLeaveEvent(IDName);
  1260. end;
  1261. procedure TbsSkinAnimateObject.Draw;
  1262. var
  1263.   FW, FH: Integer;
  1264. begin
  1265.   FW := RectWidth(SkinRect);
  1266.   FH := RectHeight(SkinRect);
  1267.   Cnvs.CopyRect(ObjectRect, ActivePicture.Canvas,
  1268.            Rect(ActiveSkinRect.Left + (FFrame - 1) * FW, ActiveSkinRect.Top,
  1269.                 ActiveSkinRect.Left + FFrame * FW,
  1270.                 ActiveSkinRect.Top + FH));
  1271. end;
  1272. //============= TbsSkinButtonObject ============= //
  1273. constructor TbsSkinButtonObject.Create;
  1274. begin
  1275.   inherited Create(AParent, AData);
  1276.   if AData <> nil
  1277.   then 
  1278.   with TbsDataSkinButton(AData) do
  1279.   begin
  1280.     Self.DownRect := DownRect;
  1281.     Self.DisableSkinRect := DisableSkinRect;
  1282.   end;
  1283.   MenuItem := nil;
  1284.   FPopupUp := False;
  1285. end;
  1286. function TbsSkinButtonObject.CanMorphing;
  1287. begin
  1288.   Result := inherited CanMorphing;
  1289.   Result := Result and not ((MenuItem <> nil) and FDown);
  1290. end;
  1291. procedure TbsSkinButtonObject.Draw;
  1292. begin
  1293.   if not Enabled and not IsNullRect(DisableSkinRect)
  1294.   then
  1295.     Cnvs.CopyRect(ObjectRect, ActivePicture.Canvas, DisableSkinRect)
  1296.   else
  1297.   if FDown and not IsNullRect(DownRect) and FMouseIn
  1298.   then
  1299.     Cnvs.CopyRect(ObjectRect, ActivePicture.Canvas, DownRect)
  1300.   else
  1301.     inherited Draw(Cnvs, UpDate);
  1302. end;
  1303. procedure TbsSkinButtonObject.SetDown;
  1304. begin
  1305.   FDown := Value;
  1306.   if Morphing and Active then MorphKf := 1;
  1307.   Parent.DrawSkinObject(Self);
  1308.   if Morphing and not FDown then ReDraw;
  1309. end;
  1310. procedure TbsSkinButtonObject.TrackMenu;
  1311. var
  1312.   R: TRect;
  1313.   Menu: TMenu;
  1314.   P: TPoint;
  1315. begin
  1316.   if MenuItem = nil then Exit;
  1317.   if MenuItem.Count = 0 then Exit;
  1318.   R := ObjectRect;
  1319.   if Parent.FForm.FormStyle = fsMDIChild
  1320.   then
  1321.     begin
  1322.       if Parent.FSkinSupport
  1323.       then
  1324.         P := Point(-Parent.NewClRect.Left, -Parent.NewClRect.Top)
  1325.       else
  1326.         P := Point(- 3, -Parent.GetDefCaptionHeight - 3);
  1327.       P := Parent.FForm.ClientToScreen(P);
  1328.       OffsetRect(R, P.X, P.Y);
  1329.     end
  1330.   else
  1331.     OffsetRect(R, Parent.FForm.Left, Parent.FForm.Top);
  1332.   Menu := MenuItem.GetParentMenu;
  1333.   if Menu is TbsSkinPopupMenu
  1334.   then
  1335.     TbsSkinPopupMenu(Menu).PopupFromRect(R, FPopupUp)
  1336.   else
  1337.     begin
  1338.       Parent.SkinMenuOpen;
  1339.       if Menu is TbsSkinMainMenu
  1340.       then
  1341.         Parent.SkinMenu.Popup(nil, TbsSkinMainMenu(Menu).SkinData, 0, R, MenuItem, FPopupUp)
  1342.       else
  1343.         if Parent.MenusSkinData = nil
  1344.         then
  1345.           Parent.SkinMenu.Popup(nil, Parent.SkinData, 0, R, MenuItem, FPopupUp)
  1346.         else
  1347.           Parent.SkinMenu.Popup(nil, Parent.MenusSkinData, 0, R, MenuItem, FPopupUp);
  1348.     end;
  1349. end;
  1350. procedure TbsSkinButtonObject.MouseDown;
  1351. begin
  1352.   if not Enabled then Exit;
  1353.   if (Button = mbLeft) and not FDown
  1354.   then
  1355.     begin
  1356.       SetDown(True);
  1357.       TrackMenu;
  1358.     end;
  1359.   inherited MouseDown(X, Y, Button);
  1360. end;
  1361. procedure TbsSkinButtonObject.MouseUp;
  1362. begin
  1363.   if not Enabled then Exit;
  1364.   if (Button <> mbLeft)
  1365.   then
  1366.     begin
  1367.       inherited MouseUp(X, Y, Button);
  1368.       Exit;
  1369.     end;
  1370.   if (MenuItem = nil) and FDown
  1371.   then
  1372.     SetDown(False);
  1373.   inherited MouseUp(X, Y, Button);
  1374. end;
  1375. procedure TbsSkinButtonObject.MouseEnter;
  1376. begin
  1377.   FMouseIn := True;
  1378.   Active := True;
  1379.   if IsNullRect(DownRect) or not FDown
  1380.   then
  1381.     begin
  1382.       if not IsNullRect(ActiveSkinRect) then ReDraw;
  1383.     end
  1384.   else                   
  1385.     begin
  1386.       if FDown
  1387.       then
  1388.         begin
  1389.           if Morphing then FMorphKf := 1;
  1390.           Parent.DrawSkinObject(Self)
  1391.         end
  1392.       else
  1393.         if not IsNullRect(ActiveSkinRect) then ReDraw;
  1394.     end;
  1395.   Parent.MouseEnterEvent(IDName);
  1396. end;
  1397. procedure TbsSkinButtonObject.MouseLeave;
  1398. begin
  1399.   FMouseIn := False;
  1400.   Active := False;
  1401.   if (MenuItem = nil) or ((MenuItem <> nil) and not FDown)
  1402.   then
  1403.     begin
  1404.       Parent.DrawSkinObject(Self);
  1405.       Redraw;
  1406.     end;
  1407.   Parent.MouseLeaveEvent(IDName);
  1408. end;
  1409. //============= TbsSkinStdButtonObject =================//
  1410. constructor TbsSkinStdButtonObject.Create;
  1411. begin
  1412.   inherited Create(AParent, AData);
  1413.   if AData <> nil
  1414.   then
  1415.     with TbsDataSkinStdButton(AData) do
  1416.     begin
  1417.       Self.Command := Command;
  1418.       Self.RestoreRect := RestoreRect;
  1419.       Self.RestoreActiveRect := RestoreActiveRect;
  1420.       Self.RestoreInActiveRect := RestoreInActiveRect;
  1421.       Self.RestoreDownRect := RestoreDownRect;
  1422.       FSkinSupport := True;
  1423.     end
  1424.   else
  1425.     FSkinSupport := False;
  1426. end;
  1427. function TbsSkinStdButtonObject.CanMorphing: Boolean;
  1428. begin
  1429.   if (Command = cmSysMenu) and Parent.ShowIcon and
  1430.      (SkinRectInAPicture)
  1431.   then
  1432.     Result := False
  1433.   else
  1434.     Result := inherited CanMorphing;
  1435. end;
  1436. procedure TbsSkinStdButtonObject.DefaultDraw(Cnvs: TCanvas);
  1437. var
  1438.   Buffer: TBitMap;
  1439.   R: TRect;
  1440.   IX, IY: Integer;
  1441.   IC: TColor;
  1442. begin
  1443.   if (Command = cmSysMenu) and Parent.FShowIcon
  1444.   then
  1445.     begin
  1446.       Parent.DrawFormIcon(Cnvs, ObjectRect.Left, ObjectRect.Top);
  1447.       Exit;
  1448.     end;
  1449.   Buffer := TBitMap.Create;
  1450.   Buffer.Width := RectWidth(ObjectRect);
  1451.   Buffer.Height := RectHeight(ObjectRect);
  1452.   R := Rect(0, 0, Buffer.Width, Buffer.Height);
  1453.   with Buffer.Canvas do
  1454.   begin
  1455.     if FDown and FMouseIn
  1456.     then
  1457.       begin
  1458.         Frame3D(Buffer.Canvas, R, BS_XP_BTNFRAMECOLOR, BS_XP_BTNFRAMECOLOR, 1);
  1459.         Brush.Color := BS_XP_BTNDOWNCOLOR;
  1460.         FillRect(R);
  1461.       end
  1462.     else
  1463.       if FMouseIn
  1464.       then
  1465.         begin
  1466.           Frame3D(Buffer.Canvas, R, BS_XP_BTNFRAMECOLOR, BS_XP_BTNFRAMECOLOR, 1);
  1467.           Brush.Color := BS_XP_BTNACTIVECOLOR;
  1468.           FillRect(R);
  1469.         end
  1470.       else
  1471.         begin
  1472.           Brush.Color := clBtnFace;
  1473.           FillRect(R);
  1474.         end;
  1475.   end;
  1476.   IX := Buffer.Width div 2 - 5;
  1477.   IY := Buffer.Height div 2 - 4;
  1478.   if FDown and FMouseIn
  1479.   then
  1480.     begin
  1481.       Inc(IX);
  1482.       Inc(IY);
  1483.     end;
  1484.   if Enabled
  1485.   then
  1486.     IC := clBtnText
  1487.   else
  1488.     IC := clBtnShadow;
  1489.   case Command of
  1490.     cmMinimizeToTray:
  1491.       DrawMTImage(Buffer.Canvas, IX, IY, IC);
  1492.     cmClose:
  1493.       DrawCloseImage(Buffer.Canvas, IX, IY, IC);
  1494.     cmMaximize:
  1495.       if Parent.WindowState = wsMaximized
  1496.       then DrawRestoreImage(Buffer.Canvas, IX, IY, IC)
  1497.       else DrawMaximizeImage(Buffer.Canvas, IX, IY, IC);
  1498.     cmMinimize:
  1499.       if Parent.WindowState = wsMinimized
  1500.       then DrawRestoreImage(Buffer.Canvas, IX, IY, IC)
  1501.       else DrawMinimizeImage(Buffer.Canvas, IX, IY, IC);
  1502.     cmRollUp:
  1503.       if Parent.RollUpState
  1504.       then DrawRestoreRollUpImage(Buffer.Canvas, IX, IY, IC)
  1505.       else DrawRollUpImage(Buffer.Canvas, IX, IY, IC);
  1506.     cmSysMenu:
  1507.       DrawSysMenuImage(Buffer.Canvas, IX, IY, IC);
  1508.   end;
  1509.   Cnvs.Draw(ObjectRect.Left, ObjectRect.Top, Buffer);
  1510.   Buffer.Free;
  1511. end;
  1512. procedure TbsSkinStdButtonObject.Draw;
  1513. procedure CreateRestoreObjectImage(B: TBitMap; AActive: Boolean);
  1514. begin
  1515.   B.Width := RectWidth(ObjectRect);
  1516.   B.Height := RectHeight(ObjectRect);
  1517.   with B.Canvas do
  1518.   begin
  1519.     if AActive
  1520.     then
  1521.       CopyRect(Rect(0, 0, B.Width, B.Height), ActivePicture.Canvas, RestoreActiveRect)
  1522.     else
  1523.       CopyRect(Rect(0, 0, B.Width, B.Height), ActivePicture.Canvas, RestoreRect);
  1524.   end;
  1525. end;
  1526. var
  1527.   PBuffer, APBuffer: TbsEffectBmp;
  1528.   Buffer, ABuffer: TBitMap;
  1529.   ASR, SR: TRect;
  1530.   FRestoreMode: Boolean;
  1531. begin
  1532.   if not FSkinSupport
  1533.   then
  1534.     begin
  1535.       DefaultDraw(Cnvs);
  1536.       Exit;
  1537.     end;
  1538.   if (not Enabled) or
  1539.      (Enabled and (not Parent.GetFormActive) and (not IsNullRect(InActiveSkinRect)))
  1540.   then
  1541.     begin
  1542.       inherited;
  1543.       Exit;
  1544.     end;
  1545.   if (Command = cmSysMenu) and Parent.FShowIcon and SkinRectInAPicture
  1546.   then
  1547.     begin
  1548.       Parent.DrawFormIcon(Cnvs, ObjectRect.Left, ObjectRect.Top);
  1549.       FMorphKf := 0;
  1550.       Exit;
  1551.     end;
  1552.     
  1553.   FRestoreMode := False;
  1554.   case Command of
  1555.     cmMaximize:
  1556.       if Parent.WindowState = wsMaximized
  1557.       then FRestoreMode := True;
  1558.     cmMinimize:
  1559.       if Parent.WindowState = wsMinimized
  1560.       then FRestoreMode := True;
  1561.     cmRollUp:
  1562.       if Parent.RollUpState
  1563.       then FRestoreMode := True;
  1564.   end;
  1565.   if IsNullRect(RestoreRect) or not FRestoreMode
  1566.   then
  1567.     inherited
  1568.   else
  1569.     begin
  1570.       if not Parent.GetFormActive and not IsNullRect(RestoreInActiveRect)
  1571.       then
  1572.         Cnvs.CopyRect(ObjectRect, ActivePicture.Canvas, RestoreInActiveRect)
  1573.       else
  1574.       if FDown and not IsNullRect(RestoreDownRect) and FMouseIn
  1575.       then
  1576.         Cnvs.CopyRect(ObjectRect, ActivePicture.Canvas, RestoreDownRect)
  1577.       else
  1578.         begin
  1579.           ASR := RestoreActiveRect;
  1580.           SR := RestoreRect;
  1581.           if not Morphing or
  1582.           ((Active and (MorphKf = 1)) or (not Active and (MorphKf  = 0)))
  1583.           then
  1584.             begin
  1585.               if Active and not IsNullRect(ASR)
  1586.               then
  1587.                 Cnvs.CopyRect(ObjectRect, ActivePicture.Canvas, ASR)
  1588.               else
  1589.                 Cnvs.CopyRect(ObjectRect, ActivePicture.Canvas, SR);
  1590.             end
  1591.           else
  1592.             begin
  1593.               Buffer := TBitMap.Create;
  1594.               ABuffer := TBitMap.Create;
  1595.               CreateRestoreObjectImage(Buffer, False);
  1596.               CreateRestoreObjectImage(ABuffer, True);
  1597.               PBuffer := TbsEffectBmp.CreateFromhWnd(Buffer.Handle);
  1598.               APBuffer := TbsEffectBmp.CreateFromhWnd(ABuffer.Handle);
  1599.               case MorphKind of
  1600.                 mkDefault: PBuffer.Morph(APBuffer, MorphKf);
  1601.                 mkGradient: PBuffer.MorphGrad(APBuffer, MorphKf);
  1602.                 mkLeftGradient: PBuffer.MorphLeftGrad(APBuffer, MorphKf);
  1603.                 mkRightGradient: PBuffer.MorphRightGrad(APBuffer, MorphKf);
  1604.                 mkLeftSlide: PBuffer.MorphLeftSlide(APBuffer, MorphKf);
  1605.                 mkRightSlide: PBuffer.MorphRightSlide(APBuffer, MorphKf);
  1606.                 mkPush: PBuffer.MorphPush(APBuffer, MorphKf)
  1607.               end;
  1608.               PBuffer.Draw(Cnvs.Handle, ObjectRect.Left, ObjectRect.Top);
  1609.               PBuffer.Free;
  1610.               APBuffer.Free;
  1611.               Buffer.Free;
  1612.               ABuffer.Free;
  1613.             end;
  1614.         end;
  1615.     end;
  1616. end;
  1617. procedure TbsSkinStdButtonObject.DoMinimizeToTray;
  1618. begin
  1619.   Parent.MinimizeToTray;
  1620. end;
  1621. procedure TbsSkinStdButtonObject.DoMax;
  1622. begin
  1623.   if Parent.WindowState = wsMaximized
  1624.   then Parent.WindowState := wsNormal
  1625.   else Parent.WindowState := wsMaximized;
  1626. end;
  1627. procedure TbsSkinStdButtonObject.DoMin;
  1628. begin
  1629.   if Parent.WindowState = wsMinimized
  1630.   then Parent.WindowState := wsNormal
  1631.   else Parent.WindowState := wsMinimized;
  1632. end;
  1633. procedure TbsSkinStdButtonObject.DoClose;
  1634. begin
  1635.   Parent.FForm.Close;
  1636. end;
  1637. procedure TbsSkinStdButtonObject.DoRollUp;
  1638. begin
  1639.   Parent.RollUpState := not Parent.RollUpState;
  1640. end;
  1641. procedure TbsSkinStdButtonObject.DoCommand;
  1642. begin
  1643.   case Command of
  1644.     cmMinimizeToTray: DoMinimizeToTray;
  1645.     cmClose: DoClose;
  1646.     cmMinimize:
  1647.       if Parent.AlwaysMinimizeToTray
  1648.       then
  1649.         Parent.MinimizeToTray
  1650.       else
  1651.         DoMin;
  1652.     cmMaximize: DoMax;
  1653.     cmRollUp: DoRollUp;
  1654.   end;
  1655. end;
  1656. procedure TbsSkinStdButtonObject.DblClick;
  1657. begin
  1658.   if Command = cmSysMenu then DoClose;
  1659. end;
  1660. procedure TbsSkinStdButtonObject.MouseDown;
  1661. begin
  1662.   if not Enabled then Exit;
  1663.   if (Button = mbLeft) and not FDown
  1664.   then
  1665.     begin
  1666.       SetDown(True);
  1667.       if (Command = cmSysMenu)
  1668.       then
  1669.         begin
  1670.           Self.MenuItem := Parent.GetSystemMenu;
  1671.           TrackMenu;
  1672.         end;
  1673.     end;
  1674. end;
  1675. procedure TbsSkinStdButtonObject.MouseUp;
  1676. begin
  1677.   if (Command = cmClose)
  1678.   then
  1679.     begin
  1680.       inherited;
  1681.       if Active and (Button = mbLeft) then DoCommand;
  1682.     end
  1683.   else
  1684.     begin
  1685.       if Active and (Button = mbLeft) then DoCommand;
  1686.       inherited;
  1687.     end;
  1688. end;
  1689. //============= TbsSkinCaptionObject ==================//
  1690. constructor TbsSkinCaptionObject.Create;
  1691. begin
  1692.   inherited Create(AParent, AData);
  1693.   with TbsDataSkinCaption(AData) do
  1694.   begin
  1695.     Self.FontName := FontName;
  1696.     Self.FontStyle := FontStyle;
  1697.     Self.FontHeight := FontHeight;
  1698.     Self.FontColor := FontColor;
  1699.     Self.ActiveFontColor := ActiveFontColor;
  1700.     Self.Alignment := Alignment;
  1701.     Self.TextRct := TextRct;
  1702.     Self.Shadow := Shadow;
  1703.     Self.ShadowColor := ShadowColor;
  1704.     Self.ActiveShadowColor := ActiveShadowColor;
  1705.     Self.FrameRect := FrameRect;
  1706.     Self.ActiveFrameRect := ActiveFrameRect;
  1707.     Self.FrameLeftOffset := FrameLeftOffset; 
  1708.     Self.FrameRightOffset := FrameRightOffset;
  1709.     Self.FrameTextRect := FrameTextRect; 
  1710.   end;
  1711. end;
  1712. procedure TbsSkinCaptionObject.MouseDown;
  1713. begin
  1714.   with Parent do
  1715.   begin
  1716.     MouseDownEvent(IDName, X, Y, ObjectRect, Button);
  1717.   end;
  1718. end;
  1719. procedure TbsSkinCaptionObject.MouseUp;
  1720. begin
  1721.   with Parent do
  1722.   begin
  1723.     MouseUpEvent(IDName, X, Y, ObjectRect, Button);
  1724.   end;
  1725. end;
  1726. procedure TbsSkinCaptionObject.MouseEnter;
  1727. begin
  1728.   FMouseIn := True;
  1729.   Parent.MouseEnterEvent(IDName);
  1730. end;
  1731. procedure TbsSkinCaptionObject.MouseLeave;
  1732. begin
  1733.   FMouseIn := False;
  1734.   Parent.MouseLeaveEvent(IDName);
  1735. end;
  1736. procedure TbsSkinCaptionObject.Draw;
  1737. var
  1738.   Image, ActiveImage: TBitMap;
  1739.   EB1, EB2: TbsEffectBmp;
  1740.   tx, ty: Integer;
  1741.   RealTextRect: TRect;
  1742.   SR, ASR: TRect;
  1743. procedure CnvSetFont(Cnv: TCanvas; FColor: TColor);
  1744. begin
  1745.   with Cnv do
  1746.   begin
  1747.     Font.Name := FontName;
  1748.     Font.Style := FontStyle;
  1749.     Font.Height := FontHeight;
  1750.     Font.Color := FColor;
  1751.     if (Parent.SkinData <> nil) and (Parent.SkinData.ResourceStrData <> nil)
  1752.     then
  1753.       Font.CharSet := Parent.SkinData.ResourceStrData.Charset
  1754.     else
  1755.       Font.CharSet := Parent.DefCaptionFont.Charset;
  1756.   end;
  1757. end;
  1758. function CorrectText(Cnv: TCanvas; var S1: String): String;
  1759. var
  1760.   w: Integer;
  1761.   S: String;
  1762. begin
  1763.   S := S1;
  1764.   w := RectWidth(RealTextRect);
  1765.   Parent.CorrectCaptionText(Cnv, S, w);
  1766.   Result := S;
  1767. end;
  1768. procedure CreateCaptionBitMap(DestB: TBitMap; SourceRect: TRect; SourceB: TBitMap);
  1769. var
  1770.   X, XCnt: Integer;
  1771.   w: Integer;
  1772.   R: TRect;
  1773.   XO, LO, RO: Integer;
  1774. begin
  1775.   LO := SD.LTPoint.X - SR.Left;
  1776.   RO := SR.Right - SD.RTPoint.X;
  1777.   DestB.Width := RectWidth(ObjectRect);
  1778.   DestB.Height := RectHeight(ObjectRect);
  1779.   R := Rect(SourceRect.Left + LO, SourceRect.Top,
  1780.             SourceRect.Right - RO, SourceRect.Bottom);
  1781.   if (LO = 0) and (RO = 0)
  1782.   then
  1783.     DestB.Canvas.CopyRect(Rect(0, 0, DestB.Width, DestB.Height),
  1784.                           SourceB.Canvas, R)
  1785.   else
  1786.     begin
  1787.       w := RectWidth(R);
  1788.       XCnt := DestB.Width div w;
  1789.       for X := 0 to XCnt do
  1790.       begin
  1791.         if X * w + w > DestB.Width
  1792.         then XO := X * w + w - DestB.Width else XO := 0;
  1793.         Dec(R.Right, XO);
  1794.         DestB.Canvas.CopyRect(Rect(X * w, 0, X * w + w - XO, DestB.Height),
  1795.                               SourceB.Canvas, R);
  1796.       end;
  1797.    end;
  1798.   with DestB.Canvas do
  1799.   begin
  1800.     if LO <> 0
  1801.     then
  1802.       CopyRect(Rect(0, 0, LO, DestB.Height),
  1803.                SourceB.Canvas, Rect(SourceRect.Left, SourceRect.Top,
  1804.                                     SourceRect.Left + LO, SourceRect.Bottom));
  1805.     if RO <> 0
  1806.     then
  1807.       CopyRect(Rect(DestB.Width - RO, 0, DestB.Width, DestB.Height),
  1808.                SourceB.Canvas, Rect(SourceRect.Right - RO, SourceRect.Top,
  1809.                                     SourceRect.Right, SourceRect.Bottom));
  1810.   end;
  1811. end;
  1812. procedure CalcTextCoord(tw, th: Integer);
  1813. var
  1814.   w, h: Integer;
  1815. begin
  1816.   w := RectWidth(RealTextRect);
  1817.   h := RectHeight(RealTextRect);
  1818.   ty := h div 2 - th div 2 + RealTextRect.Top;
  1819.   case Alignment of
  1820.     taLeftJustify: tx := RealTextRect.Left;
  1821.     taRightJustify: tx := RealTextRect.Right - tw;
  1822.     taCenter: tx := w div 2 - tw div 2 + RealTextRect.Left;
  1823.   end;
  1824. end;
  1825. procedure DrawCaptionText(Cnv: TCanvas; OX, OY: Integer; AActive: Boolean);
  1826. var
  1827.   S1: String;
  1828.   C: TColor;
  1829.   F: TForm;
  1830.   B: TBitMap;
  1831.   FR: TRect;
  1832. begin
  1833.   S1 := Parent.FForm.Caption;
  1834.   if (Parent.FForm.FormStyle = fsMDIForm) and Parent.IsMDIChildMaximized
  1835.   then
  1836.     begin
  1837.       F := Parent.GetMaximizeMDIChild;
  1838.       if F <> nil then S1 := S1 + ' - [' + F.Caption + ']';
  1839.     end;
  1840.   if (S1 = '') or IsNullRect(TextRct) then Exit;
  1841.   S1 := CorrectText(Cnv, S1);
  1842.   with Cnv do
  1843.   begin
  1844.     CalcTextCoord(TextWidth(S1), TextHeight(S1));
  1845.     tx := tx + OX;
  1846.     ty := ty + OY;
  1847.     Brush.Style := bsClear;
  1848.     if not IsNullRect(Self.FrameRect)
  1849.     then
  1850.       begin
  1851.         B := TBitMap.Create;
  1852.         if (AActive) and not IsNullRect(ActiveFrameRect)
  1853.         then FR := ActiveFrameRect
  1854.         else FR := Self.FrameRect;
  1855.         CreateHSkinImage(FrameLeftOffset, FrameRightOffset, B, ActivePicture, FR,
  1856.         TextWidth(S1) + RectWidth(Self.FrameRect) - RectWidth(FrameTextRect),
  1857.         RectHeight(Self.FrameRect));
  1858.         Draw(TX - FrameTextRect.Left, TY - FrameTextRect.Top, B);
  1859.         B.Free;
  1860.       end;
  1861.     if Shadow
  1862.     then
  1863.       begin
  1864.         if (Parent.SkinData <> nil) and (Parent.SkinData.ResourceStrData <> nil)
  1865.         then
  1866.           Font.CharSet := Parent.SkinData.ResourceStrData.Charset
  1867.         else
  1868.           Font.Charset := Parent.FDefCaptionFont.Charset;
  1869.         C := Font.Color;
  1870.         if AActive
  1871.         then Font.Color := ActiveShadowColor
  1872.         else Font.Color := ShadowColor;
  1873.         TextOut(tx + 1, ty + 1, S1);
  1874.         Font.Color := C;
  1875.       end;
  1876.     TextOut(tx, ty, S1);
  1877.   end;
  1878. end;
  1879. var
  1880.   TextO: Integer;
  1881. begin
  1882.   SR := SkinRect;
  1883.   ASR := ActiveSkinRect;
  1884.   RealTextRect := TextRct;
  1885.   if not IsNullRect(TextRct)
  1886.   then
  1887.     begin
  1888.       TextO := RectWidth(SkinRect) - TextRct.Right;
  1889.       RealTextRect.Right := RectWidth(ObjectRect) - TextO;
  1890.     end;
  1891.   if not IsNullRect(FrameRect)
  1892.   then
  1893.     begin
  1894.       Inc(RealTextRect.Top, FrameTextRect.Top);
  1895.       Inc(RealTextRect.Left, FrameTextRect.Left);
  1896.       Dec(RealTextRect.Right, RectWidth(FrameRect) - FrameTextRect.Right);
  1897.     end;
  1898.   if Active
  1899.   then CnvSetFont(Cnvs, ActiveFontColor)
  1900.   else CnvSetFont(Cnvs, FontColor);
  1901.   if (((MorphKf > 0) and not Active) or ((MorphKf < 1) and Active)) and Morphing
  1902.   then
  1903.     begin
  1904.       Image := TBitMap.Create;
  1905.       CreateCaptionBitMap(Image, SR, Picture);
  1906.       CnvSetFont(Image.Canvas, FontColor);
  1907.       DrawCaptionText(Image.Canvas, 0, 0, False);
  1908.       ActiveImage := TBitMap.Create;
  1909.       CreateCaptionBitMap(ActiveImage, ASR, ActivePicture);
  1910.       CnvSetFont(ActiveImage.Canvas, ActiveFontColor);
  1911.       DrawCaptionText(ActiveImage.Canvas, 0, 0, True);
  1912.       EB1 := TbsEffectBmp.CreateFromhWnd(Image.Handle);
  1913.       EB2 := TbsEffectBmp.CreateFromhWnd(ActiveImage.Handle);
  1914.       case MorphKind of
  1915.         mkDefault: EB1.Morph(EB2, MorphKf);
  1916.         mkGradient: EB1.MorphGrad(EB2, MorphKf);
  1917.         mkLeftGradient: EB1.MorphLeftGrad(EB2, MorphKf);
  1918.         mkRightGradient: EB1.MorphRightGrad(EB2, MorphKf);
  1919.         mkLeftSlide: EB1.MorphLeftSlide(EB2, MorphKf);
  1920.         mkRightSlide: EB1.MorphRightSlide(EB2, MorphKf);
  1921.         mkPush: EB1.MorphPush(EB2, MorphKf)
  1922.       end;
  1923.       if Parent.GetAutoRenderingInActiveImage and not Active
  1924.       then
  1925.         case Parent.FSD.InActiveEffect of
  1926.           ieBrightness:
  1927.             EB1.ChangeBrightness(InActiveBrightnessKf);
  1928.           ieDarkness:
  1929.             EB1.ChangeDarkness(InActiveDarknessKf);
  1930.           ieGrayScale:
  1931.             EB1.GrayScale;
  1932.           ieNoise:
  1933.             EB1.AddMonoNoise(InActiveNoiseAmount);
  1934.           ieSplitBlur:
  1935.             EB1.SplitBlur(1);
  1936.           ieInvert:
  1937.             EB1.Invert;
  1938.         end;
  1939.       EB1.Draw(Cnvs.Handle, ObjectRect.Left, ObjectRect.Top);
  1940.       EB1.Free;
  1941.       EB2.Free;
  1942.       Image.Free;
  1943.       ActiveImage.Free;
  1944.     end
  1945.   else
  1946.   if IsNullRect(ASR) or (not IsNullRect(ASR) and not Active) and not Morphing
  1947.   then
  1948.     DrawCaptionText(Cnvs, ObjectRect.Left, ObjectRect.Top, Active)
  1949.   else
  1950.   if not Active and Morphing
  1951.   then
  1952.     begin
  1953.       Image := TBitMap.Create;
  1954.       CreateCaptionBitMap(Image, SR, Picture);
  1955.       CnvSetFont(Image.Canvas, FontColor);
  1956.       DrawCaptionText(Image.Canvas, 0, 0, False);
  1957.       if Parent.GetAutoRenderingInActiveImage
  1958.       then
  1959.         begin
  1960.           EB1 := TbsEffectBmp.CreateFromhWnd(Image.Handle);
  1961.           case Parent.FSD.InActiveEffect of
  1962.             ieBrightness:
  1963.               EB1.ChangeBrightness(InActiveBrightnessKf);
  1964.             ieDarkness:
  1965.               EB1.ChangeDarkness(InActiveDarknessKf);
  1966.             ieGrayScale:
  1967.               EB1.GrayScale;
  1968.             ieNoise:
  1969.               EB1.AddMonoNoise(InActiveNoiseAmount);
  1970.             ieSplitBlur:
  1971.               EB1.SplitBlur(1);
  1972.             ieInvert:
  1973.               EB1.Invert;
  1974.           end;
  1975.           EB1.Draw(Cnvs.Handle, ObjectRect.Left, ObjectRect.Top);
  1976.           EB1.Free;
  1977.         end
  1978.       else
  1979.         Cnvs.Draw(ObjectRect.Left, ObjectRect.Top, Image);
  1980.       Image.Free;
  1981.     end
  1982.   else
  1983.   if Active
  1984.   then
  1985.     begin
  1986.       Image := TBitMap.Create;
  1987.       CreateCaptionBitMap(Image, ASR, ActivePicture);
  1988.       CnvSetFont(Image.Canvas, ActiveFontColor);
  1989.       DrawCaptionText(Image.Canvas, 0, 0, True);
  1990.       Cnvs.Draw(ObjectRect.Left, ObjectRect.Top, Image);
  1991.       Image.Free;
  1992.     end;
  1993. end;
  1994. //============= TbsSkinMainMenu =============//
  1995. constructor TbsSkinMainMenu.Create;
  1996. begin
  1997.   inherited Create(AOwner);
  1998.   BSF := nil;
  1999.   FSD := nil;
  2000. end;
  2001. procedure TbsSkinMainMenu.Notification;
  2002. begin
  2003.   inherited Notification(AComponent, Operation);
  2004.   if (Operation = opRemove) and (AComponent = FSD) then FSD := nil;
  2005. end;
  2006. // =========== TbsSkinMainMenuBar ==========//
  2007. constructor TbsMenuBarObject.Create;
  2008. begin
  2009.   Parent := AParent;
  2010.   Enabled := True;
  2011.   Visible := True;
  2012.   FMorphKf := 0;
  2013.   FDown := False;
  2014.   Morphing := False;
  2015.   Picture := nil;
  2016.   if AData <> nil then
  2017.   with AData do
  2018.   begin
  2019.     Self.IDName := IDName;
  2020.     Self.SkinRect := SkinRect;
  2021.     Self.ActiveSkinRect := ActiveSkinRect;
  2022.     Self.DownRect := ActiveSkinRect;
  2023.     Self.Morphing := Morphing;
  2024.     Self.MorphKind := MorphKind;
  2025.     ObjectRect := SkinRect;
  2026.     if (ActivePictureIndex <> - 1) and
  2027.        (ActivePictureIndex < Parent.SkinData.FActivePictures.Count)
  2028.     then
  2029.       Picture := TBitMap(Parent.SkinData.FActivePictures.Items[ActivePictureIndex]);
  2030.     if Morphing and IsNullRect(ActiveSkinRect) then Morphing := False;  
  2031.   end;
  2032. end;
  2033. procedure TbsMenuBarObject.DblClick;
  2034. begin
  2035. end;
  2036. procedure TbsMenuBarObject.ReDraw;
  2037. begin
  2038.   if Morphing
  2039.   then Parent.MorphTimer.Enabled := True
  2040.   else Parent.DrawSkinObject(Self);
  2041. end;
  2042. procedure TbsMenuBarObject.MouseDown(X, Y: Integer; Button: TMouseButton);
  2043. begin
  2044. end;
  2045. procedure TbsMenuBarObject.MouseUp(X, Y: Integer; Button: TMouseButton);
  2046. begin
  2047. end;
  2048. procedure TbsMenuBarObject.MouseEnter;
  2049. begin
  2050.   FMouseIn := True;
  2051.   Active := True;
  2052.   ReDraw;
  2053. end;
  2054. procedure TbsMenuBarObject.MouseLeave;
  2055. begin
  2056.   FMouseIn := False;
  2057.   Active := False;
  2058.   ReDraw;
  2059. end;
  2060. function TbsMenuBarObject.CanMorphing;
  2061. begin
  2062.   Result := not (FDown and not IsNullRect(DownRect)) and
  2063.                 ((Active and (MorphKf < 1)) or
  2064.                 (not Active and (MorphKf > 0)));
  2065. end;
  2066. procedure TbsMenuBarObject.DoMorphing;
  2067. begin
  2068.   if Active
  2069.   then MorphKf := MorphKf + MorphInc
  2070.   else MorphKf := MorphKf - MorphInc;
  2071.   Draw(Parent.Canvas);
  2072. end;
  2073. procedure TbsMenuBarObject.Draw;
  2074. begin
  2075. end;
  2076. procedure TbsMenuBarObject.SetMorphKf(Value: Double);
  2077. begin
  2078.   FMorphKf := Value;
  2079.   if FMorphKf < 0 then FMorphKf := 0 else
  2080.   if FMorphKf > 1 then FMorphKf := 1;
  2081. end;
  2082. // ============== TbsSkinMainMenuBarButton ================ //
  2083. constructor TbsSkinMainMenuBarButton.Create;
  2084. begin
  2085.   inherited Create(AParent, AData);
  2086.   if AData <> nil
  2087.   then
  2088.     with TbsDataSkinMainMenuBarButton(AData) do
  2089.     begin
  2090.       Self.Command := Command;
  2091.       Self.DownRect := DownRect;
  2092.       FSkinSupport := True;
  2093.     end
  2094.   else
  2095.     FSkinSupport := False;
  2096. end;
  2097. procedure TbsSkinMainMenuBarButton.DefaultDraw(Cnvs: TCanvas);
  2098. var
  2099.   Buffer: TBitMap;
  2100.   R: TRect;
  2101.   IX, IY: Integer;
  2102.   IC: TColor;
  2103. begin
  2104.   Buffer := TBitMap.Create;
  2105.   Buffer.Width := RectWidth(ObjectRect);
  2106.   Buffer.Height := RectHeight(ObjectRect);
  2107.   R := Rect(0, 0, Buffer.Width, Buffer.Height);
  2108.   with Buffer.Canvas do
  2109.   begin
  2110.     if FDown and FMouseIn
  2111.     then
  2112.       begin
  2113.         Frame3D(Buffer.Canvas, R, BS_XP_BTNFRAMECOLOR, BS_XP_BTNFRAMECOLOR, 1);
  2114.         Brush.Color := BS_XP_BTNDOWNCOLOR;
  2115.         FillRect(R);
  2116.       end
  2117.     else
  2118.       if FMouseIn
  2119.       then
  2120.         begin
  2121.           Frame3D(Buffer.Canvas, R, BS_XP_BTNFRAMECOLOR, BS_XP_BTNFRAMECOLOR, 1);
  2122.           Brush.Color := BS_XP_BTNACTIVECOLOR;
  2123.           FillRect(R);
  2124.         end
  2125.       else
  2126.         begin
  2127.           Brush.Color := clBtnFace;
  2128.           FillRect(R);
  2129.         end;
  2130.   end;
  2131.   IX := Buffer.Width div 2 - 5;
  2132.   IY := Buffer.Height div 2 - 4;
  2133.   if FDown and FMouseIn
  2134.   then
  2135.     begin
  2136.       Inc(IX);
  2137.       Inc(IY);
  2138.     end;
  2139.   if Enabled then IC := clBtnText else IC := clBtnShadow;
  2140.   case Command of
  2141.     cmClose: DrawCloseImage(Buffer.Canvas, IX, IY, IC);
  2142.     cmMaximize: DrawRestoreImage(Buffer.Canvas, IX, IY, IC);
  2143.     cmMinimize: DrawMinimizeImage(Buffer.Canvas, IX, IY, IC);
  2144.     cmSysMenu: DrawSysMenuImage(Buffer.Canvas, IX, IY, IC);
  2145.   end;
  2146.   Cnvs.Draw(ObjectRect.Left, ObjectRect.Top, Buffer);
  2147.   Buffer.Free;
  2148. end;
  2149. procedure TbsSkinMainMenuBarButton.MouseEnter;
  2150. begin
  2151.   if (Command = cmSysMenu) and FDown
  2152.   then
  2153.     begin
  2154.       FMouseIn := True;
  2155.       Active := True;
  2156.     end
  2157.   else
  2158.     inherited;
  2159. end;
  2160. procedure TbsSkinMainMenuBarButton.MouseLeave;
  2161. begin
  2162.   if (Command = cmSysMenu) and FDown
  2163.   then
  2164.     begin
  2165.       if Morphing then FMorphKf := 1;
  2166.       Active := False;
  2167.       FMouseIn := False;
  2168.     end
  2169.   else
  2170.     inherited;
  2171. end;
  2172. procedure TbsSkinMainMenuBarButton.Draw;
  2173. procedure CreateObjectImage(B: TBitMap; AActive: Boolean);
  2174. begin
  2175.   B.Width := RectWidth(ObjectRect);
  2176.   B.Height := RectHeight(ObjectRect);
  2177.   with B.Canvas do
  2178.   begin
  2179.     if AActive
  2180.     then
  2181.       CopyRect(Rect(0, 0, B.Width, B.Height), Picture.Canvas, ActiveSkinRect)
  2182.     else
  2183.       CopyRect(Rect(0, 0, B.Width, B.Height), Picture.Canvas, SkinRect);
  2184.   end;
  2185. end;
  2186. var
  2187.   PBuffer, APBuffer: TbsEffectBmp;
  2188.   Buffer, ABuffer: TBitMap;
  2189.   ASR, SR: TRect;
  2190. begin
  2191.   if not FSkinSupport or (Picture = nil)
  2192.   then
  2193.     begin
  2194.       DefaultDraw(Cnvs);
  2195.       Exit;
  2196.     end;  
  2197.   if (FDown and not IsNullRect(DownRect)) and FMouseIn
  2198.   then
  2199.     Cnvs.CopyRect(ObjectRect, Picture.Canvas, DownRect)
  2200.   else
  2201.     begin
  2202.       ASR := ActiveSkinRect;
  2203.       SR := SkinRect;
  2204.       if not Morphing or
  2205.         ((Active and (MorphKf = 1)) or (not Active and (MorphKf  = 0)))
  2206.       then
  2207.         begin
  2208.           if Active and not IsNullRect(ASR)
  2209.           then
  2210.             Cnvs.CopyRect(ObjectRect, Picture.Canvas, ASR)
  2211.           else
  2212.             Cnvs.CopyRect(ObjectRect, Picture.Canvas, SR);
  2213.         end
  2214.       else
  2215.         begin
  2216.           Buffer := TBitMap.Create;
  2217.           ABuffer := TBitMap.Create;
  2218.           CreateObjectImage(Buffer, False);
  2219.           CreateObjectImage(ABuffer, True);
  2220.           PBuffer := TbsEffectBmp.CreateFromhWnd(Buffer.Handle);
  2221.           APBuffer := TbsEffectBmp.CreateFromhWnd(ABuffer.Handle);
  2222.           case MorphKind of
  2223.             mkDefault: PBuffer.Morph(APBuffer, MorphKf);
  2224.             mkGradient: PBuffer.MorphGrad(APBuffer, MorphKf);
  2225.             mkLeftGradient: PBuffer.MorphLeftGrad(APBuffer, MorphKf);
  2226.             mkRightGradient: PBuffer.MorphRightGrad(APBuffer, MorphKf);
  2227.             mkLeftSlide: PBuffer.MorphLeftSlide(APBuffer, MorphKf);
  2228.             mkRightSlide: PBuffer.MorphRightSlide(APBuffer, MorphKf);
  2229.             mkPush: PBuffer.MorphPush(APBuffer, MorphKf);
  2230.           end;
  2231.           PBuffer.Draw(Cnvs.Handle, ObjectRect.Left, ObjectRect.Top);
  2232.           PBuffer.Free;
  2233.           APBuffer.Free;
  2234.           Buffer.Free;
  2235.           ABuffer.Free;
  2236.         end;
  2237.     end;
  2238. end;
  2239. procedure TbsSkinMainMenuBarButton.DblClick;
  2240. var
  2241.   DS: TbsBusinessSkinForm;
  2242. begin
  2243.   DS := GetMDIChildBusinessSkinFormComponent;
  2244.   if (DS <> nil) and (Command = cmSysMenu)
  2245.   then
  2246.     begin
  2247.       Parent.BSF.SkinMenu.Hide;
  2248.       Parent.BSF.SkinMenuClose;
  2249.       DS.FForm.Close;
  2250.     end;  
  2251. end;
  2252. procedure TbsSkinMainMenuBarButton.DoCommand;
  2253. var
  2254.   DS: TbsBusinessSkinForm;
  2255.   MI: TMenuItem;
  2256.   R: TRect;
  2257.   P: TPoint;
  2258. begin
  2259.   DS := GetMDIChildBusinessSkinFormComponent;
  2260.   if DS <> nil
  2261.   then
  2262.     case Command of
  2263.       cmClose: DS.FForm.Close;
  2264.       cmMinimize: DS.WindowState := wsMinimized;
  2265.       cmMaximize: DS.WindowState := wsNormal;
  2266.       cmSysMenu:
  2267.         begin
  2268.           Parent.Repaint;
  2269.           P := Point(ObjectRect.Left, ObjectRect.Top);
  2270.           P := Parent.ClientToScreen(P);
  2271.           R := Rect(P.X, P.Y, P.X + RectWidth(ObjectRect), P.Y + RectHeight(ObjectRect));
  2272.           MI := DS.GetSystemMenu;
  2273.           Parent.BSF.SkinMenuOpen;
  2274.           if Parent.BSF.MenusSkinData = nil
  2275.           then
  2276.             Parent.BSF.SkinMenu.Popup(Parent, Parent.BSF.SkinData, 0, R, MI, Parent.PopupToUp)
  2277.           else
  2278.             Parent.BSF.SkinMenu.Popup(Parent, Parent.BSF.MenusSkinData, 0, R, MI, Parent.PopupToUp);
  2279.         end;
  2280.    end;
  2281. end;
  2282. procedure TbsSkinMainMenuBarButton.MouseDown;
  2283. begin
  2284.   if not Enabled then Exit;
  2285.   if (Button <> mbLeft)
  2286.   then
  2287.     begin
  2288.       inherited MouseDown(X, Y, Button);
  2289.       Exit;
  2290.     end;
  2291.   if not FDown
  2292.   then
  2293.     begin
  2294.       FDown := True;
  2295.       if Morphing and not IsNullRect(DownRect) then MorphKf := 1;
  2296.       Parent.DrawSkinObject(Self);
  2297.       if Command = cmSysMenu then DoCommand;
  2298.     end;
  2299. end;
  2300. procedure TbsSkinMainMenuBarButton.MouseUp;
  2301. begin
  2302.   if not Enabled then Exit;
  2303.   if (Button <> mbLeft)
  2304.   then
  2305.     begin
  2306.       inherited MouseUp(X, Y, Button);
  2307.       Exit;
  2308.     end;
  2309.   inherited MouseUp(X, Y, Button);
  2310.   if (Command <> cmSysMenu)
  2311.   then
  2312.     begin
  2313.       FDown := False;
  2314.       ReDraw;
  2315.     end;
  2316.   if Active and (Command <> cmSysMenu)
  2317.   then DoCommand;
  2318. end;
  2319. // ==============TspSkinMainMenuBar =============//
  2320. constructor TbsSkinMainMenuBarItem.Create;
  2321. begin
  2322.   inherited Create(AParent, AData);
  2323.   if AData <> nil
  2324.   then
  2325.     begin
  2326.       FSkinSupport := True;
  2327.       with TbsDataSkinMainMenuBarItem(AData) do
  2328.       begin
  2329.         Self.FontName := FontName;
  2330.         Self.FontHeight := FontHeight;
  2331.         Self.FontStyle := FontStyle;
  2332.         Self.FontColor := FontColor;
  2333.         Self.ActiveFontColor := ActiveFontColor;
  2334.         Self.DownFontColor := DownFontColor;
  2335.         Self.TextRct := TextRct;
  2336.         Self.DownRect := DownRect;
  2337.         Self.LO := ItemLO;
  2338.         Self.RO := ItemRO;
  2339.         Self.UnEnabledFontColor := UnEnabledFontColor;
  2340.       end;
  2341.       if IsNullRect(DownRect) then
  2342.       if IsNullRect(ActiveSkinRect)
  2343.       then DownRect := SkinRect else DownRect := ActiveSkinRect;
  2344.       if IsNullRect(ActiveSkinRect) then Morphing := False;
  2345.     end
  2346.   else
  2347.     FSkinSupport := False;
  2348.   OldEnabled := Enabled;
  2349.   Visible := True;
  2350. end;
  2351. procedure TbsSkinMainMenuBarItem.SearchActive;
  2352. var
  2353.   i: Integer;
  2354. begin
  2355.   for i := 0 to Parent.ObjectList.Count - 1 do
  2356.    if (TbsMenuBarObject(Parent.ObjectList.Items[i]) is TbsSkinMainMenuBarItem)
  2357.       and (TbsSkinMainMenuBarItem(Parent.ObjectList.Items[i]).IDName <> IDName)
  2358.       and (TbsSkinMainMenuBarItem(Parent.ObjectList.Items[i]).Active)
  2359.    then
  2360.      begin
  2361.        TbsSkinMainMenuBarItem(Parent.ObjectList.Items[i]).MouseLeave;
  2362.        Break;
  2363.      end;
  2364. end;
  2365. function TbsSkinMainMenuBarItem.SearchDown;
  2366. var
  2367.   i: Integer;
  2368. begin
  2369.   Result := False;
  2370.   for i := 0 to Parent.ObjectList.Count - 1 do
  2371.    if (TbsMenuBarObject(Parent.ObjectList.Items[i]) is TbsSkinMainMenuBarItem)
  2372.       and (TbsSkinMainMenuBarItem(Parent.ObjectList.Items[i]).IDName <> IDName)
  2373.       and (TbsSkinMainMenuBarItem(Parent.ObjectList.Items[i]).FDown)
  2374.    then
  2375.      begin
  2376.        TbsSkinMainMenuBarItem(Parent.ObjectList.Items[i]).SetDown(False);
  2377.        Result := True;
  2378.        Break;
  2379.      end;
  2380. end;
  2381. procedure TbsSkinMainMenuBarItem.DefaultDraw;
  2382. function CalcObjectRect(Cnvs: TCanvas): TRect;
  2383. var
  2384.   w, i, j: Integer;
  2385.   R, TR: TRect;
  2386. begin
  2387.   w := 2;
  2388.   Cnvs.Font.Assign(Parent.DefItemFont);
  2389.   if (Parent.SkinData <> nil) and (Parent.SkinData.ResourceStrData <> nil)
  2390.   then
  2391.     Cnvs.Font.CharSet := Parent.SkinData.ResourceStrData.CharSet;
  2392.   TR := Rect(0, 0, 0, 0);
  2393.   DrawText(Cnvs.Handle, PChar(MenuItem.Caption),
  2394.     Length(MenuItem.Caption), TR, DT_CALCRECT or DT_CENTER);
  2395.   w := w + RectWidth(TR) + 10;
  2396.   R := Rect(0, 0, 0, 0);
  2397.   j := Parent.ObjectList.IndexOf(Self);
  2398.   for i := j - 1  downto 0 do
  2399.     if TbsMenuBarObject(Parent.ObjectList.Items[i]) is TbsSkinMainMenuBarItem
  2400.     then
  2401.       begin
  2402.         R.Left := TbsMenuBarObject(Parent.ObjectList.Items[i]).ObjectRect.Right;
  2403.         Break;
  2404.       end;
  2405.   if R.Left = 0 then R.Left := Parent.NewItemsRect.Left;
  2406.   R.Top := Parent.NewItemsRect.Top;
  2407.   R.Right := R.Left + w;
  2408.   R.Bottom := Parent.NewItemsRect.Bottom;
  2409.   Result := R;
  2410. end;
  2411. var
  2412.   Buffer: TBitMap;
  2413.   R, R1: TRect;
  2414.   TMO: Integer;
  2415. begin
  2416.   Buffer := TBitMap.Create;
  2417.   ObjectRect := CalcObjectRect(Buffer.Canvas);
  2418.   if Parent.ScrollMenu
  2419.   then
  2420.     TMO := TRACKMARKEROFFSET
  2421.   else
  2422.     TMO := 0;
  2423.   if ObjectRect.Right > Parent.NewItemsRect.Right - TMO
  2424.   then
  2425.     begin
  2426.       Parent.Scroll := True;
  2427.       if Visible
  2428.       then
  2429.         begin
  2430.           OldEnabled := Enabled;
  2431.           Enabled := False;
  2432.           Visible := False;
  2433.         end;
  2434.       Buffer.Free;
  2435.       Exit;
  2436.     end
  2437.   else
  2438.     if not Visible
  2439.     then
  2440.       begin
  2441.         Visible := True;
  2442.         Enabled := OldEnabled;
  2443.       end;
  2444.   Buffer.Width := RectWidth(ObjectRect);
  2445.   Buffer.Height := RectHeight(ObjectRect);
  2446.   R := Rect(0, 0, Buffer.Width, Buffer.Height);
  2447.   with Buffer.Canvas do
  2448.   begin
  2449.     if FDown
  2450.     then
  2451.       begin
  2452.         Frame3D(Buffer.Canvas, R, BS_XP_BTNFRAMECOLOR, BS_XP_BTNFRAMECOLOR, 1);
  2453.         Brush.Color := BS_XP_BTNDOWNCOLOR;
  2454.         FillRect(R);
  2455.       end
  2456.     else
  2457.       if FMouseIn
  2458.       then
  2459.         begin
  2460.           Frame3D(Buffer.Canvas, R, BS_XP_BTNFRAMECOLOR, BS_XP_BTNFRAMECOLOR, 1);
  2461.           Brush.Color := BS_XP_BTNACTIVECOLOR;
  2462.           FillRect(R);
  2463.         end
  2464.       else
  2465.         begin
  2466.           Brush.Color := clBtnFace;
  2467.           FillRect(R);
  2468.         end;
  2469.   end;
  2470.   //
  2471.   R1 := Rect(0, 0, 0, 0);
  2472.   Buffer.Canvas.Font.Assign(Parent.DefItemFont);
  2473.   if (Parent.SkinData <> nil) and (Parent.SkinData.ResourceStrData <> nil)
  2474.   then
  2475.     Buffer.Canvas.Font.CharSet := Parent.SkinData.ResourceStrData.CharSet;
  2476.   DrawText(Buffer.Canvas.Handle, PChar(MenuItem.Caption),
  2477.      Length(MenuItem.Caption), R1, DT_CALCRECT);
  2478.   R.Top := R.Top + RectHeight(R) div 2 - R1.Bottom div 2;
  2479.   R.Bottom := R.Top + R1.Bottom;
  2480.   if FDown
  2481.   then
  2482.     begin
  2483.       Inc(R.Left);
  2484.       Inc(R.Top);
  2485.     end;  
  2486.   DrawText(Buffer.Canvas.Handle, PChar(MenuItem.Caption),
  2487.     Length(MenuItem.Caption), R, DT_CENTER or DT_VCENTER);
  2488.   Cnvs.Draw(ObjectRect.Left, ObjectRect.Top, Buffer);
  2489.   Buffer.Free;
  2490. end;
  2491. procedure TbsSkinMainMenuBarItem.Draw;
  2492. function CalcObjectRect(Cnvs: TCanvas): TRect;
  2493. var
  2494.   w, i, j: Integer;
  2495.   R, TR: TRect;
  2496. begin
  2497.   w := TextRct.Left + RectWidth(SkinRect) - TextRct.Right;
  2498.   if Parent.FUseSkinFont
  2499.   then
  2500.     with Cnvs do
  2501.     begin
  2502.       Font.Name := FontName;
  2503.       Font.Style := FontStyle;
  2504.       Font.Height := FontHeight;
  2505.     end
  2506.   else
  2507.     Cnvs.Font.Assign(Parent.DefItemFont);
  2508.   if (Parent.SkinData <> nil) and (Parent.SkinData.ResourceStrData <> nil)
  2509.   then
  2510.     Cnvs.Font.CharSet := Parent.SkinData.ResourceStrData.Charset
  2511.   else
  2512.     Cnvs.Font.CharSet := Parent.DefItemFont.Charset;
  2513.   TR := Rect(0, 0, 0, 0);
  2514.   DrawText(Cnvs.Handle, PChar(MenuItem.Caption),
  2515.     Length(MenuItem.Caption), TR, DT_CALCRECT or DT_CENTER);
  2516.   w := w + RectWidth(TR) + 2;
  2517.   R := Rect(0, 0, 0, 0);
  2518.   j := Parent.ObjectList.IndexOf(Self);
  2519.   for i := j - 1  downto 0 do
  2520.     if TbsMenuBarObject(Parent.ObjectList.Items[i]) is TbsSkinMainMenuBarItem
  2521.     then
  2522.       begin
  2523.         R.Left := TbsMenuBarObject(Parent.ObjectList.Items[i]).ObjectRect.Right;
  2524.         Break;
  2525.       end;
  2526.   if R.Left = 0 then R.Left := Parent.NewItemsRect.Left;
  2527.   R.Top := Parent.NewItemsRect.Top;
  2528.   R.Right := R.Left + w;
  2529.   R.Bottom := R.Top + RectHeight(SkinRect);
  2530.   Result := R;
  2531. end;
  2532. procedure CreateItemImage(B: TBitMap; Rct: TRect; AActive: Boolean);
  2533. var
  2534.   XO, w, XCnt: Integer;
  2535.   TR: TRect;
  2536.   X: Integer;
  2537. begin
  2538.   if Picture = nil then Exit;
  2539.   B.Width := RectWidth(ObjectRect);
  2540.   B.Height := RectHeight(ObjectRect);
  2541.   with B.Canvas do
  2542.   begin
  2543.     if LO <> 0 then
  2544.        CopyRect(Rect(0, 0, LO, B.Height), Picture.Canvas,
  2545.                 Rect(Rct.Left, Rct.Top, Rct.Left + LO, Rct.Bottom));
  2546.     if RO <> 0 then
  2547.        CopyRect(Rect(B.Width - RO, 0, B.Width, B.Height),
  2548.                 Picture.Canvas,
  2549.                 Rect(Rct.Right - RO, Rct.Top, Rct.Right, Rct.Bottom));
  2550.     Inc(Rct.Left, LO);
  2551.     Dec(Rct.Right, RO);
  2552.     w := RectWidth(Rct);
  2553.     XCnt := (B.Width - LO - RO) div w;
  2554.     for X := 0 to XCnt do
  2555.     begin
  2556.       if LO + X * w + w > B.Width - RO
  2557.       then XO := LO + X * w + w - (B.Width - RO)
  2558.       else XO := 0;
  2559.       B.Canvas.CopyRect(Rect(LO + X * w, 0, LO + X * w + w - XO,
  2560.                         B.Height),
  2561.                         Picture.Canvas,
  2562.                         Rect(Rct.Left, Rct.Top, Rct.Right - XO, Rct.Bottom));
  2563.     end;
  2564.     Brush.Style := bsClear;
  2565.     if Parent.UseSkinFont
  2566.     then
  2567.       begin
  2568.         Font.Name := FontName;
  2569.         Font.Style := FontStyle;
  2570.         Font.Height := FontHeight;
  2571.       end
  2572.     else
  2573.       Font.Assign(Parent.DefItemFont);
  2574.     if (Parent.SkinData <> nil) and (Parent.SkinData.ResourceStrData <> nil)
  2575.     then
  2576.       Font.CharSet := Parent.SkinData.ResourceStrData.Charset
  2577.     else
  2578.       Font.CharSet := Parent.DefItemFont.Charset;
  2579.     if FDown
  2580.     then
  2581.       Font.Color := DownFontColor
  2582.     else
  2583.       if AActive
  2584.       then
  2585.         Font.Color := ActiveFontColor
  2586.       else
  2587.         if Self.MenuItem.Enabled
  2588.         then Font.Color := FontColor
  2589.         else Font.Color := UnEnabledFontColor;
  2590.     TR := TextRct;
  2591.     DrawText(B.Canvas.Handle, PChar(MenuItem.Caption),
  2592.       Length(MenuItem.Caption), TR, DT_CALCRECT);
  2593.     Inc(TR.Right, 2);
  2594.     DrawText(B.Canvas.Handle, PChar(MenuItem.Caption),
  2595.       Length(MenuItem.Caption), TR, DT_CENTER or DT_VCENTER);
  2596.   end;
  2597. end;
  2598. var
  2599.   Buffer, ABuffer: TBitMap;
  2600.   PBuffer, APBuffer: TbsEffectBmp;
  2601.   TMO: Integer;
  2602. begin
  2603.   if not FSkinSupport
  2604.   then
  2605.     begin
  2606.       DefaultDraw(Cnvs);
  2607.       Exit;
  2608.     end;
  2609.   if IsNullRect(SkinRect) or IsNullRect(TextRct) then Exit;
  2610.   if Parent.ScrollMenu
  2611.   then
  2612.     TMO := TRACKMARKEROFFSET
  2613.   else
  2614.     TMO := 0;
  2615.   Buffer := TBitMap.Create;
  2616.   ObjectRect := CalcObjectRect(Buffer.Canvas);
  2617.   if ObjectRect.Right > Parent.NewItemsRect.Right - TMO
  2618.   then
  2619.     begin
  2620.       Parent.Scroll := True;
  2621.       if Visible
  2622.       then
  2623.         begin
  2624.           OldEnabled := Enabled;
  2625.           Enabled := False;
  2626.           Visible := False;
  2627.         end;
  2628.       Buffer.Free;
  2629.       Exit;
  2630.     end
  2631.   else
  2632.     if not Visible
  2633.     then
  2634.       begin
  2635.         Visible := True;
  2636.         Enabled := OldEnabled;
  2637.       end;
  2638.   if FDown
  2639.   then
  2640.     begin
  2641.       CreateItemImage(Buffer, DownRect, True);
  2642.       Cnvs.Draw(ObjectRect.Left, ObjectRect.Top, Buffer);
  2643.     end
  2644.   else
  2645.     if not Morphing or
  2646.        ((Active and (MorphKf = 1)) or (not Active and (MorphKf  = 0)))
  2647.     then
  2648.       begin
  2649.         if Active
  2650.         then
  2651.           begin
  2652.             if isNullRect(ActiveSkinRect)
  2653.             then
  2654.               CreateItemImage(Buffer, SkinRect, True)
  2655.             else
  2656.               CreateItemImage(Buffer, ActiveSkinRect, True);
  2657.           end
  2658.         else CreateItemImage(Buffer, SkinRect, False);
  2659.         Cnvs.Draw(ObjectRect.Left, ObjectRect.Top, Buffer);
  2660.       end
  2661.     else
  2662.       begin
  2663.         CreateItemImage(Buffer, SkinRect, False);
  2664.         ABuffer := TBitMap.Create;
  2665.         CreateItemImage(ABuffer, ActiveSkinRect, True);
  2666.         PBuffer := TbsEffectBmp.CreateFromhWnd(Buffer.Handle);
  2667.         APBuffer := TbsEffectBmp.CreateFromhWnd(ABuffer.Handle);
  2668.         case MorphKind of
  2669.           mkDefault: PBuffer.Morph(APBuffer, MorphKf);
  2670.           mkGradient: PBuffer.MorphGrad(APBuffer, MorphKf);
  2671.           mkLeftGradient: PBuffer.MorphLeftGrad(APBuffer, MorphKf);
  2672.           mkRightGradient: PBuffer.MorphRightGrad(APBuffer, MorphKf);
  2673.           mkLeftSlide: PBuffer.MorphLeftSlide(APBuffer, MorphKf);
  2674.           mkRightSlide: PBuffer.MorphRightSlide(APBuffer, MorphKf);
  2675.           mkPush: PBuffer.MorphPush(APBuffer, MorphKf);
  2676.         end;
  2677.         PBuffer.Draw(Cnvs.Handle, ObjectRect.Left, ObjectRect.Top);
  2678.         PBuffer.Free;
  2679.         APBuffer.Free;
  2680.         ABuffer.Free;
  2681.       end;
  2682.   Buffer.Free;
  2683. end;
  2684. procedure TbsSkinMainMenuBarItem.MouseEnter;
  2685. begin
  2686.   if SearchDown
  2687.   then
  2688.     begin
  2689.       Active := True;
  2690.       FMouseIn := True;
  2691.       if Morphing then MorphKf := 1;
  2692.       SetDown(True);
  2693.     end
  2694.   else
  2695.     begin
  2696.       SearchActive;
  2697.       FMouseIn := True;
  2698.       Active := True;
  2699.       ReDraw;
  2700.       if Assigned(Parent.OnItemMouseEnter)
  2701.       then
  2702.         Parent.OnItemMouseEnter(Self.MenuItem);
  2703.     end;
  2704. end;
  2705. procedure TbsSkinMainMenuBarItem.MouseLeave;
  2706. begin
  2707.   Active := False;
  2708.   FMouseIn := False;
  2709.   if Morphing and FDown then MorphKf := 0;
  2710.   Redraw;
  2711.   if Assigned(Parent.OnItemMouseLeave)
  2712.   then
  2713.     Parent.OnItemMouseLeave(Self.MenuItem);
  2714. end;
  2715. procedure TbsSkinMainMenuBarItem.SetDown;
  2716. begin
  2717.   FDown := Value;
  2718.   if FDown
  2719.   then
  2720.     begin
  2721.       FMorphKf := 1;
  2722.       Parent.DrawSkinObject(Self);
  2723.       if Parent.BSF <> nil
  2724.       then
  2725.         with Parent.BSF do
  2726.         begin
  2727.           if not InMainMenu
  2728.           then
  2729.             begin
  2730.               if Assigned(OnMainMenuEnter) then OnMainMenuEnter(Parent);
  2731.             end;
  2732.         end;
  2733.       TrackMenu;
  2734.     end
  2735.   else
  2736.     begin
  2737.       Active := False;
  2738.       if Morphing
  2739.       then
  2740.         begin
  2741.           FMorphKf := 1;
  2742.           ReDraw;
  2743.         end
  2744.       else
  2745.         Parent.DrawSkinObject(Self);
  2746.     end;
  2747. end;
  2748. procedure TbsSkinMainMenuBarItem.TrackMenu;
  2749. var
  2750.   R: TRect;
  2751.   P: TPoint;
  2752. begin
  2753.   P := Point(ObjectRect.Left, ObjectRect.Top);
  2754.   P := Parent.ClientToScreen(P);
  2755.   R := Rect(P.X, P.Y, P.X + RectWidth(ObjectRect), P.Y + RectHeight(ObjectRect));
  2756.   if Parent.BSF <> nil
  2757.   then
  2758.     with Parent.BSF do
  2759.     begin
  2760.       SkinMenuOpen;
  2761.       if not InMainMenu then InMainMenu := True;
  2762.       SkinMenu.Popup(nil, Parent.SkinData, 0, R, MenuItem, Parent.PopupToUp);
  2763.     end;
  2764. end;
  2765. procedure TbsSkinMainMenuBarItem.MouseDown;
  2766. var
  2767.   Menu: TMenu;
  2768. begin
  2769.   if not Enabled then Exit;
  2770.   if Button = mbLeft
  2771.   then
  2772.     begin
  2773.       if MenuItem.Count <> 0
  2774.       then
  2775.         begin
  2776.           Parent.MenuActive := True;
  2777.           SetDown(True);
  2778.         end
  2779.       else
  2780.         begin
  2781.           if Parent.BSF.InMainMenu
  2782.           then
  2783.             Parent.BSF.SkinMainMenuClose;
  2784.           Parent.BSF.InMenu := False;
  2785.           if Morphing then ReDraw else Parent.DrawSkinObject(Self);
  2786.           Menu := MenuItem.GetParentMenu;
  2787.           Menu.DispatchCommand(MenuItem.Command);
  2788.         end;
  2789.      end;
  2790. end;
  2791. constructor TbsSkinMainMenuBar.Create(AOwner: TComponent);
  2792. begin
  2793.   inherited;
  2794.   ChildMenuIn := False;
  2795.   FScrollMenu := True;
  2796.   FSkinSupport := False;
  2797.   FUseSkinFont := True;
  2798.   Align := alTop;
  2799.   FDefaultHeight := 22;
  2800.   Height := 22;
  2801.   MouseTimer := TTimer.Create(Self);
  2802.   MouseTimer.Enabled := False;
  2803.   MouseTimer.OnTimer := TestMouse;
  2804.   MouseTimer.Interval := MouseTimerInterval;
  2805.   MorphTimer := TTimer.Create(Self);
  2806.   MorphTimer.Enabled := False;
  2807.   MorphTimer.OnTimer := TestMorph;
  2808.   MorphTimer.Interval := MorphTimerInterval;
  2809.   ObjectList := TList.Create;
  2810.   OldActiveObject := -1;
  2811.   ActiveObject := -1;
  2812.   MouseCaptureObject := -1;
  2813.   BSF := nil;
  2814.   MarkerActive := False;
  2815.   MenuActive := False;
  2816.   FPopupToUp := False;
  2817.   FMDIChildMax := False;
  2818.   ButtonsCount := 0;
  2819.   FDefItemFont := TFont.Create;
  2820.   with FDefItemFont do
  2821.   begin
  2822.     Name := 'Arial';
  2823.     Style := [];
  2824.     Height := 14;
  2825.     Color := clBtnText;
  2826.   end;
  2827.   FSkinDataName := 'mainmenubar';
  2828. end;
  2829. destructor TbsSkinMainMenuBar.Destroy;
  2830. begin
  2831.   FDefItemFont.Free;
  2832.   ClearObjects;
  2833.   ObjectList.Free;
  2834.   MouseTimer.Free;
  2835.   MorphTimer.Free;
  2836.   inherited;
  2837. end;
  2838. procedure TbsSkinMainMenuBar.TestMorph;
  2839. var
  2840.   i: Integer;
  2841.   StopMorph: Boolean;
  2842. begin
  2843.   StopMorph := True;
  2844.   for i := 0 to ObjectList.Count  - 1 do
  2845.     with TbsMenuBarObject(ObjectList.Items[i]) do
  2846.     begin
  2847.       if Morphing and CanMorphing
  2848.         then
  2849.           begin
  2850.             DoMorphing;
  2851.             StopMorph := False;
  2852.           end;
  2853.     end;
  2854.   if StopMorph
  2855.   then
  2856.   MorphTimer.Enabled := False;
  2857. end;
  2858. procedure TbsSkinMainMenuBar.SetDefaultWidth;
  2859. begin
  2860.   FDefaultWidth := Value;
  2861.   if (FIndex = -1) and (FDefaultWidth > 0) then Width := FDefaultWidth;
  2862. end;
  2863. procedure TbsSkinMainMenuBar.SetDefaultHeight;
  2864. begin
  2865.   FDefaultHeight := Value;
  2866.   if (FIndex = -1) and (FDefaultHeight > 0) then Height := FDefaultHeight;
  2867. end;
  2868. procedure TbsSkinMainMenuBar.SetDefItemFont;
  2869. begin
  2870.   FDefItemFont.Assign(Value);
  2871.   if FIndex = -1 then RePaint; 
  2872. end;
  2873. procedure TbsSkinMainMenuBar.WMCloseSkinMenu;
  2874. begin
  2875.   CloseSysMenu;
  2876. end;
  2877. procedure TbsSkinMainMenuBar.CloseSysMenu;
  2878. var
  2879.   i: Integer;
  2880. begin
  2881.   for i := 0 to ObjectList.Count - 1 do
  2882.   if TbsMenuBarObject(ObjectList.Items[i]) is TbsSkinMainMenuBarButton then
  2883.   with TbsSkinMainMenuBarButton(ObjectList.Items[i]) do
  2884.     if (Command = cmSysMenu) and FDown
  2885.     then
  2886.       begin
  2887.         if ActiveObject <> i
  2888.         then
  2889.           begin
  2890.             Active := False;
  2891.             FMouseIn := False;
  2892.           end;
  2893.         FDown := False;
  2894.         ReDraw;
  2895.       end;
  2896. end;
  2897. procedure TbsSkinMainMenuBar.CheckButtons;
  2898. var
  2899.   i: Integer;
  2900. begin
  2901.   for i := 0 to ButtonsCount - 1 do
  2902.   with TbsSkinMainMenuBarButton(ObjectList.Items[i]) do
  2903.   begin
  2904.     Enabled := True;
  2905.     case Command of
  2906.       cmMinimize: if not (biMinimize in BI) then Enabled := False;
  2907.       cmSysMenu: if not (biSystemMenu in BI) then Enabled := False;
  2908.     end;
  2909.   end;
  2910. end;
  2911. procedure TbsSkinMainMenuBar.AddButtons;
  2912. procedure AddButton(ButtonName: String);
  2913. var
  2914.   ButtonData: TbsDataSkinMainMenuBarButton;
  2915.   Index: Integer;
  2916. begin
  2917.   if (FSD = nil) or (FSD.Empty)
  2918.   then
  2919.     Index := -1
  2920.   else
  2921.     Index := FSD.GetIndex(ButtonName);
  2922.   if Index <> -1
  2923.   then
  2924.     ButtonData := TbsDataSkinMainMenuBarButton(FSD.ObjectList.Items[Index])
  2925.   else
  2926.     ButtonData := nil;
  2927.   ObjectList.Insert(0, TbsSkinMainMenuBarButton.Create(Self, ButtonData));
  2928.   with TbsSkinMainMenuBarButton(ObjectList.Items[0]) do
  2929.   begin
  2930.     IDName := ButtonName;
  2931.   end;
  2932.   Inc(ButtonsCount);
  2933. end;
  2934. begin
  2935.   ButtonsCount := 0;
  2936.   if FIndex <> -1
  2937.   then
  2938.     begin
  2939.       AddButton(MinButton);
  2940.       AddButton(MaxButton);
  2941.       AddButton(CloseButton);
  2942.       AddButton(SysMenuButton);
  2943.     end
  2944.   else
  2945.     begin
  2946.       AddButton('MinButton');
  2947.       TbsSkinMainMenuBarButton(ObjectList.Items[0]).Command := cmMinimize;
  2948.       AddButton('MaxButton');
  2949.       TbsSkinMainMenuBarButton(ObjectList.Items[0]).Command := cmMaximize;
  2950.       AddButton('CloseButton');
  2951.       TbsSkinMainMenuBarButton(ObjectList.Items[0]).Command := cmClose;
  2952.       AddButton('SysMenuButton');
  2953.       TbsSkinMainMenuBarButton(ObjectList.Items[0]).Command := cmSysMenu;
  2954.     end;
  2955. end;
  2956. procedure TbsSkinMainMenuBar.DeleteButtons;
  2957. var
  2958.   i: Integer;
  2959. begin
  2960.   for i := 0 to ButtonsCount - 1 do
  2961.   begin