WinSkinData.pas
上传用户:xjwsee
上传日期:2008-08-02
资源大小:796k
文件大小:69k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. unit WinSkinData;
  2. interface
  3. {$WARNINGS OFF}
  4. {$HINTS OFF}
  5. {$RANGECHECKS OFF}              
  6. uses Windows, Messages, SysUtils, Classes, Graphics, Controls,Forms,
  7.      IniFiles, Dialogs, FileCtrl,SkinRead,WinSkinStore,imgutil,Winskinini,
  8.      ImgList,typinfo;
  9. const
  10.   CN_SkinChanged = WM_USER + $3001;
  11.   CN_CaptionBtnClick = WM_USER + $3114;
  12.   CN_CaptionBtnVisible = WM_USER + $3115;
  13.   CN_UPdateMainMenu = WM_USER + $3105;
  14.   CN_SkinEnabled = WM_USER + $3106;
  15.   CN_TabSheetClose = WM_USER + $3107;
  16.   CN_SkinNotify = WM_USER + $3108;
  17.   NM_COOLSB_CUSTOMDRAW = 0-$aff;
  18.   c_version = '5.20.05.20';
  19.   c_skintag = 33333;
  20.  // Billenium Effects messages
  21.   BE_ID           = $41A2;
  22.   BE_BECLOSE      = $1595;
  23.   BE_BASE         = CM_BASE + $0C4A;
  24.   CM_BEPAINT      = BE_BASE + 0; // Paint client area to Billenium Effects' DC
  25.   CM_BENCPAINT    = BE_BASE + 1; // Paint non client area to Billenium Effects' DC
  26.   CM_BEFULLRENDER = BE_BASE + 2; // Paint whole control to Billenium Effects' DC
  27.   CM_BEWAIT       = BE_BASE + 3; // Don't execute effect yet
  28.   CM_BERUN        = BE_BASE + 4; // Execute effect now!
  29. type
  30.   TWinContainer = (xccForm, xccFrame, xccToolbar, xccCoolbar, xccControlbar, xccPanel,
  31.                   xccScrollBox, xccGroupBox, xccTabSheet, xccPageScroller);
  32.   TWinContainers = set of TWinContainer;
  33.   TSkinOption = (xoMDIScrollbar,xoMenuMerge,xoTransparent,xoPreview,xoParentBackGround,
  34.    xoNoFocusRect,xoToolbarBK,xoToolbarButton,xoMDIChildBorder,xoMenuBG,xoCaptionButtonHint,
  35.    xoFormScrollbar);
  36.   TSkinOptions = set of TSkinOption;
  37.   TSkinControlType = (xcMainMenu, xcPopupMenu,xcMenuItem, xcToolbar, xcControlbar, xcCombo,
  38.                 xcCheckBox, xcRadioButton,xcProgress,xcScrollbar,xcEdit,
  39.                 xcButton, xcBitBtn, xcSpeedButton,xcSpin,xcPanel, xcGroupBox,xcStatusBar,
  40.                 xcTab,xcTrackBar,xcSystemMenu,xcFastReport);
  41.   TSkinControlTypes = set of TSkinControlType;
  42.   TShemeColor=(csText,csTitleTextActive,csTitleTextNoActive,
  43.          csButtonFace,csButtonText,
  44.          csButtonHilight,csButtonlight,csButtonShadow,csButtonDkshadow,
  45.          csSelectText,csSelectBg,csHilightText,csHilight,
  46.          csMenuBar,csMenuBarText,csMenuText,csMenubg,csCaption,
  47.          csScrollbar,csTextDisable);
  48.   TShemeColors=array[csText..csTextDisable] of Tcolor;
  49.   TSkinFormType=(sfMainform,sfOnlyThisForm,sfDialog,sfDLL);
  50.   TSkinData = class;
  51.   TOnFormSkin  = procedure(Sender:TObject;aName:string;Var DoSkin:boolean) of object;
  52.   TOnSkinForm = procedure(Sender:TObject;ahwnd:HWND;aName:string) of object;
  53.   TOnSkinControl = procedure(Sender: TComponent; SkinData: TSkinData; Form, Control: TControl;
  54.                              ControlClass: String; var SkinnedControl: TComponent) of object;
  55.   TGetScrollBarInfo = Function(hwnd: HWND; idObject: Longint;
  56.               var psbi: TScrollBarInfo): BOOL; stdcall;
  57.   FTrackMouseEvent = function(var EventTrack: TTrackMouseEvent):BOOL; stdcall;
  58.   TGetComboBoxInfo = function(hwndCombo: HWND; var pcbi: TComboBoxInfo): BOOL; stdcall;
  59.   TDisableProcessWindowsGhosting = procedure(); stdcall;
  60.   TDataSkinObject = class(TObject)
  61.   public
  62.     r:Trect;
  63.     Map: TBitMap;
  64.     trans:integer;
  65.     Tile : integer;
  66.     IDName :String;
  67.     frame : integer;
  68.     style : integer;
  69.     Normalcolor,Overcolor,Downcolor:integer;
  70.     Normalcolor2,Overcolor2,Downcolor2:Tcolor;
  71.     constructor Create(AIDName: String);
  72.     destructor Destroy; override;
  73.   end;
  74.   TDataSkinBorder = class(TDataSkinObject)
  75.   public
  76.     MaskMap: TBitMap;
  77.     constructor Create(AIDName: String);
  78.     destructor Destroy; override;
  79.   end;
  80.   TDataSkinTitle = class(TDataSkinObject)
  81.   public
  82.     Aligment,BackGround,FontHeight :integer;
  83.     backleft,backright:integer;
  84.     activetext,inactivetext:Tcolor;
  85.   end;
  86.   TDataSkinButton = class(TDataSkinObject)
  87.   public
  88.     CheckMap,RadioMap:Tbitmap;
  89.     radioframe,checkframe:integer;
  90.     newnormal,newover,newdown:boolean;
  91.     constructor Create(AIDName: String);
  92.     destructor Destroy; override;
  93.   end;
  94.   TDataSkinSysButton = class(TDataSkinObject)
  95.   public
  96.     Action:integer;
  97.     Align :integer;
  98.     XCoord,YCoord:integer;
  99.     CombineOp:integer;
  100.     Visibility,Visibility1 :integer;
  101.   end;
  102.   TDataSkinBoxLabel = class(TDataSkinObject)
  103.   public
  104.     LeftShift,RightShift,Alignment:integer;
  105.   end;
  106.   TSkinControlList = class(TPersistent)
  107.   private
  108.     Fedit: TStrings;
  109.     fCheckbox:Tstrings;
  110.     fRadiobutton:tStrings;
  111.     fcombobox   :TStrings;
  112.     procedure SetEdit(Value:Tstrings);
  113.     procedure SetCheckbox(Value:Tstrings);
  114.     procedure SetRadiobutton(Value:Tstrings);
  115.     procedure Setcombobox(Value:Tstrings);
  116.   public
  117.     constructor Create;
  118.     destructor Destroy; override;
  119.   published
  120.     property Edit: TStrings read Fedit write SetEdit;
  121.     property Checkbox: TStrings read Fcheckbox write SetCheckbox;
  122.     property Combobox: TStrings read Fcombobox write SetCombobox;
  123.     property Radiobutton: TStrings read Fradiobutton write Setradiobutton;
  124.   end;
  125.   TSkinData = class(TComponent)
  126.   private
  127.     fskinfile : string;
  128.     ini : TQuickIni;
  129.     fMenuSideBar :Tcolor;
  130.     ms:TMemorystream;
  131.     factive:boolean;
  132.     fdisableTag:integer;
  133.     FContainers: TWinContainers;
  134.     FSkinControls: TSkinControlTypes;
  135.     fSkinOptions:TSkinOptions;
  136.     ftype:TSkinFormType;
  137.     fOnFormSkin:TOnFormSkin;
  138.     fOnBeforeSkinForm:TOnSkinForm;
  139.     fOnAfterSkinForm:TOnSkinForm;
  140.     fOnSkinChanged :TNotifyevent;
  141.     FOnSkinControl: TOnSkinControl;
  142.     FInDLL : boolean;
  143.     f3rdControls:TStrings;
  144.     fmenuauto : boolean;
  145.     fversion : String;
  146.     fmenumerge:boolean;
  147.     fhintwindow : THintWindow;
  148.     hashint:boolean;
  149.     procedure ReadMenuBar(var aobject:TDataSkinObject;aname:string);
  150.     procedure ReadProgress(var aobject:TDataSkinObject;aname:string);
  151.     Procedure ReadRGB(Section,aname:string;var value:Tcolor);
  152.     function  GetColor(const s1:string;acolor:Tcolor):Tcolor;
  153.     procedure SetFrame;
  154.     function GetSectionNum(asection,aname:string):integer;
  155.     procedure WriteData (Stream : TStream);
  156.     procedure ReadData (Stream : TStream);
  157.     function GetSkinStore: string;
  158.     procedure SetSkinStore(const Value: string);
  159.     procedure CreateMdibtn(n:integer);
  160.     procedure SetActive( Value: boolean);
  161.     procedure SetVersion( Value: string);
  162.     procedure InitControlList;
  163.     procedure SetControlList(Value: TStrings);
  164.     procedure ReadTrack(var aobject:TDataSkinObject;aname:string);
  165.     procedure CreateLogo;
  166.     procedure CreateCaptionFont;
  167.     procedure CreateMinCaption;
  168.   protected
  169.     procedure ReadObject(var aobject:TDataskinobject;aname:string);
  170.     procedure ReadObject2(var aobject:TDataSkinborder;aname,image2:string);
  171.     procedure ReadButton;
  172.     procedure ReadSysButton;
  173.     procedure LoadFromIni(filename:string);
  174.     procedure ReadBord;
  175.     procedure ReadColor;
  176.     procedure ReadColor2(item: TShemeColor;key:string;cdefault:Tcolor);    
  177.     procedure ReadTitle(aobject:TDataSkinObject;aname:string);
  178.     procedure ReadBoxLabel(var aobject:TDataSkinBoxLabel;aname:string);
  179.     procedure DefineProperties (Filer : TFiler); override;
  180.     procedure RebuildToolbar;
  181.     procedure ReBuildCombobox;
  182.     procedure ReBuildComboxArrow;
  183.     procedure Loaded; override;
  184.     function LoadSkin:boolean;
  185.     procedure UpdateSkin;
  186.   public
  187.     reader: TSkinReader;
  188.     data :Tmemorystream;
  189.     Empty : boolean;
  190.     Colors: TShemeColors;
  191.     hasColors: array[csText..csTextDisable] of boolean;
  192.     ColorPreset : array of Tcolor;
  193.     SysIcon:Tbitmap;
  194.     Title : TDataSkinTitle;
  195.     SysBtn : array of TDataSkinSysButton;
  196.     Button : TDataSkinButton;
  197.     tab:Tdataskinborder;
  198.     HSpin,VSpin:Tdataskinborder;
  199.     Comboxborder,ExtraImages: TDataSkinObject;
  200.     combox: Tdataskinborder;
  201.     comboxarrow:TDataSkinObject;
  202.     Box,Toolbar,Toolbarbtn : TDataSkinObject;
  203.     progress,progresschunk:TdataskinObject;
  204.     boxlabel:TDataSkinBoxLabel;
  205.     StatusBar,TabSheet: TDataSkinObject;
  206.     Header: TDataSkinObject;
  207.     Menubar,MenuItem,MenuitemBG : TDataSkinObject;
  208.     SArrow,HBar,VBar,HSlider,VSlider:TDataSkinObject;
  209.     TrackHorz,TrackVert :TDataSkinObject;
  210.     TrackBar,TrackBarVert:TDataSkinObject;
  211.     TrackLeft,Trackright,Tracktop,Trackbottom:TDataSkinObject;
  212.     MinCaption: TDataSkinObject;
  213.     border:array[1..4] of TDataskinborder;
  214.     sectionlist:Tstringlist;
  215.     PresetColors:array[0..9] of integer;
  216.     BGBrush :HBRUSH;
  217.     MenuMsg:boolean;
  218.     bmpmenu:Timagelist;
  219.     SkinName : string;
  220.     DebugList: TStrings;
  221.     cxMax,cyMax:integer;
  222.     logo:TBitmap;
  223.     CaptionFont: Tfont;
  224.     formhwnd:Thandle;
  225.     hintcount:integer;
  226.     constructor Create(AOwner: TComponent); override;
  227.     destructor Destroy; override;
  228.     procedure LoadFromFile(value:string);
  229.     procedure LoadFromStream(Stream: TStream);
  230.     procedure LoadFromCollection(astore:TSkinStore;aindex:integer);
  231.     procedure Readbmp(bmp:Tbitmap;fname:string);
  232.     function GetPrecolor(var acolor:Tcolor;n:integer):boolean;
  233.     function GetFileName(s:string):string;
  234.     procedure Uninstall;
  235.     procedure Install;
  236.     procedure DoFormSkin(ahwnd:Thandle;aname:string;var Doskin:boolean);
  237.     procedure DoSkinChanged;
  238.     procedure AddNestForm(fParent,fNested:TWincontrol);
  239.     procedure UpdateSkinControl(fParent:Tform;acontrol:Twincontrol=nil);
  240.     procedure DeleteGraphicControl(fParent:Tform;acontrol:TGraphicControl);
  241.     procedure UpdateMenu(fParent:Tform);
  242.     procedure UpdateMainMenu(done:boolean);
  243.     procedure SkinForm(ahwnd:THandle);
  244.     procedure InstallThread(aThreadID:integer);
  245.     procedure UnInstallThread(aThreadID:integer);
  246.     procedure ChangeProperty(control: TObject;aprop,value:string);
  247.     procedure EnableSkin(b:boolean);
  248.     function GetCaptionColor:Tcolor;
  249.     function GetScrollBarInfo(hwnd: HWND; idObject: Longint;
  250.                    var psbi: TScrollBarInfo):boolean;
  251.     procedure DoDebug(s:string);
  252.     procedure ChangeForm(aform:Tform);
  253.     procedure GetAppIcon;
  254.     procedure ActivateHint(aRect: TRect; const AHint: string);
  255.     procedure HideHint;
  256.     function IsHint:Boolean;
  257.   published
  258.     property Active : boolean read factive write setactive;
  259.     property DisableTag:integer read fdisabletag write fdisabletag;
  260.     property SkinControls: TSkinControlTypes read fSkinControls write fSkinControls;
  261.     property Options:TSkinOptions read fSkinOptions write fSkinOptions;
  262.     property Skin3rd: TStrings read f3rdControls write SetControllist;
  263.     property SkinFile : String read fskinfile write LoadFromFile;
  264.     property SkinStore: string read GetSkinStore write SetSkinStore;
  265.     property SkinFormtype:TSkinFormType read ftype write ftype;
  266.     property Version : string read fversion write setversion;
  267.     property MenuUpdate: boolean read fmenuauto write fmenuauto;
  268.     property MenuMerge: boolean read fmenumerge write fmenumerge;
  269. //    property InDLL :boolean read findll write findll;
  270.     property OnFormSkin    :TOnFormSkin read fOnFormSkin write fOnFormSkin;
  271.     property OnSkinChanged :TNotifyevent read fOnSkinChanged write fOnSkinChanged;
  272.     property OnSkinControl :TOnSkinControl read FOnSkinControl write FOnSkinControl;
  273.     property OnBeforeSkinForm :TOnSkinForm read fOnBeforeSkinForm write fOnBeforeSkinForm;
  274.     property OnAfterSkinForm  :TOnSkinForm read fOnAfterSkinForm write fOnAfterSkinForm;
  275.   end;
  276. function RGBToColor(R,G,B:Byte): TColor;
  277. function strcolor(s:string):Tcolor;
  278. function Tnt_DrawTextW(hDC: HDC; wString: WideString;var lpRect: TRect; uFormat: UINT): Integer;
  279. function StrToWideStr(const S: AnsiString): WideString;
  280. function WideStringToStringEx(const WS: WideString): AnsiString;
  281. function _WStr(lpString: PWideChar; cchCount: Integer): WideString;
  282. function FindControlx(Handle: HWnd): TWinControl;
  283. procedure SkinDll(adata: Pointer);
  284. procedure DoTrackMouse(ahwnd:THandle);
  285. //procedure CopyBMP(sbmp,dbmp:TBitMap);
  286. var  GSkinData:TSkinData;
  287.      Win32PlatformIsUnicode:boolean;
  288.      IsVista:boolean;
  289.      DefaultUserCodePage: Cardinal;
  290.      pGetScrollBarInfo:TGetScrollBarInfo;
  291.      pTrackMouseEvent:FTrackMouseEvent;
  292.      pGetComboBoxInfo:TGetComboBoxInfo;
  293.      pDisableProcessWindowsGhosting:TDisableProcessWindowsGhosting ;
  294. implementation
  295. uses Winskinform,WinSkinDlg,winsubclass;
  296. constructor TSkinControlList.Create;
  297. begin
  298.     inherited create;
  299.     fedit := TStringList.create;
  300.     fCombobox := TStringList.create;
  301.     fcheckbox := TStringList.create;
  302.     fradiobutton := TStringList.create;
  303. end;
  304. procedure TSkinData.InitControlList;
  305. begin
  306.     f3rdControls.add('TCategoryButtons=scrollbar');
  307.     f3rdControls.add('TPngSpeedbutton=pngspeedbutton');
  308.     f3rdControls.add('TPngBitBtn=pngbitbtn');
  309.     f3rdControls.add('TVirtualStringTree=scrollbar');
  310.     f3rdControls.add('TVirtualDrawTree=scrollbar');
  311.     f3rdControls.add('TTBXDockablePanel=Panel');
  312.     f3rdControls.add('TAdvPanelGroup=scrollbar');
  313.     f3rdControls.add('TComboboxex=combobox');
  314.     f3rdControls.add('TRxSpeedButton=speedbutton');
  315.     f3rdControls.add('THTMLViewer=scrollbar');
  316.     f3rdControls.add('TDBCtrlGrid=scrollbar');
  317.     f3rdControls.add('TfrSpeedButton=speedbutton');
  318.     f3rdControls.add('TfrTBButton=speedbutton');
  319.     f3rdControls.add('TControlBar=Panel');
  320.     f3rdControls.add('TTBDock=Panel');
  321.     f3rdControls.add('TTBToolbar=Panel');
  322. //    f3rdControls.add('TAdvPageControl=nil');
  323.     f3rdControls.add('TImageEnMView=scrollbar');
  324.     f3rdControls.add('TImageEnView=scrollbar');
  325.     f3rdControls.add('TAdvMemo=scrollbar');
  326.     f3rdControls.add('TDBAdvMemo=scrollbar');
  327.     f3rdControls.add('TcxDBLookupComboBox=combobox');
  328.     f3rdControls.add('TcxDBComboBox=combobox');
  329.     f3rdControls.add('TcxDBDateEdit=combobox');
  330.     f3rdControls.add('TcxDBImageComboBox=combobox');
  331.     f3rdControls.add('TcxDBCalcEdit=combobox');
  332.     f3rdControls.add('TcxDBBlobEdit=combobox');
  333.     f3rdControls.add('TcxDBPopupEdit=combobox');
  334.     f3rdControls.add('TcxDBFontNameComboBox=combobox');
  335.     f3rdControls.add('TcxDBShellComboBox=combobox');
  336.     f3rdControls.add('TRxLookupEdit=combobox');
  337.     f3rdControls.add('TRxDBLookupCombo=combobox');
  338.     f3rdControls.add('TRzGroup=panel');
  339.     f3rdControls.add('TRzButton=button');
  340.     f3rdControls.add('TRzBitbtn=bitbtn');
  341.     f3rdControls.add('TRzMenuButton=menubtn');
  342.     f3rdControls.add('TRzCheckGroup=CheckGroup');
  343.     f3rdControls.add('TRzRadioGroup=Radiogroup');
  344. //    f3rdControls.add('TRzRadioButton=Radiobutton');
  345. //    f3rdControls.add('TRzCheckBox=Checkbox');
  346.     f3rdControls.add('TRzButtonEdit=Edit');
  347.     f3rdControls.add('TRzDBRadioGroup=Radiogroup');
  348.     f3rdControls.add('TRzDBRadioButton=Radiobutton');
  349.     f3rdControls.add('TRzDateTimeEdit=combobox');
  350.     f3rdControls.add('TRzColorEdit=combobox');
  351.     f3rdControls.add('TRzDateTimePicker=combobox');
  352.     f3rdControls.add('TRzDBDateTimeEdit=combobox');
  353.     f3rdControls.add('TRzDbColorEdit=combobox');
  354.     f3rdControls.add('TRzDBDateTimePicker=combobox');
  355.     f3rdControls.add('TLMDButton=bitbtn');
  356.     f3rdControls.add('TLMDGroupBox=Groupbox');
  357.     f3rdControls.add('TDBCheckboxEh=Checkbox');
  358.     f3rdControls.add('TDBCheckboxEh=Checkbox');
  359.     f3rdControls.add('TLMDCHECKBOX=Checkbox');
  360.     f3rdControls.add('TLMDDBCHECKBOX=Checkbox');
  361.     f3rdControls.add('TLMDRadiobutton=Radiobutton');
  362.     f3rdControls.add('TLMDCalculator=panel');
  363.     f3rdControls.add('TLMDGROUPBOX=Panel');
  364.     f3rdControls.add('TLMDSIMPLEPANEL=Panel');
  365.     f3rdControls.add('TLMDDBCalendar=Panel');
  366.     f3rdControls.add('TLMDButtonPanel=Panel');
  367.     f3rdControls.add('TLMDLMDCalculator=Panel');
  368.     f3rdControls.add('TLMDHeaderPanel=Panel');
  369.     f3rdControls.add('TLMDTechnicalLine=Panel');
  370.     f3rdControls.add('TLMDLMDClock=Panel');
  371.     f3rdControls.add('TLMDTrackbar=panel');
  372.     f3rdControls.add('TLMDListCombobox=combobox');
  373.     f3rdControls.add('TLMDCheckListCombobox=combobox');
  374.     f3rdControls.add('TLMDHeaderListCombobox=combobox');
  375.     f3rdControls.add('TLMDImageCombobox=combobox');
  376.     f3rdControls.add('TLMDColorCombobox=combobox');
  377.     f3rdControls.add('TLMDFontCombobox=combobox');
  378.     f3rdControls.add('TLMDFontSizeCombobox=combobox');
  379.     f3rdControls.add('TLMDFontSizeCombobox=combobox');
  380.     f3rdControls.add('TLMDPrinterCombobox=combobox');
  381.     f3rdControls.add('TLMDDriveCombobox=combobox');
  382.     f3rdControls.add('TLMDCalculatorComboBox=combobox');
  383.     f3rdControls.add('TLMDTrackBarComboBox=combobox');
  384.     f3rdControls.add('TLMDCalendarComboBox=combobox');
  385.     f3rdControls.add('TLMDTreeComboBox=combobox');
  386.     f3rdControls.add('TLMDRADIOGROUP=radiogroup');
  387.     f3rdControls.add('TLMDCheckGroup=CheckGroup');
  388.     f3rdControls.add('TLMDDBRADIOGROUP=radiogroup');
  389.     f3rdControls.add('TLMDDBCheckGroup=CheckGroup');
  390.     f3rdControls.add('TLMDCalculatorEdit=edit');
  391.     f3rdControls.add('TLMDEDIT=Edit');
  392.     f3rdControls.add('TLMDMASKEDIT=Edit');
  393.     f3rdControls.add('TLMDBROWSEEDIT=Edit');
  394.     f3rdControls.add('TLMDEXTSPINEDIT=Edit');
  395.     f3rdControls.add('TLMDCALENDAREDIT=Edit');
  396.     f3rdControls.add('TLMDFILEOPENEDIT=Edit');
  397.     f3rdControls.add('TLMDFILESAVEEDIT=Edit');
  398.     f3rdControls.add('TLMDCOLOREDIT=Edit');
  399.     f3rdControls.add('TLMDDBEDIT=Edit');
  400.     f3rdControls.add('TLMDDBMASKEDIT=Edit');
  401.     f3rdControls.add('TLMDDBEXTSPINEDIT=Edit');
  402.     f3rdControls.add('TLMDDBSPINEDIT=Edit');
  403.     f3rdControls.add('TLMDDBEDITDBLookup=Edit');
  404.     f3rdControls.add('TLMDEDITDBLookup=Edit');
  405.     //combobox
  406.     f3rdControls.add('TDBLookupCombobox=Combobox');
  407.     f3rdControls.add('TWWDBCombobox=Combobox');
  408.     f3rdControls.add('TWWDBLookupCombo=Combobox');
  409.     f3rdControls.add('TWWDBCombobox=Combobox');
  410.     f3rdControls.add('TWWKeyCombo=Combobox') ;
  411.     f3rdControls.add('TWWTempKeyCombo=combobox');
  412.     f3rdControls.add('TWWDBDateTimePicker=Combobox');
  413.     f3rdControls.add('TWWRADIOGROUP=radiogroup');
  414.     f3rdControls.add('TWWDBEDIT=Edit');
  415.     f3rdControls.add('TcxButton=bitbtn');
  416. //    f3rdControls.add('TcxDBCheckBox=checkbox');
  417.     f3rdControls.add('TcxDBRadioGroup=radiogroup');
  418.     f3rdControls.add('TcxRadioGroup=radiogroup');
  419.     f3rdControls.add('TcxGroupbox=groupbox');
  420. //    f3rdControls.add('TcxCheckBox=checkbox');
  421. {    f3rdControls.add('TDXDBPICKEDIT=Combobox');
  422.     f3rdControls.add('TDXDBCALCEDIT=Combobox');
  423.     f3rdControls.add('TDXDBIMAGEEDIT=Combobox');
  424.     f3rdControls.add('TDXDBPOPUPEDIT=Combobox');
  425.     f3rdControls.add('TDXDBEXTLOOKUPEDIT=Combobox');
  426.     f3rdControls.add('TDXDBLOOKUPEDIT=Combobox');
  427.     f3rdControls.add('TDXDBDATEEDIT=Combobox');
  428.     f3rdControls.add('TDXDATEEDIT=Combobox');
  429.     f3rdControls.add('TDXPICKEDIT=Combobox');
  430.     f3rdControls.add('TDXPOPUPEDIT=Combobox');
  431.     //edit
  432.     f3rdControls.add('TDXDBCURRENCYEDIT=Edit');
  433.     f3rdControls.add('TDXDBEDIT=Edit');
  434.     f3rdControls.add('TDXDBMASKEDIT=Edit');
  435.     f3rdControls.add('TDXDBHYPERLINKEDIT=Edit');
  436.     f3rdControls.add('TDXEDIT=Edit');
  437.     f3rdControls.add('TDXMASKEDIT=Edit');
  438.     f3rdControls.add('TDXBUTTONEDIT=Edit');
  439.     f3rdControls.add('TDXCURRENCYEDIT=Edit');
  440.     f3rdControls.add('TDXHYPERLINKEDIT=Edit');}
  441.     f3rdControls.add('TOVCPICTUREFIELD=Edit');
  442.     f3rdControls.add('TOVCDBPICTUREFIELD=Edit');
  443.     f3rdControls.add('TOVCSLIDEREDIT=Edit');
  444.     f3rdControls.add('TOVCDBSLIDEREDIT=Edit');
  445.     f3rdControls.add('TOVCSIMPLEFIELD=Edit');
  446.     f3rdControls.add('TOVCDBSIMPLEFIELD=Edit');
  447.     f3rdControls.add('TO32DBFLEXEDIT=Edit');
  448.     f3rdControls.add('TOVCNUMERICFIELD=Edit');
  449.     f3rdControls.add('TOVCDBNUMERICFIELD=Edit');
  450. end;
  451. destructor TSkinControlList.Destroy;
  452. begin
  453.     fedit.free;
  454.     fcombobox.free;
  455.     fradiobutton.free;
  456.     fcheckbox.free;
  457.     inherited destroy;
  458. end;
  459. procedure TSkinControlList.SetEdit(Value: TStrings);
  460. begin
  461.   FEdit.Assign(Value);
  462. end;
  463. procedure TSkinControlList.SetCheckbox(Value: TStrings);
  464. begin
  465.   Fcheckbox.Assign(Value);
  466. end;
  467. procedure TSkinControlList.Setradiobutton(Value: TStrings);
  468. begin
  469.   Fradiobutton.Assign(Value);
  470. end;
  471. procedure TSkinControlList.SetCombobox(Value: TStrings);
  472. begin
  473.   FCombobox.Assign(Value);
  474. end;
  475. constructor TDataSkinObject.Create(AIDName: String);
  476. begin
  477.     inherited create;
  478.     Map:=Tbitmap.create;
  479.     Idname:=aidname;
  480. end;
  481. destructor TDataSkinObject.Destroy;
  482. begin
  483.  try
  484.     if not IsBadReadPtr(map, map.InstanceSize) then begin
  485.        map.assign(nil);
  486.        Map.free;
  487.     end;
  488.   except
  489.   end;
  490.   inherited destroy;
  491. end;
  492. constructor TDataSkinBorder.Create(AIDName: String);
  493. begin
  494.     inherited create(aidname);
  495.     MaskMap:=TBitMap.create;
  496.     Idname:=aidname;
  497. end;
  498. destructor TDataSkinBorder.Destroy;
  499. begin
  500.     MaskMap.free;
  501.     inherited destroy;
  502. end;
  503. constructor TDataSkinButton.Create(AIDName: String);
  504. begin
  505.     inherited create(aidname);
  506.     CheckMap :=Tbitmap.create;
  507.     RadioMap :=Tbitmap.create;
  508. end;
  509. destructor TDataSkinButton.Destroy;
  510. begin
  511.  try
  512.     if not IsBadReadPtr(checkmap, checkmap.InstanceSize) then begin
  513.        CheckMap.free;
  514.     end;
  515.   except
  516.   end;
  517.   try
  518.     if not IsBadReadPtr(radiomap, radiomap.InstanceSize) then begin
  519.        RadioMap.free;
  520.     end;
  521.   except
  522.   end;
  523.     inherited destroy;
  524. end;
  525. constructor TSkinData.Create(AOwner: TComponent);
  526. var i: integer;
  527. begin
  528.   inherited Create(AOwner);
  529.   fOnBeforeSkinForm:=nil;
  530.   fOnAfterSkinForm:=nil;
  531.   ftype := sfMainform;
  532.   data := TMemorystream.create;
  533.   Empty := True;
  534.   sysicon:=Tbitmap.create;
  535.   sysicon.PixelFormat := pf24bit;
  536.   logo:=Tbitmap.create;
  537.   logo.PixelFormat := pf24bit;
  538.   MenuMsg:=true;
  539.   findll := false;
  540.   f3rdControls:=TStringlist.create;
  541.   initcontrollist;
  542.   Button := TDataSkinButton.create('Buttons');
  543.   border[1]:=TDataskinborder.create('Left');
  544.   border[2]:=TDataskinborder.create('Right');
  545.   border[3]:=TDataskinborder.create('Top');
  546.   border[4]:=TDataskinborder.create('Bottom');
  547.   Title := TDataSkinTitle.create('Title');
  548.   fmenuauto := true;
  549.   fmenumerge := false;
  550.   fSkinOptions := [xoPreview,xoToolbarBK,xoCaptionButtonHint];
  551. //  if gSkindata=nil then gskindata:=self;
  552.   fdisabletag:=99;
  553.   FContainers := [xccForm, xccFrame, xccToolbar, xccCoolbar, xccControlbar, xccPanel,
  554.                   xccScrollBox, xccGroupBox, xccTabSheet, xccPageScroller];
  555.   FSkinControls := [xcMainMenu, xcPopupMenu, xcToolbar, xcControlbar, xcCombo,
  556.                 xcCheckBox, xcRadioButton,xcProgress,xcScrollbar,xcedit,
  557.                 xcButton,xcedit, xcBitBtn, xcSpeedButton, xcPanel,xcSpin,xcTrackbar,xcGroupBox,
  558.                 xcTab,xcStatusBar,xcSystemMenu];
  559.   bmpmenu:=Timagelist.create(nil);
  560.   bmpmenu.GetResource(rtBitmap,'VCLSKINMENU',16,[lrTransparent],clwhite);
  561.   fversion := c_version;
  562.   cxMax := GetSystemMetrics(SM_CXMAXIMIZED);
  563.   cyMax := GetSystemMetrics(SM_CYMAXIMIZED);
  564.   mincaption:=nil;
  565.   //hint
  566.   hintcount:=0;
  567.   fhintwindow := THintWindow.Create(nil);
  568.   hashint:=false;
  569. //  bmpmenu.ResInstLoad(rtBitmap,'VCLSKINMENU',16,[lrTransparent],clwhite);
  570. end;
  571. destructor TSkinData.Destroy;
  572. var i:integer;
  573. begin
  574.   bmpmenu.free;
  575.   f3rdControls.free;
  576.   if skinmanager<>nil then
  577.     skinmanager.Removeskindata(self);
  578. //  skinmanager=nil;
  579.   data.free;
  580.   sysicon.free;
  581.   logo.free;
  582.   fhintwindow.Free;
  583.   if CaptionFont<>nil then CaptionFont.free;
  584.   for i:= 1 to 4 do begin
  585.      border[i].free;
  586.   end;
  587.   for i:= 0 to length(SysBtn)-1 do begin
  588.      SysBtn[i].free;
  589.   end;
  590.   Button.free;
  591.   Title.free;
  592.   if BGBrush<>0 then begin
  593.      deleteobject(BgBrush);
  594.      BGBrush:=0;
  595.   end;
  596.   if box<>nil then Box.free;
  597.   if boxlabel<>nil then Boxlabel.free;
  598.   if toolbar<>nil then toolbar.free;
  599.   if Tab<>nil then Tab.free;
  600.   if TabSheet<>nil then TabSheet.free;
  601.   if MinCaption<>nil then MinCaption.free;
  602.   if StatusBar<>nil then statusbar.free;
  603.   if ComBox<>nil then Combox.free;
  604.   if ComBoxborder<>nil then ComBoxborder.free;
  605.   if ComBoxArrow<>nil then ComBoxArrow.free;
  606.   if ExtraImages<>nil then ExtraImages.free;
  607.   if Progress<>nil then Progress.free;
  608.   if ProgressChunk<>nil then ProgressChunk.free;
  609.   if Header<>nil then Header.free;
  610.   if MenuBar<>nil then MenuBar.free;
  611.   if MenuItem<>nil then MenuItem.free;
  612.   if MenuItemBG<>nil then MenuItemBG.free;
  613.   if SArrow<>nil then SArrow.free;
  614.   if HBar<>nil then HBar.free;
  615.   if VBar<>nil then VBar.free;
  616.   if HSlider<>nil then HSlider.free;
  617.   if VSlider<>nil then VSlider.free;
  618.   if Hspin<>nil then Hspin.free;
  619.   if Vspin<>nil then Vspin.free;
  620.   if TrackHorz<>nil then TrackHorz.free;
  621.   if TrackVert<>nil then TrackVert.free;
  622.   if trackbar<>nil then trackbar.free;
  623.   if trackbarvert<>nil then trackbarvert.free;
  624.   if TrackLeft<>nil then TrackLeft.free;
  625.   if TrackRight<>nil then TrackRight.free;
  626.   if TrackTop<>nil then TrackTop.free;
  627.   if TrackBottom<>nil then TrackBottom.free;
  628.   if Toolbarbtn<>nil then toolbarbtn.free;
  629. {  if skinmanager.dlist.count=0 then begin
  630.     skinmanager.free;
  631.     skinmanager:=nil;
  632.   end;}
  633.   inherited Destroy;
  634. end;
  635. procedure TSkinData.SetControlList(Value: TStrings);
  636. begin
  637.   f3rdControls.Assign(Value);
  638. end;
  639. procedure TSkinData.ReadBord;
  640. var s:string;
  641.     i:integer;
  642. begin
  643.   for i:= 1 to 4 do begin
  644.   if i<3 then begin
  645.     border[i].r.top:=ini.Readinteger('Personality',border[i].IDName+'TopHeight',0);
  646.     border[i].r.Bottom:=ini.Readinteger('Personality',border[i].IDName+'BotHeight',0);
  647.     border[i].r.left:= 0;
  648.     border[i].r.right:= 0;
  649.   end else begin
  650.     border[i].r.top:= 0;
  651.     border[i].r.Bottom:=0;
  652.     border[i].r.left:=ini.Readinteger('Personality',border[i].IDName+'TopHeight',0);
  653.     border[i].r.right:=ini.Readinteger('Personality',border[i].IDName+'BotHeight',0);
  654.   end;
  655.   border[i].frame:=ini.Readinteger('Personality',border[i].IDName+'Frame',1);
  656.   border[i].Tile:=ini.Readinteger('Personality',border[i].IDName+'Stretch',1);
  657.   border[i].trans:=ini.readinteger('Personality',border[i].IDName+'Trans',1);
  658.   readbmp(border[i].map,ini.ReadString('Personality',border[i].IDName, ''));
  659.   if border[i].Tile>1 then border[i].Tile:=1; 
  660. //  readbmp(border[i].maskmap,ini.ReadString('Personality', border[i].IDName+'Mask', ''));
  661.   end;
  662. end;
  663. procedure TSkinData.Readbmp(bmp:Tbitmap;fname:string);
  664. var s,s1:ansistring;
  665. begin
  666.    s:= ExtractFileName(fname);
  667.    s1:=ExtractFileExt(fname);
  668.    if (s<>'') and (s1='.bmp') then begin
  669.        reader.readfile(s,ms);
  670.        if ms.size>0 then
  671.          bmp.LoadFromstream(ms)
  672.        else bmp.Assign(nil);
  673.    end else bmp.Assign(nil);
  674. end;
  675. procedure TSkinData.ReadSysButton;
  676. var i,n,a,v1:integer;
  677.     j:real;
  678.     s:string;
  679.     b:boolean;
  680.     p:Tpoint;
  681. begin
  682.    for i:= 0 to high(SysBtn) do SysBtn[i].free;
  683.    ini.ReadSections(sectionlist);
  684.    for i:= sectionlist.count-1 downto 0 do begin
  685.       s:=Uppercase(sectionlist.strings[i]);
  686.       b:=false;
  687.       if (s='BUTTONS') or (s='BUTTON.RADIO')
  688.          or (s='BUTTON.CHECKBOX') or (s='BUTTON') then b:=true
  689.       else  if (pos('BUTTON',s)<>1) then b:=true
  690.       else begin
  691.          a:=ini.readinteger(s,'Action',0);
  692.          v1:=ini.readinteger(s,'Visibility',-1);
  693.          if a=-1 then begin
  694.            if v1=0 then b:=false
  695.            else b:=true;
  696.          end;
  697.       end;
  698.       if b then sectionlist.delete(i);
  699.    end;
  700.    n:=sectionlist.count;
  701.    setlength(SysBtn,n+3);
  702.    for i:= 0 to sectionlist.count-1 do begin
  703.       s:=Uppercase(sectionlist.strings[i]);
  704.       SysBtn[i]:= TDataSkinSysButton.create(s);
  705.       SysBtn[i].Action:=ini.readinteger(s,'Action',0);
  706.       SysBtn[i].Align:=ini.readinteger(s,'Align',0);
  707.       SysBtn[i].Xcoord:=ini.readinteger(s,'Xcoord',0);
  708.       SysBtn[i].Ycoord:=ini.readinteger(s,'Ycoord',0);
  709.       SysBtn[i].Visibility:=ini.readinteger(s,'Visibility',0);
  710.       if SysBtn[i].Action=-1 then
  711.         SysBtn[i].Visibility1:=ini.readinteger(s,'Visibility1',-1)
  712.       else
  713.         SysBtn[i].Visibility1:=ini.readinteger(s,'Visibility1',0);
  714.       //save maxbtn;
  715.       if (SysBtn[i].Action=1) and (SysBtn[i].Visibility=2) then
  716.          p := Point(SysBtn[i].Xcoord,SysBtn[i].Ycoord);
  717.       // set help btn
  718.       if (SysBtn[i].Action=4) then begin
  719.          SysBtn[i].Xcoord := p.X;
  720.          SysBtn[i].Ycoord := p.Y;
  721.       end;
  722.       SysBtn[i].CombineOp:=ini.readinteger(s,'CombineOp',-1);
  723.       SysBtn[i].frame:=ini.readinteger(s,'frame',0);
  724.       readbmp(SysBtn[i].map,ini.ReadString(s, 'ButtonImage', ''));
  725.       if sysbtn[i].frame=0 then begin
  726.         sysbtn[i].frame:=6;
  727.         if not sysbtn[i].map.empty then begin
  728.            j:=sysbtn[i].map.width / sysbtn[i].map.height;
  729.            if j>3.8 then
  730.              sysbtn[i].frame:=6
  731.            else
  732.              sysbtn[i].frame:=3;
  733.            if sysbtn[i].action<0 then
  734.              sysbtn[i].frame:=6
  735.         end;
  736.        if sysbtn[i].action in [3,11] then
  737.           sysbtn[i].map.assign(nil);
  738.       end;
  739.    end;
  740.    for i:= n to n+2 do begin
  741.       SysBtn[i]:= TDataSkinSysButton.create(s);
  742.       SysBtn[i].Action:=7+i-n;
  743.       SysBtn[i].Align:=100;
  744.       SysBtn[i].Visibility:=100;
  745.       SysBtn[i].Visibility1:=100;
  746.       SysBtn[i].frame:=4;
  747.    end;
  748.    CreateMdibtn(n);
  749. end;
  750. procedure TSkinData.CreateMdibtn(n:integer);
  751. var bmp:Tbitmap;
  752.     i,w,h:integer;
  753.     r1,r2:Trect;
  754. begin
  755.     bmp:=Tbitmap.create;
  756.     readbmp(bmp,ini.ReadString('MDICONTROLS', 'Image', ''));
  757.     if bmp.empty then begin
  758.        bmp.free;
  759.        exit;
  760.     end;
  761.     w:= bmp.width div 12;
  762.     h:= bmp.height ;
  763.     for i:= 0 to 2 do begin
  764.        SysBtn[n+i].map.width:= w*4;
  765.        SysBtn[n+i].map.height:= h;
  766.        sysbtn[n+i].Xcoord := (3-i)*(w+4);
  767.        r1:=rect(i*4*w,0,(i+1)*4*w,h);
  768.        r2:=rect(0,0,w*4,h);
  769.        SysBtn[n+i].map.canvas.copyrect(r2,bmp.canvas,r1);
  770.     end;
  771.     bmp.free;
  772. end;
  773. procedure TSkinData.CreateMinCaption;
  774. var i,w,h:integer;
  775.     bmp:Tbitmap;
  776.     c1,c2:TColor;
  777.     c0,gradcol1,gradcol2:Tcolor;
  778.     r:Trect;
  779.     s,v:integer;
  780. begin
  781.    if  mincaption=nil then
  782.      mincaption:=TDataSkinObject.create('MinCaption');
  783.    bmp:=Tbitmap.create;
  784.    h:=29;w:=80;
  785.    bmp.Width:=w;
  786.    bmp.Height:=h;
  787.    c0 := GetCaptionColor();
  788.    gradCol1:= Blend(clblack,c0, 50)  ;
  789.    r:=Rect(0,0,w,h);
  790.    bmp.Canvas.Brush.Color:=c0;
  791.    bmp.Canvas.Pen.Color:= gradCol1;
  792.    bmp.canvas.Rectangle(r);
  793.    //GradFill(bmp.canvas.handle,r,gradCol2,gradCol1);
  794.    mincaption.map.assign(bmp);
  795.    mincaption.frame:=1;
  796.    mincaption.r := Rect(3,3,3,3);
  797.    bmp.free;
  798. end;    
  799. procedure TSkinData.ReadObject(var aobject:TDataSkinObject;aname:string);
  800. var s:string;
  801. begin
  802.      if aobject<>nil then begin
  803.        aobject.free;
  804.        aobject:=nil;
  805.      end;
  806.      s:=ini.readstring(aname,'Image','');
  807.      if s='' then exit;
  808.      aobject:=TDataSkinObject.create(aname);
  809.      readbmp(aobject.map,s);
  810.      aobject.style:=ini.readinteger(aname,'Style',0);
  811.      aobject.r.left:=ini.readinteger(aname,'LeftWidth',0);
  812.      aobject.r.right:=ini.readinteger(aname,'RightWidth',0);
  813.      aobject.r.top:=ini.readinteger(aname,'TopHeight',0);
  814.      aobject.r.Bottom:=ini.readinteger(aname,'BottomHeight',0);
  815.      aobject.frame:= ini.readinteger(aname,'Frame',0);
  816.      aobject.trans:=ini.readinteger(aname,'Trans',0);
  817.      aobject.tile:=ini.readinteger(aname,'Tile',0);
  818.      aobject.Normalcolor:=ini.readinteger(aname,'NormalColour',-1);
  819.      aobject.Overcolor:=ini.readinteger(aname,'MouseOverColour',-1);
  820.      aobject.Downcolor:=ini.readinteger(aname,'PressedColour',-1);
  821.      aobject.Normalcolor2:=getcolor(ini.readstring(aname,'NormalColour2',''),colors[csButtonText]);
  822.      aobject.Overcolor2:=getcolor(ini.readstring(aname,'MouseOverColour2',''),colors[csButtonText]);
  823.      aobject.Downcolor2:=getcolor(ini.readstring(aname,'PressedColour2',''),colors[csButtonText]);
  824.      if aobject.tile>1 then aobject.tile:=0;
  825. end;
  826. procedure TSkinData.ReadObject2(var aobject:TDataSkinborder;aname,image2:string);
  827. var s:string;
  828. begin
  829.      if aobject<>nil then begin
  830.        aobject.free;
  831.        aobject:=nil;
  832.      end;
  833.      s:=ini.readstring(aname,'Image','');
  834.      if s='' then exit;
  835.      aobject:=TDataSkinborder.create(aname);
  836.      readbmp(aobject.map,s);
  837.      s:=ini.readstring(aname,Image2,'');
  838.      if s<>'' then
  839.            readbmp(aobject.maskmap,s);
  840.      aobject.style:=ini.readinteger(aname,'Style',0);
  841.      aobject.r.left:=ini.readinteger(aname,'LeftWidth',0);
  842.      aobject.r.right:=ini.readinteger(aname,'RightWidth',0);
  843.      aobject.r.top:=ini.readinteger(aname,'TopHeight',0);
  844.      aobject.r.Bottom:=ini.readinteger(aname,'BottomHeight',0);
  845.      aobject.trans:=ini.readinteger(aname,'Trans',0);
  846.      aobject.tile:=ini.readinteger(aname,'Tile',0);
  847.      aobject.Normalcolor:=ini.readinteger(aname,'NormalColour',-1);
  848.      aobject.Overcolor:=ini.readinteger(aname,'MouseOverColour',-1);
  849.      aobject.Downcolor:=ini.readinteger(aname,'PressedColour',-1);
  850.      aobject.Normalcolor2:=getcolor(ini.readstring(aname,'NormalColour2',''),colors[csButtonText]);
  851.      aobject.Overcolor2:=getcolor(ini.readstring(aname,'MouseOverColour2',''),colors[csButtonText]);
  852.      aobject.Downcolor2:=getcolor(ini.readstring(aname,'PressedColour2',''),colors[csButtonText]);
  853.      if aobject.tile>1 then aobject.tile:=0;
  854. end;
  855. procedure TSkinData.ReadProgress(var aobject:TDataSkinObject;aname:string);
  856. var s:string;
  857. begin
  858.      if aobject<>nil then begin
  859.        aobject.free;
  860.        aobject:=nil;
  861.      end;
  862.      s:=ini.readstring(aname,'Bitmap','');
  863.      if s='' then exit;
  864.      aobject:=TDataSkinborder.create(aname);
  865.      readbmp(aobject.map,s);
  866. //     s:=ini.readstring(aname,'Chunk','');
  867. //     if s<>''  then readbmp(aobject.maskmap,s);
  868.      aobject.style:=ini.readinteger(aname,'Style',0);
  869.      aobject.r.left:=ini.readinteger(aname,'LeftWidth',0);
  870.      aobject.r.right:=ini.readinteger(aname,'RightWidth',0);
  871.      aobject.r.top:=ini.readinteger(aname,'TopHeight',0);
  872.      aobject.r.Bottom:=ini.readinteger(aname,'BottomHeight',0);
  873.      aobject.trans:=ini.readinteger(aname,'Trans',0);
  874.      aobject.tile:=ini.readinteger(aname,'Tile',0);
  875.      if aobject.tile>1 then aobject.tile:=1; 
  876. end;
  877. procedure TSkinData.ReadBoxLabel(var aobject:TDataSkinBoxLabel;aname:string);
  878. var s:string;
  879. begin
  880.      if aobject<>nil then begin
  881.        aobject.free;
  882.        aobject:=nil;
  883.      end;
  884.      s:=ini.readstring(aname,'Image','');
  885.      if s='' then exit;
  886.      aobject:=TDataSkinBoxLabel.create(aname);
  887.      readbmp(aobject.map,s);
  888.      aobject.style:=ini.readinteger(aname,'Style',0);
  889.      aobject.r.left:=ini.readinteger(aname,'LeftWidth',0);
  890.      aobject.r.right:=ini.readinteger(aname,'RightWidth',0);
  891.      aobject.r.top:=ini.readinteger(aname,'TopHeight',0);
  892.      aobject.r.Bottom:=ini.readinteger(aname,'BottomHeight',0);
  893.      aobject.trans:=ini.readinteger(aname,'Trans',0);
  894.      aobject.tile:=ini.readinteger(aname,'Tile',0);
  895.      aobject.Normalcolor:=ini.readinteger(aname,'NormalColour',-1);
  896.      aobject.Overcolor:=ini.readinteger(aname,'MouseOverColour',-1);
  897.      aobject.Downcolor:=ini.readinteger(aname,'PressedColour',-1);
  898.      aobject.Normalcolor2:=getcolor(ini.readstring(aname,'NormalColour2',''),colors[csButtonText]);
  899.      aobject.Overcolor2:=getcolor(ini.readstring(aname,'MouseOverColour2',''),colors[csButtonText]);
  900.      aobject.Downcolor2:=getcolor(ini.readstring(aname,'PressedColour2',''),colors[csButtonText]);
  901.      if aobject.tile>1 then aobject.tile:=0;
  902.      aobject.Alignment:=ini.readinteger(aname,'BackgroundAlignment',0);
  903.      aobject.LeftShift:=ini.readinteger(aname,'BackgroundLeftShift',0);
  904.      aobject.RightShift:=ini.readinteger(aname,'BackgroundRightShift',0);
  905. end;
  906. procedure TSkinData.ReadButton;
  907. var s,s1:string;
  908. begin
  909.      s:='Buttons';
  910.      Button.r.left:=ini.readinteger(s,'LeftWidth',0);
  911.      Button.r.right:=ini.readinteger(s,'RightWidth',0);
  912.      Button.r.top:=ini.readinteger(s,'TopHeight',0);
  913.      Button.r.Bottom:=ini.readinteger(s,'BottomHeight',0);
  914.      Button.trans:=ini.readinteger(s,'Trans',0);
  915.      readbmp(Button.map,ini.readstring(s,'Bitmap',''));
  916.      Button.tile:=ini.readinteger(s,'Tile',0);
  917.      readbmp(Button.checkmap,ini.readstring(s,'CheckButton',''));
  918.      readbmp(Button.radiomap,ini.readstring(s,'RadioButton',''));
  919.      Button.Normalcolor:=ini.readinteger(s,'NormalColour',-1);
  920.      Button.Overcolor:=ini.readinteger(s,'MouseOverColour',-1);
  921.      Button.Downcolor:=ini.readinteger(s,'PressedColour',-1);
  922.      Button.RadioFrame:=ini.readinteger(s,'RadioButtonFrame',0);
  923.      Button.CheckFrame:=ini.readinteger(s,'CheckButtonFrame',0);
  924.      if button.Tile>1 then button.Tile:=0;
  925.      
  926.      s1:=ini.readstring(s,'NormalColour2','');
  927.      if s1<>'' then Button.newnormal := true else Button.newnormal:=false;
  928.      s1:=ini.readstring(s,'MouseOverColour2','');
  929.      if s1<>'' then Button.newover := true else Button.newover:=false;
  930.      s1:=ini.readstring(s,'PressedColour2','');
  931.      if s1<>'' then Button.newdown := true else Button.newdown:=false;
  932.      Button.Normalcolor2:=getcolor(ini.readstring(s,'NormalColour2',''),colors[csButtonText]);
  933.      Button.Overcolor2:=getcolor(ini.readstring(s,'MouseOverColour2',''),colors[csButtonText]);
  934.      Button.Downcolor2:=getcolor(ini.readstring(s,'PressedColour2',''),colors[csButtonText]);
  935. end;
  936. procedure TSkinData.ReadMenuBar(var aobject:TDataSkinObject;aname:string);
  937. var s:string;
  938. begin
  939.      if aobject<>nil then begin
  940.        aobject.free;
  941.        aobject:=nil;
  942.      end;
  943.      s:=ini.readstring(aname,'menuBar','');
  944.      if s='' then exit;
  945.      aobject:=TDataSkinObject.create(aname);
  946.      readbmp(aobject.map,s);
  947.      aobject.r.top:=0;
  948.      aobject.r.bottom:=0;
  949.      aobject.Tile:=ini.readinteger(aname,'TileMenu',1);
  950.      aobject.r.left:=ini.readinteger(aname,'TileLeftMenu',1);
  951.      aobject.r.right:=ini.readinteger(aname,'TileRightMenu',1);
  952.      if aobject.Tile>1 then aobject.Tile:=1;
  953. //     aobject.r.top:=ini.readinteger(aname,'TopHeight',0);
  954. //     aobject.r.Bottom:=ini.readinteger(aname,'BottomHeight',0);
  955. //     aobject.Tile:=ini.readinteger(aname,'Tile',0);
  956. end;
  957. procedure TSkinData.ReadTitle(aobject:TDataSkinObject;aname:string);
  958. var s:string;
  959. begin
  960.      readbmp(aobject.map,ini.readstring(aname,'TextBack',''));
  961.      aobject.r.left:=ini.readinteger(aname,'TextShift',0);
  962.      aobject.r.top:=ini.readinteger(aname,'TextShiftVert',0);
  963.      aobject.r.right:=ini.readinteger(aname,'TextRightClip',0);
  964.      aobject.r.bottom:=0;
  965.      Title.aligment := ini.readinteger(aname,'TextAlignment',0);
  966.      Title.Background := ini.readinteger(aname,'Textbackground',0);
  967.      Title.FontHeight := ini.readinteger('Fonts','FontHeight',14);
  968.      Title.BackLeft := ini.readinteger(aname,'TXTBackleft',0);
  969.      Title.BackRight := ini.readinteger(aname,'TXTBackRight',0);
  970.      Title.activetext:= clnone;
  971.      Title.inactivetext:=clnone;
  972.      ReadRGB(aname,'ActiveText',Title.activetext);
  973.      ReadRGB(aname,'InActiveText',Title.inactivetext);
  974. end;
  975. {procedure TSkinData.RebuildToolbar;
  976. var bmp:Tbitmap;
  977.     w,i,h : integer;
  978.     r1,r2:Trect;
  979. begin
  980.    if toolbar<>nil then exit;
  981.    if statusbar=nil then exit;
  982.    bmp :=Tbitmap.create;
  983.    w:=statusbar.map.width div statusbar.frame;
  984.    bmp.Width := w - statusbar.r.Left-statusbar.r.Right;
  985.    h:=statusbar.Map.Height;
  986.    bmp.Height := h-statusbar.r.Top;
  987.    r1:=Rect(statusbar.r.Left,statusbar.r.Top,w-statusbar.r.Right,bmp.Height);
  988.    r2:=Rect(0,0,bmp.Width,bmp.Height);
  989.    bmp.Canvas.CopyRect(r2,statusbar.Map.canvas,r1);
  990.    toolbar:=TDataSkinObject.create('Toolbar');
  991.    toolbar.Map.Assign(bmp);
  992.    toolbar.r.Bottom:=statusbar.r.Bottom;
  993.    toolbar.frame:=1;
  994.    bmp.free;
  995. end;}
  996. procedure TSkinData.RebuildToolbar;
  997. var bmp:Tbitmap;
  998.     c0,gradcol1,gradcol2:Tcolor;
  999.     r:Trect;
  1000.     s,v:integer;
  1001. begin
  1002.    bmp :=Tbitmap.create;
  1003.    bmp.Width := 10 ;
  1004.    bmp.Height := 40;
  1005.    c0 := GetCaptionColor();
  1006.    gradCol1:= Blend(clgray,c0, 150)  ;
  1007.    gradCol2:= Blend(colors[csButtonFace],clwhite, 150)  ;
  1008.    s:= GetHSV(c0);
  1009.    if s>110 then begin
  1010.       v:= 50+25*(225-s) div 140;
  1011.       gradCol1:= Blend(c0,clwhite,v);
  1012.    end;
  1013.    r:=Rect(0,0,bmp.Width,bmp.Height);
  1014.    GradFill(bmp.canvas.handle,r,gradCol2,gradCol1);
  1015.    if toolbar=nil then
  1016.       toolbar:=TDataSkinObject.create('Toolbar');
  1017.    toolbar.Map.Assign(bmp);
  1018.    toolbar.frame:=1;
  1019.    bmp.free;
  1020. end;
  1021. procedure TSkinData.CreateCaptionFont;
  1022. var
  1023.   NonClientMetrics: TNonClientMetrics;
  1024. begin
  1025.   If Assigned(CaptionFont) then FreeAndNIL(CaptionFont);
  1026.   CaptionFont := TFont.Create;
  1027.   NonClientMetrics.cbSize := SizeOf(NonClientMetrics);
  1028.   if SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, @NonClientMetrics, 0) then
  1029.     CaptionFont.Handle := CreateFontIndirect(NonClientMetrics.lfCaptionFont);
  1030. end;
  1031. procedure TSkinData.CreateLogo;
  1032. var s:string;
  1033.     r:Trect;
  1034.     font:Tfont;
  1035. begin
  1036.    s:='VCLSkin Demo';
  1037.    font:=Tfont.Create;
  1038.    font.Name:='Tahoma MS';
  1039.    font.Size:=10;
  1040.    font.Style:=[fsBold];
  1041. //   logo.Transparent:=true;
  1042. //   logo.TransparentColor:=clwhite;//clFuchsia;
  1043.    logo.Canvas.Font:=font;//captionfont;
  1044.    r:=Rect(0,0,50,30);
  1045.    DrawTextA(logo.canvas.Handle,pchar(s),-1,r, DT_CALCRECT or DT_NOCLIP);
  1046.    if (r.Right<150) and (r.Bottom<20) then begin
  1047.       logo.Width:=r.Right+2;
  1048.       logo.Height:=r.Bottom+2;
  1049.       logo.canvas.Brush.color:= clwhite;//clFuchsia;
  1050.       logo.Canvas.Rectangle(rect(0,0,r.Right+2,r.Bottom+2));
  1051. //   logo.Canvas.FillRect(rect(0,0,logo.width,logo.Height));
  1052.       SetBkMode(logo.Canvas.Handle, TRANSPARENT);
  1053.       offsetrect(r,1,1);
  1054.       DrawText(logo.canvas.Handle,pchar(s),-1,r, 0);
  1055.    end;
  1056.    font.free;
  1057. end;
  1058. procedure TSkinData.ReBuildComboxArrow;
  1059. var bmp:Tbitmap;
  1060.     i,cw,w:integer;
  1061.     r1,r2:Trect;
  1062. begin
  1063.    if comboxarrow=nil then
  1064.       comboxarrow:= TDataSkinObject.create('ComboxArrow');
  1065.    if (Comboxborder=nil) then begin
  1066.      if (combox<>nil) then begin
  1067.        comboxarrow.Map.Assign(combox.Map);
  1068.        ChangeTrans(comboxarrow.Map,colors[csButtonface]);
  1069.        comboxarrow.frame := combox.frame;
  1070.      end;
  1071.      exit;
  1072.    end;
  1073.    if (combox.style<>2) then exit;
  1074.    cw:=17;
  1075.    bmp:=Tbitmap.create;
  1076.    bmp.Height:=cw;
  1077.    bmp.Width:= cw*ComBoxborder.frame;
  1078.    w:= combox.map.width div  ComBoxborder.frame;
  1079.    
  1080.    for i:= 1 to ComBoxborder.frame do begin
  1081.      r1:= Rect(i*w-2-cw,2,i*w-2,19);
  1082.      r2:= rect((i-1)*cw,0,i*cw,cw);
  1083.      bmp.Canvas.CopyRect(r2,combox.map.Canvas,r1);
  1084.    end;
  1085.    comboxarrow.frame:=ComBoxborder.frame;
  1086.    comboxarrow.Map.Assign(bmp);
  1087.    bmp.free;
  1088. end;
  1089. procedure TSkinData.ReBuildCombobox;
  1090. var temp,bmp:Tbitmap;
  1091.     w1,i,h : integer;
  1092.     r1,r2:Trect;
  1093. begin
  1094.   if (Comboxborder=nil) or (combox=nil) then exit;
  1095.   bmp :=Tbitmap.create;
  1096.   temp :=Tbitmap.create;
  1097.   temp.Height := 21;
  1098.   temp.Width := 50;
  1099.   bmp.height := temp.Height;
  1100.   bmp.Width := temp.Width*ComBoxborder.frame;
  1101.   bmp.PixelFormat := pf24Bit ;
  1102.   temp.Canvas.Brush.color := clFuchsia;
  1103.   bmp.Canvas.Brush.color := clFuchsia;
  1104.   bmp.canvas.FillRect(rect(0,0,bmp.width,bmp.height));
  1105.   w1 := GetSystemMetrics( SM_CXHSCROLL )+2;
  1106.   h:=21;
  1107.   r1:=rect(0,0,50,h);
  1108.   r2:=r1;
  1109.   r2.left := r1.right-w1;
  1110.   for i:= 1 to ComBoxborder.frame do begin
  1111.      DrawRect2(temp.canvas.Handle,r1,ComBoxborder.map,ComBoxborder.r,
  1112.         i,ComBoxborder.frame,ComBoxborder.trans);
  1113.      DrawRect2(temp.canvas.Handle,r2,ComBox.map,ComBox.r,
  1114.         i,ComBox.frame,1);
  1115.      if ExtraImages<>nil then
  1116.         DrawRect3(temp.canvas.Handle,r2,ExtraImages.map,
  1117.                   i,ExtraImages.frame,1);
  1118.      temp.canvas.FillRect(rect(2,2,50-w1-1,h-3));
  1119.      bmp.canvas.draw((i-1)*50,0,temp);
  1120.   end;
  1121.   combox.style:=2;
  1122.   combox.r := comboxborder.r;
  1123.   combox.r.right:=w1+2;
  1124.   combox.r.left:= 2;
  1125.   combox.Map.Assign(bmp);
  1126. //  copybmp(bmp,combox.Map);//combox.Map.Assign(bmp);
  1127.   SpiegelnHorizontal(bmp);
  1128.   //copybmp(bmp,comboxborder.Map);
  1129.   ComBoxborder.Map.Assign(bmp);
  1130.   ComBoxborder.r.left:=w1+2;
  1131.   ComBoxborder.r.right:= 2;
  1132.   bmp.free;
  1133.   temp.free;
  1134. end;
  1135. procedure TSkinData.ReadTrack(var aobject:TDataSkinObject;aname:string);
  1136. begin
  1137.      if aobject<>nil then begin
  1138.        aobject.free;
  1139.        aobject:=nil;
  1140.      end;
  1141.      aobject:=TDataSkinObject.create(aname);
  1142.      aobject.Map.LoadFromResourceName(hinstance,aname);
  1143.      aobject.r:= Rect(3,3,3,3);
  1144.      aobject.Tile:= 0;
  1145.      aobject.frame:=1;
  1146. end;
  1147. function StrToWideStr(const S: AnsiString): WideString;
  1148. var
  1149.   InputLength,
  1150.   OutputLength: Integer;
  1151. begin
  1152.     InputLength := Length(S);
  1153.     OutputLength := MultiByteToWideChar(DefaultUserCodePage, 0, PAnsiChar(S), InputLength, nil, 0);
  1154.     SetLength(Result, OutputLength);
  1155.     MultiByteToWideChar(DefaultUserCodePage, 0, PAnsiChar(S), InputLength, PWideChar(Result), OutputLength);
  1156. end;
  1157. function WideStringToStringEx(const WS: WideString): AnsiString;
  1158. var
  1159.   InputLength,
  1160.   OutputLength: Integer;
  1161. begin
  1162.     InputLength := Length(WS);
  1163.     OutputLength := WideCharToMultiByte(DefaultUserCodePage, 0, PWideChar(WS), InputLength, nil, 0, nil, nil);
  1164.     SetLength(Result, OutputLength);
  1165.     WideCharToMultiByte(DefaultUserCodePage, 0, PWideChar(WS), InputLength, PAnsiChar(Result), OutputLength, nil, nil);
  1166. end;
  1167. function _WStr(lpString: PWideChar; cchCount: Integer): WideString;
  1168. begin
  1169.   if cchCount = -1 then
  1170.     Result := lpString
  1171.   else
  1172.     Result := Copy(WideString(lpString), 1, cchCount);
  1173. end;
  1174. function Tnt_DrawTextW(hDC: HDC; wString: WideString;var lpRect: TRect; uFormat: UINT): Integer;
  1175. var lpString:  PWideChar;
  1176.     ncount:integer;
  1177. begin
  1178.   lpstring:=PWideChar(wstring);
  1179.   ncount:=length(wstring);
  1180.   if Win32PlatformIsUnicode then
  1181.     Result := DrawTextW(hDC, lpString, nCount, lpRect, uFormat)
  1182.   else
  1183.     Result := DrawTextA(hDC,
  1184.       PAnsiChar(AnsiString(_WStr(lpString, nCount))), -1, lpRect, uFormat);
  1185. end;
  1186. function RGBToColor(R,G,B:Byte): TColor;
  1187. begin
  1188.   Result:=B Shl 16 Or
  1189.           G Shl 8  Or
  1190.           R;
  1191. end;
  1192. {procedure CopyBMP(sbmp,dbmp:TBitMap);
  1193. begin
  1194.     dbmp.Width:=sbmp.Width;
  1195.     dbmp.Height:=sbmp.Height;
  1196.     dbmp.PixelFormat:=sbmp.PixelFormat;
  1197.     dbmp.Canvas.Draw(0,0,sbmp);
  1198. end;}
  1199. function strcolor(s:string):Tcolor;
  1200. var i,j,l,n:integer;
  1201.     a:array[1..3]of integer;
  1202.     s2:string;
  1203. begin
  1204.    result:=0;
  1205.    if s='' then exit;
  1206.    s:=trim(s);
  1207.    l:=length(s);
  1208.    for i:=1 to 3 do a[i]:=0;
  1209.    j:=1;i:=1;s2:='';
  1210.    while (i<=l) do begin
  1211.      if s[i] in ['0'..'9'] then s2:=s2+s[i]
  1212.      else begin
  1213.         try
  1214.           if s2<>'' then begin
  1215.              a[j]:=strtoint(s2);
  1216.              inc(j);s2:='';
  1217.           end;
  1218.         except
  1219.         end;
  1220.         //inc(j);s2:='';
  1221.      end;
  1222.      inc(i);
  1223.    end;
  1224.    try
  1225.      if j=3 then a[3]:=strtoint(s2);
  1226.    except
  1227.    end;
  1228.    result:=rgb(a[1],a[2],a[3]);
  1229. end;
  1230. function FindControlx(Handle: HWnd): TWinControl;
  1231. begin
  1232.   Result := nil;
  1233.   if Handle <> 0 then  begin
  1234. {$ifdef COMPILER_6_UP}
  1235.    result:= pointer(SendMessage(handle, RM_GetObjectInstance, 0, 0));
  1236. {$else}
  1237.     Result := Pointer(GetProp(Handle, MakeIntAtom(ControlAtom)));
  1238. {$endif}
  1239.   end;
  1240. end;
  1241. function TSkinData.GetColor(const s1:string;acolor:Tcolor):Tcolor;
  1242. begin
  1243.    result:=acolor;
  1244.    if s1<>'' then result:=strcolor(s1);
  1245. end;
  1246. procedure TSkinData.ReadColor2(item: TShemeColor;key:string;cdefault:Tcolor);
  1247. var s:string;
  1248. begin
  1249.    s:=ini.readstring('Colours',key,'');
  1250.    if (s='') then begin
  1251.       hasColors[item] := false;
  1252.       Colors[item] := cdefault;
  1253.    end else begin
  1254.       hasColors[item]:=true;
  1255.       Colors[item]:=strcolor(s);
  1256.    end;
  1257. end;
  1258. procedure TSkinData.ReadColor;
  1259. var s,s1:string;
  1260.     n,i:integer;
  1261.     b,r,g:byte;
  1262. begin
  1263. //  TShemeColor=(csText,csTitleTextActive,csTitleTextNoActive,
  1264. //         csButtonFace,csSelectText,csSelectBg,csTextDisable);
  1265.    s:='Colours';
  1266.    s1:=ini.readstring(s,'ButtonFace','');
  1267.    readcolor2(csText,'WindowText',clWindowText);
  1268.    readcolor2(csButtonFace,'ButtonFace',clBtnFace);
  1269.    readcolor2(csScrollbar,'Scrollbar',clscrollbar);
  1270.    readcolor2(csHilightText,'HilightText',clHighlightText);
  1271.    readcolor2(csHilight,'Hilight',clHighlight);
  1272.    readcolor2(csMenuBar,'Menubar',colors[csButtonFace]);
  1273.    readcolor2(csMenuBG,'Menu',clMenu);
  1274.    readcolor2(csMenuText,'MenuText',clMenuText);
  1275.    readcolor2(csButtonText,'ButtonText',clBtnText);
  1276.    readcolor2(csButtonHilight,'ButtonHilight',clBtnHighlight);
  1277.    readcolor2(csButtonlight,'Buttonlight',clBtnHighlight);
  1278.    readcolor2(csButtonShadow,'ButtonShadow',clBtnShadow);
  1279.    readcolor2(csButtonDkShadow,'ButtonDkShadow',cl3DDkShadow);
  1280.    readcolor2(csMenuBarText,'MenuBarText',clMenuText);
  1281.    readcolor2(csTitleTextActive,'TitleTextActive',clcaptionText);
  1282.    readcolor2(csTitleTextNoActive,'TitleTextNoActive',clinactivecaptionText);   
  1283. {   colors[csText]:=getcolor(ini.readstring(s,'WindowText',''),clWindowText);
  1284.    colors[csButtonFace]:=getcolor(ini.readstring(s,'ButtonFace',''),clBtnFace);
  1285.    colors[csScrollbar]:=getcolor(ini.readstring(s,'Scrollbar',''),clscrollbar);
  1286.    colors[csHilightText]:=getcolor(ini.readstring(s,'HilightText',''),clHighlightText);
  1287.    colors[csHilight]:=getcolor(ini.readstring(s,'Hilight',''),clHighlight);
  1288.    colors[csMenuBar]:=getcolor(ini.readstring(s,'Menubar',''),colors[csButtonFace]);
  1289.    colors[csMenuBG]:=getcolor(ini.readstring(s,'Menu',''),clMenu);
  1290.    colors[csMenuText]:=getcolor(ini.readstring(s,'MenuText',''),clMenuText);
  1291.    colors[csButtonText]:=getcolor(ini.readstring(s,'ButtonText',''),clBtnText);
  1292.    colors[csButtonHilight]:=getcolor(ini.readstring(s,'ButtonHilight',''),clBtnHighlight);
  1293.    colors[csButtonlight]:=getcolor(ini.readstring(s,'Buttonlight',''),clBtnHighlight);
  1294.    colors[csButtonShadow]:=getcolor(ini.readstring(s,'ButtonShadow',''),clBtnShadow);
  1295.    colors[csButtonDkShadow]:=getcolor(ini.readstring(s,'ButtonDkShadow',''),cl3DDkShadow);
  1296.    colors[csMenuBarText]:=getcolor(ini.readstring(s,'MenuBarText',''),clMenuText);
  1297.    colors[csTitleTextActive]:=getcolor(ini.readstring(s,'TitleTextActive',''),clcaptionText);
  1298.    colors[csTitleTextNoActive]:=getcolor(ini.readstring(s,'TitleTextNoActive',''),clinactivecaptionText);}
  1299.    ini.ReadSections(sectionlist);
  1300.    for i:= sectionlist.count-1 downto 0 do begin
  1301.       s:=Uppercase(sectionlist.strings[i]);
  1302.       if (s='COLOURS') or (pos('COLOUR',s)<>1) then
  1303.          sectionlist.delete(i);
  1304.    end;
  1305.    n:=sectionlist.count;
  1306.    setlength(colorPreset,n);
  1307.    for i:=0 to n-1 do begin
  1308.      s:=Uppercase(sectionlist.strings[i]);
  1309.      colorPreset[i]:=getcolor(ini.readstring(s,'color',''),clWindowText);
  1310.    end;
  1311. //   setlength(colorPreset,10);
  1312.    for i:= 0 to high(PresetColors) do begin
  1313.       PresetColors[i] := getcolor(ini.readstring('Customcolors','Color'+inttostr(i),''),clwhite);
  1314.    end;
  1315. {//  TShemeColor=(csText,csTitleTextActive,csTitleTextNoActive,
  1316. //   ReadRGB('Personality','MenuText',colors[csMenuBarText]);
  1317. //   ReadRGB('Personality','ActiveText',colors[csTitleTextActive]);
  1318. //   ReadRGB('Personality','InactiveText',colors[csTitleTextNoActive]);
  1319.    n:=getsectionnum('Colour','B');
  1320.    setlength(colorPreset,n);
  1321.    for i:=0 to n-1 do begin
  1322.      r:=ini.readinteger(format('Colour%1d',[i]),'R',0);
  1323.      g:=ini.readinteger(format('Colour%1d',[i]),'G',0);
  1324.      b:=ini.readinteger(format('Colour%1d',[i]),'B',0);
  1325.      colorPreset[i]:=rgbtocolor(r,g,b);
  1326.    end;}
  1327. end;
  1328. Procedure TSkinData.ReadRGB(Section,aname:string;var value:Tcolor);
  1329. var a:array[1..3] of integer;
  1330.     R : Array [1..3] of string;
  1331.     i:integer;
  1332. begin
  1333.     R[1]:='R';R[2]:='G';R[3]:='B';
  1334.     for i:= 1 to 3 do begin
  1335.         a[i]:=ini.readinteger(section,aname+r[i],-1);
  1336.     end;
  1337.     if (a[1]>=0) and (a[2]>=0) and (a[3]>=0) then
  1338.     value:=rgb(a[1],a[2],a[3]);
  1339. //    value:=RGBToColor(a[1],a[2],a[3]);
  1340. end;
  1341. function TSkinData.GetSectionNum(asection,aname:string):integer;
  1342. var i:integer;
  1343.     s:string;
  1344. begin
  1345.    i:=0;
  1346.    s:=ini.readstring(format('%s%1d',[asection,i]),aname,'');
  1347.    while s<>'' do begin
  1348.       inc(i);
  1349.       s:=ini.readstring(format('%s%1d',[asection,i]),aname,'');
  1350.    end;
  1351.    result:=i;
  1352. end;
  1353. procedure TSkinData.Uninstall;
  1354. begin
  1355.     SkinManager.setaction(skin_Uninstall);
  1356. end;
  1357. procedure TSkinData.Install;
  1358. begin
  1359.     SkinManager.setaction(skin_Active);
  1360. end;
  1361. procedure TSkinData.DoFormSkin(ahwnd:Thandle;aname:string;var Doskin:boolean);
  1362. begin
  1363.     formhwnd:=ahwnd;
  1364.     if assigned(fOnformskin) then fOnformskin(self,aname,doskin)
  1365. //    else if aname='TQRStandardPreview' then doskin:=false
  1366.     else if aname='SysMonthCal32' then doskin:=false
  1367. //    else if aname='TppPrintPreview' then doskin:=false
  1368. //    else if aname='TdxfmStdPreview' then doskin:=false
  1369.     else if (xcFastReport in SkinControls) and (pos('Tfr',aname)=1) then doskin:=false;
  1370. end;
  1371. procedure TSkinData.DoSkinChanged;
  1372. begin
  1373.     if assigned(fOnSkinChanged) then
  1374.       fOnSkinChanged(self);
  1375. end;
  1376. procedure TSkinData.AddNestForm(fParent,fNested:TWincontrol);
  1377. var i:integer;
  1378.     sf :TWinSkinform;
  1379.     spy:TWinSkinspy;
  1380. begin
  1381.    if fNested=nil then exit;
  1382.    for i:=0 to SkinManager.flist.count-1 do begin
  1383.       sf:=TWinSkinform(SkinManager.flist[i]);
  1384.       if sf.hwnd=fParent.handle then begin
  1385.          spy := TWinSkinspy.Create(fNested);
  1386.          spy.sf:=sf;
  1387. //         sf.InitControls(fparent);
  1388.          sf.InitNestform(Tform(fNested));
  1389.          break;
  1390.       end;
  1391.    end;
  1392. end;
  1393. procedure TSkinData.UpdateSkinControl(fParent:Tform;acontrol:Twincontrol=nil);
  1394. var i:integer;
  1395.     sf :TWinSkinform;
  1396. begin
  1397.    for i:=0 to SkinManager.flist.count-1 do begin
  1398.       sf:=TWinSkinform(SkinManager.flist[i]);
  1399.       if sf.hwnd=fParent.handle then begin
  1400.          if acontrol=nil then  sf.InitControls(fparent)
  1401.          else sf.InitControls(acontrol);
  1402.          break;
  1403.       end;
  1404.    end;
  1405. end;
  1406. procedure TSkinData.ChangeForm(aform:Tform);
  1407. begin
  1408. //   postmessage(skinmanager.handle,CN_SkinNotify,skin_update,aform.handle);
  1409.     skinmanager.lpara:=aform.handle;
  1410.     skinmanager.UpdateData:=self;
  1411.     skinmanager.setaction(skin_update);
  1412. end;
  1413. procedure TSkinData.DoDebug(s:string);
  1414. begin
  1415.   if debuglist<>nil then
  1416.        debuglist.Add(s);
  1417. end;
  1418. procedure TSkinData.ActivateHint(aRect: TRect; const AHint: string);
  1419. var r:Trect;
  1420. begin
  1421.   if not( xoCaptionButtonHint in fskinoptions) then exit; 
  1422.   if hashint then Exit;
  1423.   r:= fhintwindow.CalcHintRect(500,AHint,nil);
  1424.   OffsetRect(r,aRect.Left,aRect.Top);
  1425.   fhintwindow.ActivateHint(r,AHint);
  1426.   hashint:=true;
  1427. //  DoDebug('hint show :'+inttostr(hintcount ));
  1428. end;
  1429. function TSkinData.IsHint:Boolean;
  1430. begin
  1431.   result:=hashint;
  1432. end;
  1433. procedure TSkinData.HideHint;
  1434. begin
  1435.   if hashint then begin
  1436.     ShowWindow(fhintwindow.Handle, SW_HIDE);
  1437.     hashint:=false;
  1438. //    DoDebug('hint hide :'+inttostr(hintcount ));
  1439.   end;
  1440. end;
  1441. procedure TSkinData.EnableSkin(b:boolean);
  1442. begin
  1443.    skinmanager.active:=b;
  1444. end;
  1445. procedure TSkinData.DeleteGraphicControl(fParent:Tform;acontrol:TGraphicControl);
  1446. var i,j:integer;
  1447.     sf :TWinSkinform;
  1448.     sc:Tskincontrol;
  1449. begin
  1450.    for i:=0 to SkinManager.flist.count-1 do begin
  1451.       sf:=TWinSkinform(SkinManager.flist[i]);
  1452.       if sf.hwnd=fParent.handle then begin
  1453.          for j:= 0 to sf.controllist.count-1 do begin
  1454.             sc:= Tskincontrol(sf.controllist.items[j]);
  1455.             if sc.GControl = acontrol then begin
  1456.                sf.controllist.Delete(j);
  1457.                sc.free;
  1458.                break;
  1459.             end;
  1460.          end;
  1461.       end;
  1462.    end;
  1463. end;
  1464. procedure TSkinData.SkinForm(ahwnd:THandle);
  1465. begin
  1466.    SkinManager.skinchildform:=true;
  1467.    SkinManager.addform(ahwnd);
  1468.    SkinManager.skinchildform:=false;
  1469. end;
  1470. procedure TSkinData.UpdateMenu(fParent:Tform);
  1471. var i:integer;
  1472.     sf :TWinSkinform;
  1473. begin
  1474.    for i:=0 to SkinManager.flist.count-1 do begin
  1475.       sf:=TWinSkinform(SkinManager.flist[i]);
  1476.       if sf.hwnd=fParent.handle then begin
  1477.          sf.InitPopMenu(fParent,true,true);
  1478.          break;
  1479.       end;
  1480.    end;
  1481. end;
  1482. procedure TSkinData.UpdateMainMenu(done:boolean);
  1483. var i:integer;
  1484.     sf :TWinSkinform;
  1485. begin
  1486.    menumsg:=done;
  1487.    if not menumsg then exit;
  1488.    for i:=0 to SkinManager.flist.count-1 do begin
  1489.       sf:=TWinSkinform(SkinManager.flist[i]);
  1490.       if (sf.menu<>nil) then begin
  1491.          sf.menu.updatabtn;
  1492.          //break;
  1493.       end;
  1494.    end;
  1495. end;
  1496. procedure TSkinData.InstallThread(aThreadID:integer);
  1497. begin
  1498.    skinmanager.installthread(athreadid);
  1499. end;
  1500. procedure TSkinData.UnInstallThread(aThreadID:integer);
  1501. begin
  1502.     SkinManager.UnInstallThread(aThreadID);
  1503. end;
  1504. procedure TSkinData.LoadFromFile(value:string);
  1505. begin
  1506.    empty:=true;
  1507.    fskinfile:=value;
  1508.    if (csDesigning in ComponentState) then begin
  1509.     if (value<>'') and (data.size>0) then data.clear;
  1510.     Exit;
  1511.    end;
  1512.    if not fileexists(value) then exit;
  1513.    data.clear;
  1514.    data.loadfromfile(value);
  1515.    LoadSkin;
  1516. //   skinmanager.setaction(skin_change);
  1517. //   if ftype=sfMainform then
  1518.    UpdateSkin;
  1519. //   else showmessage('Skin file format error !');
  1520. end;
  1521. procedure TSkinData.LoadFromStream(Stream: TStream);
  1522. begin
  1523.    empty:=true;
  1524.    data.clear;
  1525.    data.LoadFromStream(stream);
  1526.    LoadSkin;
  1527.    if ftype=sfMainform then
  1528.    UpdateSkin;
  1529. //   skinmanager.setaction(skin_change);
  1530. end;
  1531. procedure TSkinData.LoadFromCollection(astore:TSkinStore;aindex:integer);
  1532. var aitem:TSkinCollectionItem;
  1533. begin
  1534.    if astore.Store.count<=aindex then exit;
  1535.    empty:=true;
  1536.    data.clear;
  1537.    aitem:=TSkinCollectionItem(astore.Store.items[aindex]);
  1538.    aitem.fdata.Position := 0;
  1539.    data.LoadFromStream(aitem.fdata);
  1540.    LoadSkin;
  1541. //   if ftype=sfMainform then
  1542.    UpdateSkin;
  1543. end;
  1544. function TSkinData.LoadSkin:boolean;
  1545. var fpath,fini:string;
  1546.     PathBuffer : array [0..255] of char;
  1547.     b:boolean;
  1548. begin
  1549.    empty:=true;
  1550.    if csDesigning in ComponentState then exit;
  1551.    GetTempPath (256, PathBuffer);
  1552.    fpath := StrPas(PathBuffer);
  1553.    reader:=TSkinReader.create;
  1554.    ms := TMemorystream.create;
  1555.    b:=reader.loadfromstream(data);
  1556.    if b then begin
  1557.      ini := TQuickIni.Create;
  1558.      reader.readini('.ini',ms,fini);
  1559.      fini:=fpath+fini;
  1560.      try
  1561.         ms.Seek(0,soFromBeginning);
  1562.         ini.LoadFromStream(ms);
  1563. //        ms.savetofile(fini);
  1564.         loadfromini(fini);
  1565. //        deletefile(fini);
  1566.      finally
  1567.         reader.free;
  1568.         ms.free;
  1569.         ini.free;
  1570.      end;
  1571.    end;
  1572.    result:=b;
  1573. end;
  1574. procedure TSkinData.LoadFromIni(filename:string);
  1575. begin
  1576. //  ini := TIniFile.Create(FileName);
  1577.   sectionlist:=Tstringlist.create;
  1578.   ini.ReadSections(sectionlist);
  1579.   //
  1580.   SkinName := ini.ReadString('TitlebarSkin', 'SkinName', '');
  1581.   //
  1582.   Readbord;
  1583.   readcolor;
  1584.   ReadSysbutton;
  1585.   Readbutton;
  1586.   readtitle(Title,'Personality');
  1587.   readProgress(Progress,'Progress');
  1588.   readobject(ProgressChunk,'Progress.Chunk');
  1589.   readMenuBar(MenuBar,'Personality');
  1590.   readobject(Box,'GroupBoxEdge');
  1591.   ReadBoxLabel(boxlabel,'GroupBox');
  1592.   readobject2(Tab,'Tabs','Border');
  1593.   readobject(StatusBar,'StatusBarEdges');
  1594.   readobject(TabSheet,'Tab.Pane');
  1595.   if (tabsheet<>nil) then begin
  1596.      if (tabsheet.r.top>4) then tabsheet.r.top:=4  ;
  1597.      if (tabsheet.r.left>4) then tabsheet.r.left:=4  ;
  1598.      if (tabsheet.r.right>4) then tabsheet.r.right:=4  ;
  1599.      if (tabsheet.r.bottom>4) then tabsheet.r.bottom:=4  ;
  1600.   end;
  1601.   //Readobject(toolbar,'ToolBarBackground');
  1602.   Readobject(toolbarbtn,'ToolBars');
  1603. //  ReadToolbar(Toolbar,'Toolbars');
  1604. //  readobject(ComBox,'ComboButton');
  1605.   readobject2(ComBox,'ComboButton','****');
  1606.   readobject(ComBoxborder,'SunkEdge');
  1607.   if (combox<>nil) and ( not combox.Map.empty) then begin
  1608.      combox.MaskMap.assign(combox.Map);
  1609.      combox.MaskMap.PixelFormat:= pf24bit;
  1610.      SpiegelnHorizontal(combox.MaskMap);
  1611.   end;
  1612.   readobject(ExtraImages,'ExtraImages');
  1613.   readobject(header,'Headerbar');
  1614.   readObject(MenuItem,'MenuItem');
  1615.   readObject(MenuItemBG,'MenuBackground');
  1616.   readobject(SArrow,'Scrollbar');
  1617.   readobject(HBar,'HorzScroll');
  1618.   readobject(VBar,'VertScroll');
  1619.   readobject(HSlider,'HorzScrollThumb');
  1620.   readobject(VSlider,'VertScrollThumb');
  1621.   readobject(TrackHorz,'Trackbar.ThumbHorz');
  1622.   readobject(TrackVert,'Trackbar.ThumbVert');
  1623.   readobject(TrackLeft,'Trackbar.ThumbLeft');
  1624.   readobject(TrackRight,'Trackbar.ThumbRight');
  1625.   readobject(TrackTop,'Trackbar.ThumbUp');
  1626.   readobject(TrackBottom,'Trackbar.ThumbDown');
  1627.   readobject2(HSpin,'UpDown.Horz','GlyphImage');
  1628.   readobject2(VSpin,'UpDown.Vert','GlyphImage');
  1629.   readobject(TrackBar,'Track');
  1630.   readobject(Trackbarvert,'TRACKVERT');
  1631.   if trackbar=nil then
  1632.      ReadTrack(Trackbar,'TRACK');
  1633.   if trackbarvert=nil then
  1634.      ReadTrack(Trackbarvert,'TRACKVERT');
  1635.   
  1636.   SetFrame;
  1637.   ReBuildCombobox;
  1638.   ReBuildComboxArrow;
  1639.   RebuildToolbar;
  1640.   colors[csCaption]:=GetCaptionColor;
  1641.   if BGBrush<>0 then begin
  1642.      deleteobject(BgBrush);
  1643.      BGBrush:=0;
  1644.   end;
  1645.   BGBrush:=CreateSolidBrush(colors[csButtonFace]);
  1646.   sectionlist.free;
  1647.   Empty := False;
  1648. end;
  1649. procedure TSkinData.SetFrame;
  1650. var i:integer;
  1651.     w:integer;
  1652. begin
  1653. //  ReadSysbutton;
  1654. //  Readbutton;
  1655.   button.frame:=5;
  1656.   if button.radioframe=0 then begin
  1657.     if button.radiomap.height>=16 then w:=16
  1658.     else w:=13;
  1659.     button.radioframe:= button.radiomap.width div w;
  1660.     if button.radioframe<4 then button.radioframe:=4;
  1661.   end;
  1662.   if button.checkframe=0 then begin
  1663.     if button.checkmap.height>=16 then w:=16
  1664.     else w:=13;
  1665.     button.checkframe:= button.checkmap.width div w;
  1666.     if button.checkframe<4 then button.checkframe:=4;
  1667.   end;
  1668. //  for i:= 0 to length(sysbtn)-1 do
  1669. //      sysbtn[i].frame:=5;
  1670.   if title<>nil then Title.frame:=2;
  1671.   if Progress<>nil then begin
  1672.      if progress.style=0 then
  1673.      Progress.frame:=2
  1674.      else
  1675.      Progress.frame:=1;
  1676.   end;
  1677.   if MenuBar<>nil then MenuBar.frame:=2;
  1678.   if Box<>nil then Box.frame:=2;
  1679.   if Toolbar<>nil then Toolbar.frame:=1;
  1680.   if Toolbarbtn<>nil then toolbarbtn.frame:=5;
  1681.   if Tab<>nil then Tab.frame:=5;
  1682.   if TabSheet<>nil then TabSheet.frame:=1;
  1683. //  if MinCaption<>nil then MinCaption.frame:=1;
  1684.   if StatusBar<>nil then StatusBar.frame:=3;
  1685.   if BoxLabel<>nil then BoxLabel.frame:=1;
  1686.   if ComBox<>nil then ComBox.frame:=4;
  1687.   if ComBoxborder<>nil then ComBoxborder.frame:=4;
  1688.   if ExtraImages<>nil then ExtraImages.frame:=5;
  1689.   if (header<>nil) and (header.frame=0) then header.frame:=5;
  1690.   if MenuItem<>nil then MenuItem.frame:=5;
  1691.   if MenuItemBG<>nil then MenuItemBG.frame:=1;
  1692.   if SArrow<>nil then SArrow.frame:=23;
  1693.   if HBar<>nil then Hbar.frame:=4;
  1694.   if VBar<>nil then Vbar.frame:=4;
  1695.   if VSpin<>nil then VSpin.frame := 8;
  1696.   if HSpin<>nil then HSpin.frame := 8;
  1697.   if TrackHorz<>nil then TrackHorz.frame := 5;
  1698.   if TrackVert<>nil then TrackVert.frame := 5;
  1699.   if TrackLeft<>nil then TrackLeft.frame := 5;
  1700.   if TrackRight<>nil then TrackRight.frame := 5;
  1701.   if TrackTop<>nil then TrackTop.frame := 5;
  1702.   if TrackBottom<>nil then TrackBottom.frame := 5;
  1703.   if hslider<>nil then
  1704.     HSlider.frame:=ini.readinteger('HorzScrollThumb','FrameCount',3);
  1705.   if vslider<>nil then
  1706.   VSlider.frame:=ini.readinteger('VertScrollThumb','FrameCount',3);
  1707. end;
  1708. function TSkinData.GetPrecolor(var acolor:Tcolor;n:integer):boolean;
  1709. begin
  1710.    result:=false;
  1711.    if (n>-1) and (n<length(colorpreset)) then begin
  1712.     acolor:=colorpreset[n];
  1713.     result:=true;
  1714.    end;
  1715. end;
  1716. function TSkinData.getfilename(s:string):string;
  1717. var i:integer;
  1718. begin
  1719.    i:=pos('.',s);
  1720.    if i>0 then result:=copy(s,1,i-1)
  1721.    else result:='';
  1722. end;
  1723. procedure TSkinData.DefineProperties(Filer: TFiler);
  1724. begin
  1725.   inherited;
  1726.   Filer.DefineBinaryProperty('SkinStream', ReadData, WriteData, True);
  1727. end;
  1728. procedure TSkinData.ReadData(Stream : TStream);
  1729. var ASize : longint;
  1730. begin
  1731.   Stream.Read (ASize, sizeof (ASize));
  1732.   if ASize > 0  then  begin
  1733.       data.SetSize (ASize);
  1734.       Stream.Read (data.Memory^, ASize);
  1735.       if not (csDesigning in ComponentState) then begin
  1736.           LoadSkin ;
  1737.       end;
  1738.   end;
  1739. end;
  1740. procedure TSkinData.WriteData(Stream : TStream);
  1741. var ASize : longint;
  1742. begin
  1743.   ASize := data.Size;
  1744.   Stream.Write(ASize, sizeof (ASize));
  1745.   if ASize > 0 then
  1746.     Stream.Write (data.Memory^, ASize);
  1747. end;
  1748. function TSkinData.GetSkinStore: string;
  1749. begin
  1750.   Result := '(none)';
  1751.   if csDesigning in ComponentState then
  1752.   begin
  1753.     if (data.size>0) then
  1754.       Result := '(Good)';
  1755.   end;
  1756. end;
  1757. procedure TSkinData.SetSkinStore(const Value: string);
  1758. begin
  1759. end;
  1760. procedure TSkinData.SetVersion( Value: string);
  1761. begin
  1762. end;
  1763. procedure TSkinData.Loaded;
  1764. begin
  1765.    inherited;
  1766.    if (csDesigning in ComponentState) then exit;
  1767.    if (@pGetScrollBarInfo=nil) then
  1768.         skincontrols:=skincontrols-[xcScrollbar];
  1769.    if skinmanager=nil then
  1770.         SkinManager:=TSkinManage.create(0);
  1771. //   skinmanager.addskindata(self);
  1772.    skinmanager.addskindata(self);
  1773.    CreateCaptionFont;
  1774.    CreateLogo;
  1775.    if ftype = sfMainform then begin
  1776.       skinmanager.installhook;
  1777.       if factive then begin
  1778.          if not empty then begin
  1779.             skinmanager.setaction(skin_Active);
  1780.          end else
  1781.             factive:=false;
  1782.       end;
  1783.       if not (xcMainmenu in SkinControls) then
  1784.         skincontrols:=skincontrols-[xcSystemMenu]
  1785.       else
  1786.         skincontrols:=skincontrols-[xcMenuitem];
  1787.       GetAppIcon();
  1788.    end
  1789.    else begin
  1790.       skinmanager.active:=true;
  1791.       inc(skinmanager.state);
  1792.       if (owner is Tform ) and factive then
  1793.          skinmanager.addform(tform(owner).handle);
  1794.    end;
  1795. end;
  1796. procedure TSkinData.SetActive( Value: boolean);
  1797. begin
  1798.   if factive<>value then begin
  1799.      factive:=value;
  1800.      if (csDesigning in ComponentState) then exit;
  1801.      if (csReading  in ComponentState) then exit;
  1802. //     if (skinformtype=sfMainform) or (skinformtype=sfDllForm) then begin
  1803.      if (skinformtype=sfMainform) then begin
  1804.        if value then begin
  1805.           if not empty then begin
  1806.              skinmanager.updatedata:=self;
  1807.              skinmanager.setaction(skin_Active);
  1808.              skinmanager.state:=skin_Active;
  1809. //             skinmanager.updatedata:=self;
  1810.           end;
  1811.        end else begin
  1812.         skinmanager.updatedata:=self;
  1813.         skinmanager.setaction(skin_uninstall);
  1814. //        skinmanager.updatedata:=self;
  1815.        end;
  1816.      end else if (skinformtype=sfOnlyThisForm) then begin
  1817.        skinmanager.updatedata:=self;
  1818.        if value then begin
  1819.           if not empty then
  1820.              skinmanager.setaction(skin_Active);
  1821.        end else begin
  1822.              skinmanager.setaction(skin_uninstall);
  1823.        end;
  1824.      end;
  1825.   end;
  1826. end;
  1827. procedure TSkinData.UpdateSkin;
  1828. begin
  1829.     if (csDesigning in ComponentState) then exit;
  1830.     if (csReading  in ComponentState) then exit;
  1831.     if skinmanager=nil then loaded;
  1832. //    if skinformtype<>sfMainform then  exit;
  1833. //    if SkinFormtype = sfOnlyThisForm then begin
  1834. //        exit;
  1835. //    end;
  1836.     skinmanager.updatedata:=self;
  1837.     skinmanager.DeleteSysbtn;
  1838.     if skinmanager.state=skin_Active then
  1839.       skinmanager.setaction(skin_change);
  1840. end;
  1841. procedure  TSkinData.ChangeProperty(control: TObject;aprop,value:string);
  1842. var PropInfo:PPropInfo;
  1843. begin
  1844.    if  control<>nil then begin
  1845.       PropInfo:=GetPropInfo(control,aprop);
  1846.       if PropInfo<>nil then  begin
  1847.          if propinfo^.PropType^.Kind= tkEnumeration then
  1848.           SetEnumProp(control,PropInfo,value);
  1849.       end;
  1850.    end;
  1851. end;
  1852. procedure  TSkinData.GetAppIcon;
  1853. var deficon,  SmallIcon: HIcon;
  1854.   cx, cy,i: Integer;
  1855.   Temp :Tbitmap;
  1856. begin
  1857.       Temp:=Tbitmap.create;
  1858.       cx := GetSystemMetrics(SM_CXSMICON);
  1859.       cy := GetSystemMetrics(SM_CYSMICON);
  1860.       temp.canvas.brush.color:=clFuchsia;
  1861.       temp.width:=cx;temp.height:=cy;
  1862.       DefIcon := SendMessage(application.Handle, WM_GETICON, ICON_SMALL, 0);
  1863.       if DefIcon = 0 then
  1864.         DefIcon := SendMessage(application.Handle, WM_GETICON, ICON_BIG, 0);
  1865.       if DefIcon <> 0 then begin
  1866.         SmallIcon := CopyImage(DefIcon, IMAGE_ICON, cx, cy, LR_COPYFROMRESOURCE);
  1867.         DrawIconEx(temp.Canvas.Handle, 0, 0, SmallIcon,
  1868.             cx, cy, 0, 0, DI_NORMAL);
  1869.         DestroyIcon(SmallIcon);
  1870.         sysicon.assign(temp);
  1871.         sysicon.TransparentColor:=  clFuchsia;
  1872.         sysicon.Transparent:=true;
  1873.       end;
  1874.       temp.free;
  1875. end;
  1876. function TSkinData.GetCaptionColor:Tcolor;
  1877. var h,w:integer;
  1878. begin
  1879.    result:= colors[csButtonFace];
  1880.    if  border[3]=nil then exit;
  1881.    if  border[3].map.empty then exit;
  1882.    w:= border[3].map.width;
  1883.    h:= border[3].map.height div border[3].frame;
  1884.    result:= border[3].map.Canvas.Pixels[w div 3, h div 3];
  1885. end;
  1886. function TSkinData.GetScrollBarInfo(hwnd: HWND; idObject: Longint;
  1887.        var psbi: TScrollBarInfo):boolean;
  1888. begin
  1889.   result:=false;
  1890.   if (@pGetScrollBarInfo<>nil) then
  1891.      result:=pGetScrollBarInfo(hwnd,idObject,psbi);
  1892. end;
  1893. procedure SkinDll(adata: pointer);
  1894. begin
  1895.    if skinmanager=nil then
  1896.         SkinManager:=TSkinManage.create(1);
  1897.    skinmanager.assigndata(adata);
  1898.    skinmanager.installhook;
  1899.    inc(skinmanager.state);
  1900. end;
  1901. procedure DoTrackMouse(ahwnd:THandle);
  1902. var  trackinfo : TTrackMouseEvent;
  1903. begin
  1904.    trackinfo.cbSize:=16;
  1905.    trackinfo.hwndTrack:=ahwnd;
  1906.    trackinfo.dwFlags:=2;
  1907.    if @pTrackMouseEvent<>nil then
  1908.      pTrackMouseEvent( trackinfo );
  1909. end;
  1910. var
  1911.   hUser: HModule;
  1912. initialization
  1913. hUser := LoadLibrary('user32.dll');
  1914. @pGetScrollBarInfo := GetProcAddress(hUser, 'GetScrollBarInfo');
  1915. @pTrackMouseEvent:= GetProcAddress(hUser, 'TrackMouseEvent');
  1916. @pGetComboBoxInfo:= GetProcAddress(hUser, 'GetComboBoxInfo');
  1917. @pDisableProcessWindowsGhosting:= GetProcAddress(hUser, 'DisableProcessWindowsGhosting');
  1918. finalization
  1919. FreeLibrary(hUser);
  1920. end.