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

Delphi控件源码

开发平台:

Delphi

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