www.pudn.com > VCLSkin.4.81.rar > WinSkinData.pas
unit WinSkinData;
interface
{$WARNINGS OFF}
{$HINTS OFF}
{$RANGECHECKS OFF}
uses Windows, Messages, SysUtils, Classes, Graphics, Controls,Forms,
IniFiles, Dialogs, FileCtrl,SkinRead,WinSkinStore,imgutil,Winskinini,
ImgList,typinfo;
const
CN_SkinChanged = WM_USER + $3001;
CN_CaptionBtnClick = WM_USER + $3114;
CN_CaptionBtnVisible = WM_USER + $3115;
CN_UPdateMainMenu = WM_USER + $3105;
CN_SkinEnabled = WM_USER + $3106;
CN_TabSheetClose = WM_USER + $3107;
CN_SkinNotify = WM_USER + $3108;
NM_COOLSB_CUSTOMDRAW = 0-$aff;
c_version = '4.81.04.30';
c_skintag = 33333;
// Billenium Effects messages
BE_ID = $41A2;
BE_BECLOSE = $2615;
BE_BASE = CM_BASE + $0C4A;
CM_BEPAINT = BE_BASE + 0; // Paint client area to Billenium Effects' DC
CM_BENCPAINT = BE_BASE + 1; // Paint non client area to Billenium Effects' DC
CM_BEFULLRENDER = BE_BASE + 2; // Paint whole control to Billenium Effects' DC
CM_BEWAIT = BE_BASE + 3; // Don't execute effect yet
CM_BERUN = BE_BASE + 4; // Execute effect now!
type
TWinContainer = (xccForm, xccFrame, xccToolbar, xccCoolbar, xccControlbar, xccPanel,
xccScrollBox, xccGroupBox, xccTabSheet, xccPageScroller);
TWinContainers = set of TWinContainer;
TSkinOption = (xoMDIScrollbar,xoMenuMerge,xoTransparent,xoPreview,xoParentBackGround,
xoNoFocusRect,xoToolbarBK,xoToolbarButton,xoMDIChildBorder,xoMenuBG,xoFormScrollbar);
TSkinOptions = set of TSkinOption;
TSkinControlType = (xcMainMenu, xcPopupMenu,xcMenuItem, xcToolbar, xcControlbar, xcCombo,
xcCheckBox, xcRadioButton,xcProgress,xcScrollbar,xcEdit,
xcButton, xcBitBtn, xcSpeedButton,xcSpin,xcPanel, xcGroupBox,xcStatusBar,
xcTab,xcTrackBar,xcSystemMenu,xcFastReport);
TSkinControlTypes = set of TSkinControlType;
TShemeColor=(csText,csTitleTextActive,csTitleTextNoActive,
csButtonFace,csButtonText,
csButtonHilight,csButtonlight,csButtonShadow,csButtonDkshadow,
csSelectText,csSelectBg,csHilightText,csHilight,
csMenuBar,csMenuBarText,csMenuText,csMenubg,csCaption,
csScrollbar,csTextDisable);
TShemeColors=array[csText..csTextDisable] of Tcolor;
TSkinFormType=(sfMainform,sfOnlyThisForm,sfDialog,sfDLL);
TSkinData = class;
TOnFormSkin = procedure(Sender:TObject;aName:string;Var DoSkin:boolean) of object;
TOnSkinForm = procedure(Sender:TObject;ahwnd:HWND;aName:string) of object;
TOnSkinControl = procedure(Sender: TComponent; SkinData: TSkinData; Form, Control: TControl;
ControlClass: String; var SkinnedControl: TComponent) of object;
TGetScrollBarInfo = Function(hwnd: HWND; idObject: Longint;
var psbi: TScrollBarInfo): BOOL; stdcall;
FTrackMouseEvent = function(var EventTrack: TTrackMouseEvent):BOOL; stdcall;
TGetComboBoxInfo = function(hwndCombo: HWND; var pcbi: TComboBoxInfo): BOOL; stdcall;
TDisableProcessWindowsGhosting = procedure(); stdcall;
TDataSkinObject = class(TObject)
public
r:Trect;
Map: TBitMap;
trans:integer;
Tile : integer;
IDName :String;
frame : integer;
style : integer;
Normalcolor,Overcolor,Downcolor:integer;
Normalcolor2,Overcolor2,Downcolor2:Tcolor;
constructor Create(AIDName: String);
destructor Destroy; override;
end;
TDataSkinBorder = class(TDataSkinObject)
public
MaskMap: TBitMap;
constructor Create(AIDName: String);
destructor Destroy; override;
end;
TDataSkinTitle = class(TDataSkinObject)
public
Aligment,BackGround,FontHeight :integer;
backleft,backright:integer;
activetext,inactivetext:Tcolor;
end;
TDataSkinButton = class(TDataSkinObject)
public
CheckMap,RadioMap:Tbitmap;
radioframe,checkframe:integer;
newnormal,newover,newdown:boolean;
constructor Create(AIDName: String);
destructor Destroy; override;
end;
TDataSkinSysButton = class(TDataSkinObject)
public
Action:integer;
Align :integer;
XCoord,YCoord:integer;
CombineOp:integer;
Visibility,Visibility1 :integer;
end;
TDataSkinBoxLabel = class(TDataSkinObject)
public
LeftShift,RightShift,Alignment:integer;
end;
TSkinControlList = class(TPersistent)
private
Fedit: TStrings;
fCheckbox:Tstrings;
fRadiobutton:tStrings;
fcombobox :TStrings;
procedure SetEdit(Value:Tstrings);
procedure SetCheckbox(Value:Tstrings);
procedure SetRadiobutton(Value:Tstrings);
procedure Setcombobox(Value:Tstrings);
public
constructor Create;
destructor Destroy; override;
published
property Edit: TStrings read Fedit write SetEdit;
property Checkbox: TStrings read Fcheckbox write SetCheckbox;
property Combobox: TStrings read Fcombobox write SetCombobox;
property Radiobutton: TStrings read Fradiobutton write Setradiobutton;
end;
TSkinData = class(TComponent)
private
fskinfile : string;
ini : TQuickIni;
fMenuSideBar :Tcolor;
ms:TMemorystream;
factive:boolean;
fdisableTag:integer;
FContainers: TWinContainers;
FSkinControls: TSkinControlTypes;
fSkinOptions:TSkinOptions;
ftype:TSkinFormType;
fOnFormSkin:TOnFormSkin;
fOnBeforeSkinForm:TOnSkinForm;
fOnAfterSkinForm:TOnSkinForm;
fOnSkinChanged :TNotifyevent;
FOnSkinControl: TOnSkinControl;
FInDLL : boolean;
f3rdControls:TStrings;
fmenuauto : boolean;
fversion : String;
fmenumerge:boolean;
procedure ReadMenuBar(var aobject:TDataSkinObject;aname:string);
procedure ReadProgress(var aobject:TDataSkinObject;aname:string);
Procedure ReadRGB(Section,aname:string;var value:Tcolor);
function GetColor(const s1:string;acolor:Tcolor):Tcolor;
procedure SetFrame;
function GetSectionNum(asection,aname:string):integer;
procedure WriteData (Stream : TStream);
procedure ReadData (Stream : TStream);
function GetSkinStore: string;
procedure SetSkinStore(const Value: string);
procedure CreateMdibtn(n:integer);
procedure SetActive( Value: boolean);
procedure SetVersion( Value: string);
procedure InitControlList;
procedure SetControlList(Value: TStrings);
procedure ReadTrack(var aobject:TDataSkinObject;aname:string);
procedure CreateLogo;
procedure CreateCaptionFont;
procedure CreateMinCaption;
protected
procedure ReadObject(var aobject:TDataskinobject;aname:string);
procedure ReadObject2(var aobject:TDataSkinborder;aname,image2:string);
procedure ReadButton;
procedure ReadSysButton;
procedure LoadFromIni(filename:string);
procedure ReadBord;
procedure ReadColor;
procedure ReadTitle(aobject:TDataSkinObject;aname:string);
procedure ReadBoxLabel(var aobject:TDataSkinBoxLabel;aname:string);
procedure DefineProperties (Filer : TFiler); override;
procedure RebuildToolbar;
procedure ReBuildCombobox;
procedure ReBuildComboxArrow;
procedure Loaded; override;
function LoadSkin:boolean;
procedure UpdateSkin;
public
reader: TSkinReader;
data :Tmemorystream;
Empty : boolean;
Colors: TShemeColors;
ColorPreset : array of Tcolor;
SysIcon:Tbitmap;
Title : TDataSkinTitle;
SysBtn : array of TDataSkinSysButton;
Button : TDataSkinButton;
tab:Tdataskinborder;
HSpin,VSpin:Tdataskinborder;
Comboxborder,ExtraImages: TDataSkinObject;
combox: Tdataskinborder;
comboxarrow:TDataSkinObject;
Box,Toolbar,Toolbarbtn : TDataSkinObject;
progress,progresschunk:TdataskinObject;
boxlabel:TDataSkinBoxLabel;
StatusBar,TabSheet: TDataSkinObject;
Header: TDataSkinObject;
Menubar,MenuItem,MenuitemBG : TDataSkinObject;
SArrow,HBar,VBar,HSlider,VSlider:TDataSkinObject;
TrackHorz,TrackVert :TDataSkinObject;
TrackBar,TrackBarVert:TDataSkinObject;
TrackLeft,Trackright,Tracktop,Trackbottom:TDataSkinObject;
MinCaption: TDataSkinObject;
border:array[1..4] of TDataskinborder;
sectionlist:Tstringlist;
PresetColors:array[0..9] of integer;
BGBrush :HBRUSH;
MenuMsg:boolean;
bmpmenu:Timagelist;
SkinName : string;
DebugList: TStrings;
cxMax,cyMax:integer;
logo:TBitmap;
CaptionFont: Tfont;
formhwnd:Thandle;
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure LoadFromFile(value:string);
procedure LoadFromStream(Stream: TStream);
procedure LoadFromCollection(astore:TSkinStore;aindex:integer);
procedure Readbmp(bmp:Tbitmap;fname:string);
function GetPrecolor(var acolor:Tcolor;n:integer):boolean;
function GetFileName(s:string):string;
procedure Uninstall;
procedure Install;
procedure DoFormSkin(ahwnd:Thandle;aname:string;var Doskin:boolean);
procedure DoSkinChanged;
procedure AddNestForm(fParent,fNested:TWincontrol);
procedure UpdateSkinControl(fParent:Tform;acontrol:Twincontrol=nil);
procedure DeleteGraphicControl(fParent:Tform;acontrol:TGraphicControl);
procedure UpdateMenu(fParent:Tform);
procedure UpdateMainMenu(done:boolean);
procedure SkinForm(ahwnd:THandle);
procedure InstallThread(aThreadID:integer);
procedure UnInstallThread(aThreadID:integer);
procedure ChangeProperty(control: TObject;aprop,value:string);
procedure EnableSkin(b:boolean);
function GetCaptionColor:Tcolor;
function GetScrollBarInfo(hwnd: HWND; idObject: Longint;
var psbi: TScrollBarInfo):boolean;
procedure DoDebug(s:string);
procedure ChangeForm(aform:Tform);
procedure GetAppIcon;
published
property Active : boolean read factive write setactive;
property DisableTag:integer read fdisabletag write fdisabletag;
property SkinControls: TSkinControlTypes read fSkinControls write fSkinControls;
property Options:TSkinOptions read fSkinOptions write fSkinOptions;
property Skin3rd: TStrings read f3rdControls write SetControllist;
property SkinFile : String read fskinfile write LoadFromFile;
property SkinStore: string read GetSkinStore write SetSkinStore;
property SkinFormtype:TSkinFormType read ftype write ftype;
property Version : string read fversion write setversion;
property MenuUpdate: boolean read fmenuauto write fmenuauto;
property MenuMerge: boolean read fmenumerge write fmenumerge;
// property InDLL :boolean read findll write findll;
property OnFormSkin :TOnFormSkin read fOnFormSkin write fOnFormSkin;
property OnSkinChanged :TNotifyevent read fOnSkinChanged write fOnSkinChanged;
property OnSkinControl :TOnSkinControl read FOnSkinControl write FOnSkinControl;
property OnBeforeSkinForm :TOnSkinForm read fOnBeforeSkinForm write fOnBeforeSkinForm;
property OnAfterSkinForm :TOnSkinForm read fOnAfterSkinForm write fOnAfterSkinForm;
end;
function RGBToColor(R,G,B:Byte): TColor;
function strcolor(s:string):Tcolor;
function Tnt_DrawTextW(hDC: HDC; wString: WideString;var lpRect: TRect; uFormat: UINT): Integer;
function StrToWideStr(const S: AnsiString): WideString;
function WideStringToStringEx(const WS: WideString): AnsiString;
function _WStr(lpString: PWideChar; cchCount: Integer): WideString;
function FindControlx(Handle: HWnd): TWinControl;
procedure SkinDll(adata: Pointer);
procedure DoTrackMouse(ahwnd:THandle);
//procedure CopyBMP(sbmp,dbmp:TBitMap);
var GSkinData:TSkinData;
Win32PlatformIsUnicode:boolean;
DefaultUserCodePage: Cardinal;
pGetScrollBarInfo:TGetScrollBarInfo;
pTrackMouseEvent:FTrackMouseEvent;
pGetComboBoxInfo:TGetComboBoxInfo;
pDisableProcessWindowsGhosting:TDisableProcessWindowsGhosting ;
implementation
uses Winskinform,WinSkinDlg,winsubclass;
constructor TSkinControlList.Create;
begin
inherited create;
fedit := TStringList.create;
fCombobox := TStringList.create;
fcheckbox := TStringList.create;
fradiobutton := TStringList.create;
end;
procedure TSkinData.InitControlList;
begin
f3rdControls.add('TCategoryButtons=scrollbar');
f3rdControls.add('TPngBitBtn=pngbitbtn');
f3rdControls.add('TVirtualStringTree=scrollbar');
f3rdControls.add('TVirtualDrawTree=scrollbar');
f3rdControls.add('TTBXDockablePanel=Panel');
f3rdControls.add('TAdvPanelGroup=scrollbar');
f3rdControls.add('TComboboxex=combobox');
f3rdControls.add('TRxSpeedButton=speedbutton');
f3rdControls.add('THTMLViewer=scrollbar');
f3rdControls.add('TDBCtrlGrid=scrollbar');
f3rdControls.add('TfrSpeedButton=speedbutton');
f3rdControls.add('TfrTBButton=speedbutton');
f3rdControls.add('TControlBar=Panel');
f3rdControls.add('TTBDock=Panel');
f3rdControls.add('TTBToolbar=Panel');
// f3rdControls.add('TAdvPageControl=nil');
f3rdControls.add('TImageEnMView=scrollbar');
f3rdControls.add('TImageEnView=scrollbar');
f3rdControls.add('TAdvMemo=scrollbar');
f3rdControls.add('TDBAdvMemo=scrollbar');
f3rdControls.add('TcxDBLookupComboBox=combobox');
f3rdControls.add('TcxDBComboBox=combobox');
f3rdControls.add('TcxDBDateEdit=combobox');
f3rdControls.add('TcxDBImageComboBox=combobox');
f3rdControls.add('TcxDBCalcEdit=combobox');
f3rdControls.add('TcxDBBlobEdit=combobox');
f3rdControls.add('TcxDBPopupEdit=combobox');
f3rdControls.add('TcxDBFontNameComboBox=combobox');
f3rdControls.add('TcxDBShellComboBox=combobox');
f3rdControls.add('TRxLookupEdit=combobox');
f3rdControls.add('TRxDBLookupCombo=combobox');
f3rdControls.add('TRzGroup=panel');
f3rdControls.add('TRzButton=button');
f3rdControls.add('TRzBitbtn=bitbtn');
f3rdControls.add('TRzMenuButton=menubtn');
f3rdControls.add('TRzCheckGroup=CheckGroup');
f3rdControls.add('TRzRadioGroup=Radiogroup');
// f3rdControls.add('TRzRadioButton=Radiobutton');
// f3rdControls.add('TRzCheckBox=Checkbox');
f3rdControls.add('TRzButtonEdit=Edit');
f3rdControls.add('TRzDBRadioGroup=Radiogroup');
f3rdControls.add('TRzDBRadioButton=Radiobutton');
f3rdControls.add('TRzDateTimeEdit=combobox');
f3rdControls.add('TRzColorEdit=combobox');
f3rdControls.add('TRzDateTimePicker=combobox');
f3rdControls.add('TRzDBDateTimeEdit=combobox');
f3rdControls.add('TRzDbColorEdit=combobox');
f3rdControls.add('TRzDBDateTimePicker=combobox');
f3rdControls.add('TLMDButton=bitbtn');
f3rdControls.add('TLMDGroupBox=Groupbox');
f3rdControls.add('TDBCheckboxEh=Checkbox');
f3rdControls.add('TDBCheckboxEh=Checkbox');
f3rdControls.add('TLMDCHECKBOX=Checkbox');
f3rdControls.add('TLMDDBCHECKBOX=Checkbox');
f3rdControls.add('TLMDRadiobutton=Radiobutton');
f3rdControls.add('TLMDCalculator=panel');
f3rdControls.add('TLMDGROUPBOX=Panel');
f3rdControls.add('TLMDSIMPLEPANEL=Panel');
f3rdControls.add('TLMDDBCalendar=Panel');
f3rdControls.add('TLMDButtonPanel=Panel');
f3rdControls.add('TLMDLMDCalculator=Panel');
f3rdControls.add('TLMDHeaderPanel=Panel');
f3rdControls.add('TLMDTechnicalLine=Panel');
f3rdControls.add('TLMDLMDClock=Panel');
f3rdControls.add('TLMDTrackbar=panel');
f3rdControls.add('TLMDListCombobox=combobox');
f3rdControls.add('TLMDCheckListCombobox=combobox');
f3rdControls.add('TLMDHeaderListCombobox=combobox');
f3rdControls.add('TLMDImageCombobox=combobox');
f3rdControls.add('TLMDColorCombobox=combobox');
f3rdControls.add('TLMDFontCombobox=combobox');
f3rdControls.add('TLMDFontSizeCombobox=combobox');
f3rdControls.add('TLMDFontSizeCombobox=combobox');
f3rdControls.add('TLMDPrinterCombobox=combobox');
f3rdControls.add('TLMDDriveCombobox=combobox');
f3rdControls.add('TLMDCalculatorComboBox=combobox');
f3rdControls.add('TLMDTrackBarComboBox=combobox');
f3rdControls.add('TLMDCalendarComboBox=combobox');
f3rdControls.add('TLMDTreeComboBox=combobox');
f3rdControls.add('TLMDRADIOGROUP=radiogroup');
f3rdControls.add('TLMDCheckGroup=CheckGroup');
f3rdControls.add('TLMDDBRADIOGROUP=radiogroup');
f3rdControls.add('TLMDDBCheckGroup=CheckGroup');
f3rdControls.add('TLMDCalculatorEdit=edit');
f3rdControls.add('TLMDEDIT=Edit');
f3rdControls.add('TLMDMASKEDIT=Edit');
f3rdControls.add('TLMDBROWSEEDIT=Edit');
f3rdControls.add('TLMDEXTSPINEDIT=Edit');
f3rdControls.add('TLMDCALENDAREDIT=Edit');
f3rdControls.add('TLMDFILEOPENEDIT=Edit');
f3rdControls.add('TLMDFILESAVEEDIT=Edit');
f3rdControls.add('TLMDCOLOREDIT=Edit');
f3rdControls.add('TLMDDBEDIT=Edit');
f3rdControls.add('TLMDDBMASKEDIT=Edit');
f3rdControls.add('TLMDDBEXTSPINEDIT=Edit');
f3rdControls.add('TLMDDBSPINEDIT=Edit');
f3rdControls.add('TLMDDBEDITDBLookup=Edit');
f3rdControls.add('TLMDEDITDBLookup=Edit');
//combobox
f3rdControls.add('TDBLookupCombobox=Combobox');
f3rdControls.add('TWWDBCombobox=Combobox');
f3rdControls.add('TWWDBLookupCombo=Combobox');
f3rdControls.add('TWWDBCombobox=Combobox');
f3rdControls.add('TWWKeyCombo=Combobox') ;
f3rdControls.add('TWWTempKeyCombo=combobox');
f3rdControls.add('TWWDBDateTimePicker=Combobox');
f3rdControls.add('TWWRADIOGROUP=radiogroup');
f3rdControls.add('TWWDBEDIT=Edit');
f3rdControls.add('TcxButton=bitbtn');
// f3rdControls.add('TcxDBCheckBox=checkbox');
f3rdControls.add('TcxDBRadioGroup=radiogroup');
f3rdControls.add('TcxRadioGroup=radiogroup');
f3rdControls.add('TcxGroupbox=groupbox');
// f3rdControls.add('TcxCheckBox=checkbox');
{ f3rdControls.add('TDXDBPICKEDIT=Combobox');
f3rdControls.add('TDXDBCALCEDIT=Combobox');
f3rdControls.add('TDXDBIMAGEEDIT=Combobox');
f3rdControls.add('TDXDBPOPUPEDIT=Combobox');
f3rdControls.add('TDXDBEXTLOOKUPEDIT=Combobox');
f3rdControls.add('TDXDBLOOKUPEDIT=Combobox');
f3rdControls.add('TDXDBDATEEDIT=Combobox');
f3rdControls.add('TDXDATEEDIT=Combobox');
f3rdControls.add('TDXPICKEDIT=Combobox');
f3rdControls.add('TDXPOPUPEDIT=Combobox');
//edit
f3rdControls.add('TDXDBCURRENCYEDIT=Edit');
f3rdControls.add('TDXDBEDIT=Edit');
f3rdControls.add('TDXDBMASKEDIT=Edit');
f3rdControls.add('TDXDBHYPERLINKEDIT=Edit');
f3rdControls.add('TDXEDIT=Edit');
f3rdControls.add('TDXMASKEDIT=Edit');
f3rdControls.add('TDXBUTTONEDIT=Edit');
f3rdControls.add('TDXCURRENCYEDIT=Edit');
f3rdControls.add('TDXHYPERLINKEDIT=Edit');}
f3rdControls.add('TOVCPICTUREFIELD=Edit');
f3rdControls.add('TOVCDBPICTUREFIELD=Edit');
f3rdControls.add('TOVCSLIDEREDIT=Edit');
f3rdControls.add('TOVCDBSLIDEREDIT=Edit');
f3rdControls.add('TOVCSIMPLEFIELD=Edit');
f3rdControls.add('TOVCDBSIMPLEFIELD=Edit');
f3rdControls.add('TO32DBFLEXEDIT=Edit');
f3rdControls.add('TOVCNUMERICFIELD=Edit');
f3rdControls.add('TOVCDBNUMERICFIELD=Edit');
end;
destructor TSkinControlList.Destroy;
begin
fedit.free;
fcombobox.free;
fradiobutton.free;
fcheckbox.free;
inherited destroy;
end;
procedure TSkinControlList.SetEdit(Value: TStrings);
begin
FEdit.Assign(Value);
end;
procedure TSkinControlList.SetCheckbox(Value: TStrings);
begin
Fcheckbox.Assign(Value);
end;
procedure TSkinControlList.Setradiobutton(Value: TStrings);
begin
Fradiobutton.Assign(Value);
end;
procedure TSkinControlList.SetCombobox(Value: TStrings);
begin
FCombobox.Assign(Value);
end;
constructor TDataSkinObject.Create(AIDName: String);
begin
inherited create;
Map:=Tbitmap.create;
Idname:=aidname;
end;
destructor TDataSkinObject.Destroy;
begin
try
if not IsBadReadPtr(map, map.InstanceSize) then begin
map.assign(nil);
Map.free;
end;
except
end;
inherited destroy;
end;
constructor TDataSkinBorder.Create(AIDName: String);
begin
inherited create(aidname);
MaskMap:=TBitMap.create;
Idname:=aidname;
end;
destructor TDataSkinBorder.Destroy;
begin
MaskMap.free;
inherited destroy;
end;
constructor TDataSkinButton.Create(AIDName: String);
begin
inherited create(aidname);
CheckMap :=Tbitmap.create;
RadioMap :=Tbitmap.create;
end;
destructor TDataSkinButton.Destroy;
begin
try
if not IsBadReadPtr(checkmap, checkmap.InstanceSize) then begin
CheckMap.free;
end;
except
end;
try
if not IsBadReadPtr(radiomap, radiomap.InstanceSize) then begin
RadioMap.free;
end;
except
end;
inherited destroy;
end;
constructor TSkinData.Create(AOwner: TComponent);
var i: integer;
begin
inherited Create(AOwner);
fOnBeforeSkinForm:=nil;
fOnAfterSkinForm:=nil;
ftype := sfMainform;
data := TMemorystream.create;
Empty := True;
sysicon:=Tbitmap.create;
sysicon.PixelFormat := pf24bit;
logo:=Tbitmap.create;
logo.PixelFormat := pf24bit;
MenuMsg:=true;
findll := false;
f3rdControls:=TStringlist.create;
initcontrollist;
Button := TDataSkinButton.create('Buttons');
border[1]:=TDataskinborder.create('Left');
border[2]:=TDataskinborder.create('Right');
border[3]:=TDataskinborder.create('Top');
border[4]:=TDataskinborder.create('Bottom');
Title := TDataSkinTitle.create('Title');
fmenuauto := true;
fmenumerge := false;
fSkinOptions := [xoPreview,xoToolbarBK];
// if gSkindata=nil then gskindata:=self;
fdisabletag:=99;
FContainers := [xccForm, xccFrame, xccToolbar, xccCoolbar, xccControlbar, xccPanel,
xccScrollBox, xccGroupBox, xccTabSheet, xccPageScroller];
FSkinControls := [xcMainMenu, xcPopupMenu, xcToolbar, xcControlbar, xcCombo,
xcCheckBox, xcRadioButton,xcProgress,xcScrollbar,xcedit,
xcButton,xcedit, xcBitBtn, xcSpeedButton, xcPanel,xcSpin,xcTrackbar,xcGroupBox,
xcTab,xcStatusBar,xcSystemMenu];
bmpmenu:=Timagelist.create(nil);
bmpmenu.GetResource(rtBitmap,'VCLSKINMENU',16,[lrTransparent],clwhite);
fversion := c_version;
cxMax := GetSystemMetrics(SM_CXMAXIMIZED);
cyMax := GetSystemMetrics(SM_CYMAXIMIZED);
mincaption:=nil;
// bmpmenu.ResInstLoad(rtBitmap,'VCLSKINMENU',16,[lrTransparent],clwhite);
end;
destructor TSkinData.Destroy;
var i:integer;
begin
bmpmenu.free;
f3rdControls.free;
if skinmanager<>nil then
skinmanager.Removeskindata(self);
// skinmanager=nil;
data.free;
sysicon.free;
logo.free;
if CaptionFont<>nil then CaptionFont.free;
for i:= 1 to 4 do begin
border[i].free;
end;
for i:= 0 to length(SysBtn)-1 do begin
SysBtn[i].free;
end;
Button.free;
Title.free;
if BGBrush<>0 then begin
deleteobject(BgBrush);
BGBrush:=0;
end;
if box<>nil then Box.free;
if boxlabel<>nil then Boxlabel.free;
if toolbar<>nil then toolbar.free;
if Tab<>nil then Tab.free;
if TabSheet<>nil then TabSheet.free;
if MinCaption<>nil then MinCaption.free;
if StatusBar<>nil then statusbar.free;
if ComBox<>nil then Combox.free;
if ComBoxborder<>nil then ComBoxborder.free;
if ComBoxArrow<>nil then ComBoxArrow.free;
if ExtraImages<>nil then ExtraImages.free;
if Progress<>nil then Progress.free;
if ProgressChunk<>nil then ProgressChunk.free;
if Header<>nil then Header.free;
if MenuBar<>nil then MenuBar.free;
if MenuItem<>nil then MenuItem.free;
if MenuItemBG<>nil then MenuItemBG.free;
if SArrow<>nil then SArrow.free;
if HBar<>nil then HBar.free;
if VBar<>nil then VBar.free;
if HSlider<>nil then HSlider.free;
if VSlider<>nil then VSlider.free;
if Hspin<>nil then Hspin.free;
if Vspin<>nil then Vspin.free;
if TrackHorz<>nil then TrackHorz.free;
if TrackVert<>nil then TrackVert.free;
if trackbar<>nil then trackbar.free;
if trackbarvert<>nil then trackbarvert.free;
if TrackLeft<>nil then TrackLeft.free;
if TrackRight<>nil then TrackRight.free;
if TrackTop<>nil then TrackTop.free;
if TrackBottom<>nil then TrackBottom.free;
if Toolbarbtn<>nil then toolbarbtn.free;
{ if skinmanager.dlist.count=0 then begin
skinmanager.free;
skinmanager:=nil;
end;}
inherited Destroy;
end;
procedure TSkinData.SetControlList(Value: TStrings);
begin
f3rdControls.Assign(Value);
end;
procedure TSkinData.ReadBord;
var s:string;
i:integer;
begin
for i:= 1 to 4 do begin
if i<3 then begin
border[i].r.top:=ini.Readinteger('Personality',border[i].IDName+'TopHeight',0);
border[i].r.Bottom:=ini.Readinteger('Personality',border[i].IDName+'BotHeight',0);
border[i].r.left:= 0;
border[i].r.right:= 0;
end else begin
border[i].r.top:= 0;
border[i].r.Bottom:=0;
border[i].r.left:=ini.Readinteger('Personality',border[i].IDName+'TopHeight',0);
border[i].r.right:=ini.Readinteger('Personality',border[i].IDName+'BotHeight',0);
end;
border[i].frame:=ini.Readinteger('Personality',border[i].IDName+'Frame',1);
border[i].Tile:=ini.Readinteger('Personality',border[i].IDName+'Stretch',1);
border[i].trans:=ini.readinteger('Personality',border[i].IDName+'Trans',1);
readbmp(border[i].map,ini.ReadString('Personality',border[i].IDName, ''));
if border[i].Tile>1 then border[i].Tile:=1;
// readbmp(border[i].maskmap,ini.ReadString('Personality', border[i].IDName+'Mask', ''));
end;
end;
procedure TSkinData.Readbmp(bmp:Tbitmap;fname:string);
var s,s1:string;
begin
s:= ExtractFileName(fname);
s1:=ExtractFileExt(fname);
if (s<>'') and (s1='.bmp') then begin
reader.readfile(s,ms);
if ms.size>0 then
bmp.LoadFromstream(ms)
else bmp.Assign(nil);
end else bmp.Assign(nil);
end;
procedure TSkinData.ReadSysButton;
var i,n,a,v1:integer;
j:real;
s:string;
b:boolean;
p:Tpoint;
begin
for i:= 0 to high(SysBtn) do SysBtn[i].free;
ini.ReadSections(sectionlist);
for i:= sectionlist.count-1 downto 0 do begin
s:=Uppercase(sectionlist.strings[i]);
b:=false;
if (s='BUTTONS') or (s='BUTTON.RADIO')
or (s='BUTTON.CHECKBOX') or (s='BUTTON') then b:=true
else if (pos('BUTTON',s)<>1) then b:=true
else begin
a:=ini.readinteger(s,'Action',0);
v1:=ini.readinteger(s,'Visibility',-1);
if a=-1 then begin
if v1=0 then b:=false
else b:=true;
end;
end;
if b then sectionlist.delete(i);
end;
n:=sectionlist.count;
setlength(SysBtn,n+3);
for i:= 0 to sectionlist.count-1 do begin
s:=Uppercase(sectionlist.strings[i]);
SysBtn[i]:= TDataSkinSysButton.create(s);
SysBtn[i].Action:=ini.readinteger(s,'Action',0);
SysBtn[i].Align:=ini.readinteger(s,'Align',0);
SysBtn[i].Xcoord:=ini.readinteger(s,'Xcoord',0);
SysBtn[i].Ycoord:=ini.readinteger(s,'Ycoord',0);
SysBtn[i].Visibility:=ini.readinteger(s,'Visibility',0);
if SysBtn[i].Action=-1 then
SysBtn[i].Visibility1:=ini.readinteger(s,'Visibility1',-1)
else
SysBtn[i].Visibility1:=ini.readinteger(s,'Visibility1',0);
//save maxbtn;
if (SysBtn[i].Action=1) and (SysBtn[i].Visibility=2) then
p := Point(SysBtn[i].Xcoord,SysBtn[i].Ycoord);
// set help btn
if (SysBtn[i].Action=4) then begin
SysBtn[i].Xcoord := p.X;
SysBtn[i].Ycoord := p.Y;
end;
SysBtn[i].CombineOp:=ini.readinteger(s,'CombineOp',-1);
SysBtn[i].frame:=ini.readinteger(s,'frame',0);
readbmp(SysBtn[i].map,ini.ReadString(s, 'ButtonImage', ''));
if sysbtn[i].frame=0 then begin
sysbtn[i].frame:=6;
if not sysbtn[i].map.empty then begin
j:=sysbtn[i].map.width / sysbtn[i].map.height;
if j>3.8 then
sysbtn[i].frame:=6
else
sysbtn[i].frame:=3;
if sysbtn[i].action<0 then
sysbtn[i].frame:=6
end;
if sysbtn[i].action in [3,11] then
sysbtn[i].map.assign(nil);
end;
end;
for i:= n to n+2 do begin
SysBtn[i]:= TDataSkinSysButton.create(s);
SysBtn[i].Action:=7+i-n;
SysBtn[i].Align:=100;
SysBtn[i].Visibility:=100;
SysBtn[i].Visibility1:=100;
SysBtn[i].frame:=4;
end;
CreateMdibtn(n);
end;
procedure TSkinData.CreateMdibtn(n:integer);
var bmp:Tbitmap;
i,w,h:integer;
r1,r2:Trect;
begin
bmp:=Tbitmap.create;
readbmp(bmp,ini.ReadString('MDICONTROLS', 'Image', ''));
if bmp.empty then begin
bmp.free;
exit;
end;
w:= bmp.width div 12;
h:= bmp.height ;
for i:= 0 to 2 do begin
SysBtn[n+i].map.width:= w*4;
SysBtn[n+i].map.height:= h;
sysbtn[n+i].Xcoord := (3-i)*(w+4);
r1:=rect(i*4*w,0,(i+1)*4*w,h);
r2:=rect(0,0,w*4,h);
SysBtn[n+i].map.canvas.copyrect(r2,bmp.canvas,r1);
end;
bmp.free;
end;
procedure TSkinData.CreateMinCaption;
var i,w,h:integer;
bmp:Tbitmap;
c1,c2:TColor;
c0,gradcol1,gradcol2:Tcolor;
r:Trect;
s,v:integer;
begin
if mincaption=nil then
mincaption:=TDataSkinObject.create('MinCaption');
bmp:=Tbitmap.create;
h:=29;w:=80;
bmp.Width:=w;
bmp.Height:=h;
c0 := GetCaptionColor();
gradCol1:= Blend(clblack,c0, 50) ;
r:=Rect(0,0,w,h);
bmp.Canvas.Brush.Color:=c0;
bmp.Canvas.Pen.Color:= gradCol1;
bmp.canvas.Rectangle(r);
//GradFill(bmp.canvas.handle,r,gradCol2,gradCol1);
mincaption.map.assign(bmp);
mincaption.frame:=1;
mincaption.r := Rect(3,3,3,3);
bmp.free;
end;
procedure TSkinData.ReadObject(var aobject:TDataSkinObject;aname:string);
var s:string;
begin
if aobject<>nil then begin
aobject.free;
aobject:=nil;
end;
s:=ini.readstring(aname,'Image','');
if s='' then exit;
aobject:=TDataSkinObject.create(aname);
readbmp(aobject.map,s);
aobject.style:=ini.readinteger(aname,'Style',0);
aobject.r.left:=ini.readinteger(aname,'LeftWidth',0);
aobject.r.right:=ini.readinteger(aname,'RightWidth',0);
aobject.r.top:=ini.readinteger(aname,'TopHeight',0);
aobject.r.Bottom:=ini.readinteger(aname,'BottomHeight',0);
aobject.frame:= ini.readinteger(aname,'Frame',0);
aobject.trans:=ini.readinteger(aname,'Trans',0);
aobject.tile:=ini.readinteger(aname,'Tile',0);
aobject.Normalcolor:=ini.readinteger(aname,'NormalColour',-1);
aobject.Overcolor:=ini.readinteger(aname,'MouseOverColour',-1);
aobject.Downcolor:=ini.readinteger(aname,'PressedColour',-1);
aobject.Normalcolor2:=getcolor(ini.readstring(aname,'NormalColour2',''),colors[csButtonText]);
aobject.Overcolor2:=getcolor(ini.readstring(aname,'MouseOverColour2',''),colors[csButtonText]);
aobject.Downcolor2:=getcolor(ini.readstring(aname,'PressedColour2',''),colors[csButtonText]);
if aobject.tile>1 then aobject.tile:=0;
end;
procedure TSkinData.ReadObject2(var aobject:TDataSkinborder;aname,image2:string);
var s:string;
begin
if aobject<>nil then begin
aobject.free;
aobject:=nil;
end;
s:=ini.readstring(aname,'Image','');
if s='' then exit;
aobject:=TDataSkinborder.create(aname);
readbmp(aobject.map,s);
s:=ini.readstring(aname,Image2,'');
if s<>'' then
readbmp(aobject.maskmap,s);
aobject.style:=ini.readinteger(aname,'Style',0);
aobject.r.left:=ini.readinteger(aname,'LeftWidth',0);
aobject.r.right:=ini.readinteger(aname,'RightWidth',0);
aobject.r.top:=ini.readinteger(aname,'TopHeight',0);
aobject.r.Bottom:=ini.readinteger(aname,'BottomHeight',0);
aobject.trans:=ini.readinteger(aname,'Trans',0);
aobject.tile:=ini.readinteger(aname,'Tile',0);
aobject.Normalcolor:=ini.readinteger(aname,'NormalColour',-1);
aobject.Overcolor:=ini.readinteger(aname,'MouseOverColour',-1);
aobject.Downcolor:=ini.readinteger(aname,'PressedColour',-1);
aobject.Normalcolor2:=getcolor(ini.readstring(aname,'NormalColour2',''),colors[csButtonText]);
aobject.Overcolor2:=getcolor(ini.readstring(aname,'MouseOverColour2',''),colors[csButtonText]);
aobject.Downcolor2:=getcolor(ini.readstring(aname,'PressedColour2',''),colors[csButtonText]);
if aobject.tile>1 then aobject.tile:=0;
end;
procedure TSkinData.ReadProgress(var aobject:TDataSkinObject;aname:string);
var s:string;
begin
if aobject<>nil then begin
aobject.free;
aobject:=nil;
end;
s:=ini.readstring(aname,'Bitmap','');
if s='' then exit;
aobject:=TDataSkinborder.create(aname);
readbmp(aobject.map,s);
// s:=ini.readstring(aname,'Chunk','');
// if s<>'' then readbmp(aobject.maskmap,s);
aobject.style:=ini.readinteger(aname,'Style',0);
aobject.r.left:=ini.readinteger(aname,'LeftWidth',0);
aobject.r.right:=ini.readinteger(aname,'RightWidth',0);
aobject.r.top:=ini.readinteger(aname,'TopHeight',0);
aobject.r.Bottom:=ini.readinteger(aname,'BottomHeight',0);
aobject.trans:=ini.readinteger(aname,'Trans',0);
aobject.tile:=ini.readinteger(aname,'Tile',0);
if aobject.tile>1 then aobject.tile:=1;
end;
procedure TSkinData.ReadBoxLabel(var aobject:TDataSkinBoxLabel;aname:string);
var s:string;
begin
if aobject<>nil then begin
aobject.free;
aobject:=nil;
end;
s:=ini.readstring(aname,'Image','');
if s='' then exit;
aobject:=TDataSkinBoxLabel.create(aname);
readbmp(aobject.map,s);
aobject.style:=ini.readinteger(aname,'Style',0);
aobject.r.left:=ini.readinteger(aname,'LeftWidth',0);
aobject.r.right:=ini.readinteger(aname,'RightWidth',0);
aobject.r.top:=ini.readinteger(aname,'TopHeight',0);
aobject.r.Bottom:=ini.readinteger(aname,'BottomHeight',0);
aobject.trans:=ini.readinteger(aname,'Trans',0);
aobject.tile:=ini.readinteger(aname,'Tile',0);
aobject.Normalcolor:=ini.readinteger(aname,'NormalColour',-1);
aobject.Overcolor:=ini.readinteger(aname,'MouseOverColour',-1);
aobject.Downcolor:=ini.readinteger(aname,'PressedColour',-1);
aobject.Normalcolor2:=getcolor(ini.readstring(aname,'NormalColour2',''),colors[csButtonText]);
aobject.Overcolor2:=getcolor(ini.readstring(aname,'MouseOverColour2',''),colors[csButtonText]);
aobject.Downcolor2:=getcolor(ini.readstring(aname,'PressedColour2',''),colors[csButtonText]);
if aobject.tile>1 then aobject.tile:=0;
aobject.Alignment:=ini.readinteger(aname,'BackgroundAlignment',0);
aobject.LeftShift:=ini.readinteger(aname,'BackgroundLeftShift',0);
aobject.RightShift:=ini.readinteger(aname,'BackgroundRightShift',0);
end;
procedure TSkinData.ReadButton;
var s,s1:string;
begin
s:='Buttons';
Button.r.left:=ini.readinteger(s,'LeftWidth',0);
Button.r.right:=ini.readinteger(s,'RightWidth',0);
Button.r.top:=ini.readinteger(s,'TopHeight',0);
Button.r.Bottom:=ini.readinteger(s,'BottomHeight',0);
Button.trans:=ini.readinteger(s,'Trans',0);
readbmp(Button.map,ini.readstring(s,'Bitmap',''));
Button.tile:=ini.readinteger(s,'Tile',0);
readbmp(Button.checkmap,ini.readstring(s,'CheckButton',''));
readbmp(Button.radiomap,ini.readstring(s,'RadioButton',''));
Button.Normalcolor:=ini.readinteger(s,'NormalColour',-1);
Button.Overcolor:=ini.readinteger(s,'MouseOverColour',-1);
Button.Downcolor:=ini.readinteger(s,'PressedColour',-1);
Button.RadioFrame:=ini.readinteger(s,'RadioButtonFrame',0);
Button.CheckFrame:=ini.readinteger(s,'CheckButtonFrame',0);
if button.Tile>1 then button.Tile:=0;
s1:=ini.readstring(s,'NormalColour2','');
if s1<>'' then Button.newnormal := true else Button.newnormal:=false;
s1:=ini.readstring(s,'MouseOverColour2','');
if s1<>'' then Button.newover := true else Button.newover:=false;
s1:=ini.readstring(s,'PressedColour2','');
if s1<>'' then Button.newdown := true else Button.newdown:=false;
Button.Normalcolor2:=getcolor(ini.readstring(s,'NormalColour2',''),colors[csButtonText]);
Button.Overcolor2:=getcolor(ini.readstring(s,'MouseOverColour2',''),colors[csButtonText]);
Button.Downcolor2:=getcolor(ini.readstring(s,'PressedColour2',''),colors[csButtonText]);
end;
procedure TSkinData.ReadMenuBar(var aobject:TDataSkinObject;aname:string);
var s:string;
begin
if aobject<>nil then begin
aobject.free;
aobject:=nil;
end;
s:=ini.readstring(aname,'menuBar','');
if s='' then exit;
aobject:=TDataSkinObject.create(aname);
readbmp(aobject.map,s);
aobject.r.top:=0;
aobject.r.bottom:=0;
aobject.Tile:=ini.readinteger(aname,'TileMenu',1);
aobject.r.left:=ini.readinteger(aname,'TileLeftMenu',1);
aobject.r.right:=ini.readinteger(aname,'TileRightMenu',1);
if aobject.Tile>1 then aobject.Tile:=1;
// aobject.r.top:=ini.readinteger(aname,'TopHeight',0);
// aobject.r.Bottom:=ini.readinteger(aname,'BottomHeight',0);
// aobject.Tile:=ini.readinteger(aname,'Tile',0);
end;
procedure TSkinData.ReadTitle(aobject:TDataSkinObject;aname:string);
var s:string;
begin
readbmp(aobject.map,ini.readstring(aname,'TextBack',''));
aobject.r.left:=ini.readinteger(aname,'TextShift',0);
aobject.r.top:=ini.readinteger(aname,'TextShiftVert',0);
aobject.r.right:=ini.readinteger(aname,'TextRightClip',0);
aobject.r.bottom:=0;
Title.aligment := ini.readinteger(aname,'TextAlignment',0);
Title.Background := ini.readinteger(aname,'Textbackground',0);
Title.FontHeight := ini.readinteger('Fonts','FontHeight',14);
Title.BackLeft := ini.readinteger(aname,'TXTBackleft',0);
Title.BackRight := ini.readinteger(aname,'TXTBackRight',0);
Title.activetext:= clnone;
Title.inactivetext:=clnone;
ReadRGB(aname,'ActiveText',Title.activetext);
ReadRGB(aname,'InActiveText',Title.inactivetext);
end;
{procedure TSkinData.RebuildToolbar;
var bmp:Tbitmap;
w,i,h : integer;
r1,r2:Trect;
begin
if toolbar<>nil then exit;
if statusbar=nil then exit;
bmp :=Tbitmap.create;
w:=statusbar.map.width div statusbar.frame;
bmp.Width := w - statusbar.r.Left-statusbar.r.Right;
h:=statusbar.Map.Height;
bmp.Height := h-statusbar.r.Top;
r1:=Rect(statusbar.r.Left,statusbar.r.Top,w-statusbar.r.Right,bmp.Height);
r2:=Rect(0,0,bmp.Width,bmp.Height);
bmp.Canvas.CopyRect(r2,statusbar.Map.canvas,r1);
toolbar:=TDataSkinObject.create('Toolbar');
toolbar.Map.Assign(bmp);
toolbar.r.Bottom:=statusbar.r.Bottom;
toolbar.frame:=1;
bmp.free;
end;}
procedure TSkinData.RebuildToolbar;
var bmp:Tbitmap;
c0,gradcol1,gradcol2:Tcolor;
r:Trect;
s,v:integer;
begin
bmp :=Tbitmap.create;
bmp.Width := 10 ;
bmp.Height := 40;
c0 := GetCaptionColor();
gradCol1:= Blend(clgray,c0, 150) ;
gradCol2:= Blend(colors[csButtonFace],clwhite, 150) ;
s:= GetHSV(c0);
if s>110 then begin
v:= 50+25*(225-s) div 140;
gradCol1:= Blend(c0,clwhite,v);
end;
r:=Rect(0,0,bmp.Width,bmp.Height);
GradFill(bmp.canvas.handle,r,gradCol2,gradCol1);
if toolbar=nil then
toolbar:=TDataSkinObject.create('Toolbar');
toolbar.Map.Assign(bmp);
toolbar.frame:=1;
bmp.free;
end;
procedure TSkinData.CreateCaptionFont;
var
NonClientMetrics: TNonClientMetrics;
begin
If Assigned(CaptionFont) then FreeAndNIL(CaptionFont);
CaptionFont := TFont.Create;
NonClientMetrics.cbSize := SizeOf(NonClientMetrics);
if SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, @NonClientMetrics, 0) then
CaptionFont.Handle := CreateFontIndirect(NonClientMetrics.lfCaptionFont);
end;
procedure TSkinData.CreateLogo;
var s:string;
r:Trect;
font:Tfont;
begin
s:='VCLSkin Demo';
font:=Tfont.Create;
font.Name:='Tahoma MS';
font.Size:=10;
font.Style:=[fsBold];
// logo.Transparent:=true;
// logo.TransparentColor:=clwhite;//clFuchsia;
logo.Canvas.Font:=font;//captionfont;
r:=Rect(0,0,50,30);
DrawTextA(logo.canvas.Handle,pchar(s),-1,r, DT_CALCRECT or DT_NOCLIP);
if (r.Right<150) and (r.Bottom<20) then begin
logo.Width:=r.Right+2;
logo.Height:=r.Bottom+2;
logo.canvas.Brush.color:= clwhite;//clFuchsia;
logo.Canvas.Rectangle(rect(0,0,r.Right+2,r.Bottom+2));
// logo.Canvas.FillRect(rect(0,0,logo.width,logo.Height));
SetBkMode(logo.Canvas.Handle, TRANSPARENT);
offsetrect(r,1,1);
DrawText(logo.canvas.Handle,pchar(s),-1,r, 0);
end;
font.free;
end;
procedure TSkinData.ReBuildComboxArrow;
var bmp:Tbitmap;
i,cw,w:integer;
r1,r2:Trect;
begin
if comboxarrow=nil then
comboxarrow:= TDataSkinObject.create('ComboxArrow');
if (Comboxborder=nil) then begin
if (combox<>nil) then begin
comboxarrow.Map.Assign(combox.Map);
ChangeTrans(comboxarrow.Map,colors[csButtonface]);
comboxarrow.frame := combox.frame;
end;
exit;
end;
if (combox.style<>2) then exit;
cw:=17;
bmp:=Tbitmap.create;
bmp.Height:=cw;
bmp.Width:= cw*ComBoxborder.frame;
w:= combox.map.width div ComBoxborder.frame;
for i:= 1 to ComBoxborder.frame do begin
r1:= Rect(i*w-2-cw,2,i*w-2,19);
r2:= rect((i-1)*cw,0,i*cw,cw);
bmp.Canvas.CopyRect(r2,combox.map.Canvas,r1);
end;
comboxarrow.frame:=ComBoxborder.frame;
comboxarrow.Map.Assign(bmp);
bmp.free;
end;
procedure TSkinData.ReBuildCombobox;
var temp,bmp:Tbitmap;
w1,i,h : integer;
r1,r2:Trect;
begin
if (Comboxborder=nil) or (combox=nil) then exit;
bmp :=Tbitmap.create;
temp :=Tbitmap.create;
temp.Height := 21;
temp.Width := 50;
bmp.height := temp.Height;
bmp.Width := temp.Width*ComBoxborder.frame;
bmp.PixelFormat := pf24Bit ;
temp.Canvas.Brush.color := clFuchsia;
bmp.Canvas.Brush.color := clFuchsia;
bmp.canvas.FillRect(rect(0,0,bmp.width,bmp.height));
w1 := GetSystemMetrics( SM_CXHSCROLL )+2;
h:=21;
r1:=rect(0,0,50,h);
r2:=r1;
r2.left := r1.right-w1;
for i:= 1 to ComBoxborder.frame do begin
DrawRect2(temp.canvas.Handle,r1,ComBoxborder.map,ComBoxborder.r,
i,ComBoxborder.frame,ComBoxborder.trans);
DrawRect2(temp.canvas.Handle,r2,ComBox.map,ComBox.r,
i,ComBox.frame,1);
if ExtraImages<>nil then
DrawRect3(temp.canvas.Handle,r2,ExtraImages.map,
i,ExtraImages.frame,1);
temp.canvas.FillRect(rect(2,2,50-w1-1,h-3));
bmp.canvas.draw((i-1)*50,0,temp);
end;
combox.style:=2;
combox.r := comboxborder.r;
combox.r.right:=w1+2;
combox.r.left:= 2;
combox.Map.Assign(bmp);
// copybmp(bmp,combox.Map);//combox.Map.Assign(bmp);
SpiegelnHorizontal(bmp);
//copybmp(bmp,comboxborder.Map);
ComBoxborder.Map.Assign(bmp);
ComBoxborder.r.left:=w1+2;
ComBoxborder.r.right:= 2;
bmp.free;
temp.free;
end;
procedure TSkinData.ReadTrack(var aobject:TDataSkinObject;aname:string);
begin
if aobject<>nil then begin
aobject.free;
aobject:=nil;
end;
aobject:=TDataSkinObject.create(aname);
aobject.Map.LoadFromResourceName(hinstance,aname);
aobject.r:= Rect(3,3,3,3);
aobject.Tile:= 0;
aobject.frame:=1;
end;
function StrToWideStr(const S: AnsiString): WideString;
var
InputLength,
OutputLength: Integer;
begin
InputLength := Length(S);
OutputLength := MultiByteToWideChar(DefaultUserCodePage, 0, PAnsiChar(S), InputLength, nil, 0);
SetLength(Result, OutputLength);
MultiByteToWideChar(DefaultUserCodePage, 0, PAnsiChar(S), InputLength, PWideChar(Result), OutputLength);
end;
function WideStringToStringEx(const WS: WideString): AnsiString;
var
InputLength,
OutputLength: Integer;
begin
InputLength := Length(WS);
OutputLength := WideCharToMultiByte(DefaultUserCodePage, 0, PWideChar(WS), InputLength, nil, 0, nil, nil);
SetLength(Result, OutputLength);
WideCharToMultiByte(DefaultUserCodePage, 0, PWideChar(WS), InputLength, PAnsiChar(Result), OutputLength, nil, nil);
end;
function _WStr(lpString: PWideChar; cchCount: Integer): WideString;
begin
if cchCount = -1 then
Result := lpString
else
Result := Copy(WideString(lpString), 1, cchCount);
end;
function Tnt_DrawTextW(hDC: HDC; wString: WideString;var lpRect: TRect; uFormat: UINT): Integer;
var lpString: PWideChar;
ncount:integer;
begin
lpstring:=PWideChar(wstring);
ncount:=length(wstring);
if Win32PlatformIsUnicode then
Result := DrawTextW(hDC, lpString, nCount, lpRect, uFormat)
else
Result := DrawTextA(hDC,
PAnsiChar(AnsiString(_WStr(lpString, nCount))), -1, lpRect, uFormat);
end;
function RGBToColor(R,G,B:Byte): TColor;
begin
Result:=B Shl 16 Or
G Shl 8 Or
R;
end;
{procedure CopyBMP(sbmp,dbmp:TBitMap);
begin
dbmp.Width:=sbmp.Width;
dbmp.Height:=sbmp.Height;
dbmp.PixelFormat:=sbmp.PixelFormat;
dbmp.Canvas.Draw(0,0,sbmp);
end;}
function strcolor(s:string):Tcolor;
var i,j,l,n:integer;
a:array[1..3]of integer;
s2:string;
begin
result:=0;
if s='' then exit;
s:=trim(s);
l:=length(s);
for i:=1 to 3 do a[i]:=0;
j:=1;i:=1;s2:='';
while (i<=l) do begin
if s[i] in ['0'..'9'] then s2:=s2+s[i]
else begin
try
if s2<>'' then begin
a[j]:=strtoint(s2);
inc(j);s2:='';
end;
except
end;
//inc(j);s2:='';
end;
inc(i);
end;
try
if j=3 then a[3]:=strtoint(s2);
except
end;
result:=rgb(a[1],a[2],a[3]);
end;
function FindControlx(Handle: HWnd): TWinControl;
begin
Result := nil;
if Handle <> 0 then begin
{$ifdef COMPILER_6_UP}
result:= pointer(SendMessage(handle, RM_GetObjectInstance, 0, 0));
{$else}
Result := Pointer(GetProp(Handle, MakeIntAtom(ControlAtom)));
{$endif}
end;
end;
function TSkinData.GetColor(const s1:string;acolor:Tcolor):Tcolor;
begin
result:=acolor;
if s1<>'' then result:=strcolor(s1);
end;
procedure TSkinData.ReadColor;
var s,s1:string;
n,i:integer;
b,r,g:byte;
begin
// TShemeColor=(csText,csTitleTextActive,csTitleTextNoActive,
// csButtonFace,csSelectText,csSelectBg,csTextDisable);
s:='Colours';
s1:=ini.readstring(s,'ButtonFace','');
colors[csText]:=getcolor(ini.readstring(s,'WindowText',''),clWindowText);
colors[csButtonFace]:=getcolor(ini.readstring(s,'ButtonFace',''),clBtnFace);
colors[csScrollbar]:=getcolor(ini.readstring(s,'Scrollbar',''),clscrollbar);
colors[csHilightText]:=getcolor(ini.readstring(s,'HilightText',''),clHighlightText);
colors[csHilight]:=getcolor(ini.readstring(s,'Hilight',''),clHighlight);
colors[csMenuBar]:=getcolor(ini.readstring(s,'Menubar',''),colors[csButtonFace]);
colors[csMenuBG]:=getcolor(ini.readstring(s,'Menu',''),clMenu);
colors[csMenuText]:=getcolor(ini.readstring(s,'MenuText',''),clMenuText);
colors[csButtonText]:=getcolor(ini.readstring(s,'ButtonText',''),clBtnText);
colors[csButtonHilight]:=getcolor(ini.readstring(s,'ButtonHilight',''),clBtnHighlight);
colors[csButtonlight]:=getcolor(ini.readstring(s,'Buttonlight',''),clBtnHighlight);
colors[csButtonShadow]:=getcolor(ini.readstring(s,'ButtonShadow',''),clBtnShadow);
colors[csButtonDkShadow]:=getcolor(ini.readstring(s,'ButtonDkShadow',''),cl3DDkShadow);
colors[csMenuBarText]:=getcolor(ini.readstring(s,'MenuBarText',''),clMenuText);
colors[csTitleTextActive]:=getcolor(ini.readstring(s,'TitleTextActive',''),clcaptionText);
colors[csTitleTextNoActive]:=getcolor(ini.readstring(s,'TitleTextNoActive',''),clinactivecaptionText);
ini.ReadSections(sectionlist);
for i:= sectionlist.count-1 downto 0 do begin
s:=Uppercase(sectionlist.strings[i]);
if (s='COLOURS') or (pos('COLOUR',s)<>1) then
sectionlist.delete(i);
end;
n:=sectionlist.count;
setlength(colorPreset,n);
for i:=0 to n-1 do begin
s:=Uppercase(sectionlist.strings[i]);
colorPreset[i]:=getcolor(ini.readstring(s,'color',''),clWindowText);
end;
// setlength(colorPreset,10);
for i:= 0 to high(PresetColors) do begin
PresetColors[i] := getcolor(ini.readstring('Customcolors','Color'+inttostr(i),''),clwhite);
end;
{// TShemeColor=(csText,csTitleTextActive,csTitleTextNoActive,
// ReadRGB('Personality','MenuText',colors[csMenuBarText]);
// ReadRGB('Personality','ActiveText',colors[csTitleTextActive]);
// ReadRGB('Personality','InactiveText',colors[csTitleTextNoActive]);
n:=getsectionnum('Colour','B');
setlength(colorPreset,n);
for i:=0 to n-1 do begin
r:=ini.readinteger(format('Colour%1d',[i]),'R',0);
g:=ini.readinteger(format('Colour%1d',[i]),'G',0);
b:=ini.readinteger(format('Colour%1d',[i]),'B',0);
colorPreset[i]:=rgbtocolor(r,g,b);
end;}
end;
Procedure TSkinData.ReadRGB(Section,aname:string;var value:Tcolor);
var a:array[1..3] of integer;
R : Array [1..3] of string;
i:integer;
begin
R[1]:='R';R[2]:='G';R[3]:='B';
for i:= 1 to 3 do begin
a[i]:=ini.readinteger(section,aname+r[i],-1);
end;
if (a[1]>=0) and (a[2]>=0) and (a[3]>=0) then
value:=rgb(a[1],a[2],a[3]);
// value:=RGBToColor(a[1],a[2],a[3]);
end;
function TSkinData.GetSectionNum(asection,aname:string):integer;
var i:integer;
s:string;
begin
i:=0;
s:=ini.readstring(format('%s%1d',[asection,i]),aname,'');
while s<>'' do begin
inc(i);
s:=ini.readstring(format('%s%1d',[asection,i]),aname,'');
end;
result:=i;
end;
procedure TSkinData.Uninstall;
begin
SkinManager.setaction(skin_Uninstall);
end;
procedure TSkinData.Install;
begin
SkinManager.setaction(skin_Active);
end;
procedure TSkinData.DoFormSkin(ahwnd:Thandle;aname:string;var Doskin:boolean);
begin
formhwnd:=ahwnd;
if assigned(fOnformskin) then fOnformskin(self,aname,doskin)
// else if aname='TQRStandardPreview' then doskin:=false
else if aname='SysMonthCal32' then doskin:=false
// else if aname='TppPrintPreview' then doskin:=false
// else if aname='TdxfmStdPreview' then doskin:=false
else if (xcFastReport in SkinControls) and (pos('Tfr',aname)=1) then doskin:=false;
end;
procedure TSkinData.DoSkinChanged;
begin
if assigned(fOnSkinChanged) then
fOnSkinChanged(self);
end;
procedure TSkinData.AddNestForm(fParent,fNested:TWincontrol);
var i:integer;
sf :TWinSkinform;
spy:TWinSkinspy;
begin
if fNested=nil then exit;
for i:=0 to SkinManager.flist.count-1 do begin
sf:=TWinSkinform(SkinManager.flist[i]);
if sf.hwnd=fParent.handle then begin
spy := TWinSkinspy.Create(fNested);
spy.sf:=sf;
// sf.InitControls(fparent);
sf.InitNestform(Tform(fNested));
break;
end;
end;
end;
procedure TSkinData.UpdateSkinControl(fParent:Tform;acontrol:Twincontrol=nil);
var i:integer;
sf :TWinSkinform;
begin
for i:=0 to SkinManager.flist.count-1 do begin
sf:=TWinSkinform(SkinManager.flist[i]);
if sf.hwnd=fParent.handle then begin
if acontrol=nil then sf.InitControls(fparent)
else sf.InitControls(acontrol);
break;
end;
end;
end;
procedure TSkinData.ChangeForm(aform:Tform);
begin
// postmessage(skinmanager.handle,CN_SkinNotify,skin_update,aform.handle);
skinmanager.lpara:=aform.handle;
skinmanager.UpdateData:=self;
skinmanager.setaction(skin_update);
end;
procedure TSkinData.DoDebug(s:string);
begin
if debuglist<>nil then
debuglist.Add(s);
end;
procedure TSkinData.EnableSkin(b:boolean);
begin
skinmanager.active:=b;
end;
procedure TSkinData.DeleteGraphicControl(fParent:Tform;acontrol:TGraphicControl);
var i,j:integer;
sf :TWinSkinform;
sc:Tskincontrol;
begin
for i:=0 to SkinManager.flist.count-1 do begin
sf:=TWinSkinform(SkinManager.flist[i]);
if sf.hwnd=fParent.handle then begin
for j:= 0 to sf.controllist.count-1 do begin
sc:= Tskincontrol(sf.controllist.items[j]);
if sc.GControl = acontrol then begin
sf.controllist.Delete(j);
sc.free;
break;
end;
end;
end;
end;
end;
procedure TSkinData.SkinForm(ahwnd:THandle);
begin
SkinManager.skinchildform:=true;
SkinManager.addform(ahwnd);
SkinManager.skinchildform:=false;
end;
procedure TSkinData.UpdateMenu(fParent:Tform);
var i:integer;
sf :TWinSkinform;
begin
for i:=0 to SkinManager.flist.count-1 do begin
sf:=TWinSkinform(SkinManager.flist[i]);
if sf.hwnd=fParent.handle then begin
sf.InitPopMenu(fParent,true,true);
break;
end;
end;
end;
procedure TSkinData.UpdateMainMenu(done:boolean);
var i:integer;
sf :TWinSkinform;
begin
menumsg:=done;
if not menumsg then exit;
for i:=0 to SkinManager.flist.count-1 do begin
sf:=TWinSkinform(SkinManager.flist[i]);
if (sf.menu<>nil) then begin
sf.menu.updatabtn;
//break;
end;
end;
end;
procedure TSkinData.InstallThread(aThreadID:integer);
begin
skinmanager.installthread(athreadid);
end;
procedure TSkinData.UnInstallThread(aThreadID:integer);
begin
SkinManager.UnInstallThread(aThreadID);
end;
procedure TSkinData.LoadFromFile(value:string);
begin
empty:=true;
fskinfile:=value;
if (csDesigning in ComponentState) then begin
if (value<>'') and (data.size>0) then data.clear;
Exit;
end;
if not fileexists(value) then exit;
data.clear;
data.loadfromfile(value);
LoadSkin;
// skinmanager.setaction(skin_change);
// if ftype=sfMainform then
UpdateSkin;
// else showmessage('Skin file format error !');
end;
procedure TSkinData.LoadFromStream(Stream: TStream);
begin
empty:=true;
data.clear;
data.LoadFromStream(stream);
LoadSkin;
if ftype=sfMainform then
UpdateSkin;
// skinmanager.setaction(skin_change);
end;
procedure TSkinData.LoadFromCollection(astore:TSkinStore;aindex:integer);
var aitem:TSkinCollectionItem;
begin
if astore.Store.count<=aindex then exit;
empty:=true;
data.clear;
aitem:=TSkinCollectionItem(astore.Store.items[aindex]);
aitem.fdata.Position := 0;
data.LoadFromStream(aitem.fdata);
LoadSkin;
// if ftype=sfMainform then
UpdateSkin;
end;
function TSkinData.LoadSkin:boolean;
var fpath,fini:string;
PathBuffer : array [0..255] of char;
b:boolean;
begin
empty:=true;
if csDesigning in ComponentState then exit;
GetTempPath (256, PathBuffer);
fpath := StrPas(PathBuffer);
reader:=TSkinReader.create;
ms := TMemorystream.create;
b:=reader.loadfromstream(data);
if b then begin
ini := TQuickIni.Create;
reader.readini('.ini',ms,fini);
fini:=fpath+fini;
try
ms.Seek(0,soFromBeginning);
ini.LoadFromStream(ms);
// ms.savetofile(fini);
loadfromini(fini);
// deletefile(fini);
finally
reader.free;
ms.free;
ini.free;
end;
end;
result:=b;
end;
procedure TSkinData.LoadFromIni(filename:string);
begin
// ini := TIniFile.Create(FileName);
sectionlist:=Tstringlist.create;
ini.ReadSections(sectionlist);
//
SkinName := ini.ReadString('TitlebarSkin', 'SkinName', '');
//
Readbord;
readcolor;
ReadSysbutton;
Readbutton;
readtitle(Title,'Personality');
readProgress(Progress,'Progress');
readobject(ProgressChunk,'Progress.Chunk');
readMenuBar(MenuBar,'Personality');
readobject(Box,'GroupBoxEdge');
ReadBoxLabel(boxlabel,'GroupBox');
readobject2(Tab,'Tabs','Border');
readobject(StatusBar,'StatusBarEdges');
readobject(TabSheet,'Tab.Pane');
if (tabsheet<>nil) then begin
if (tabsheet.r.top>4) then tabsheet.r.top:=4 ;
if (tabsheet.r.left>4) then tabsheet.r.left:=4 ;
if (tabsheet.r.right>4) then tabsheet.r.right:=4 ;
if (tabsheet.r.bottom>4) then tabsheet.r.bottom:=4 ;
end;
//Readobject(toolbar,'ToolBarBackground');
Readobject(toolbarbtn,'ToolBars');
// ReadToolbar(Toolbar,'Toolbars');
// readobject(ComBox,'ComboButton');
readobject2(ComBox,'ComboButton','****');
readobject(ComBoxborder,'SunkEdge');
if (combox<>nil) and ( not combox.Map.empty) then begin
combox.MaskMap.assign(combox.Map);
combox.MaskMap.PixelFormat:= pf24bit;
SpiegelnHorizontal(combox.MaskMap);
end;
readobject(ExtraImages,'ExtraImages');
readobject(header,'Headerbar');
readObject(MenuItem,'MenuItem');
readObject(MenuItemBG,'MenuBackground');
readobject(SArrow,'Scrollbar');
readobject(HBar,'HorzScroll');
readobject(VBar,'VertScroll');
readobject(HSlider,'HorzScrollThumb');
readobject(VSlider,'VertScrollThumb');
readobject(TrackHorz,'Trackbar.ThumbHorz');
readobject(TrackVert,'Trackbar.ThumbVert');
readobject(TrackLeft,'Trackbar.ThumbLeft');
readobject(TrackRight,'Trackbar.ThumbRight');
readobject(TrackTop,'Trackbar.ThumbUp');
readobject(TrackBottom,'Trackbar.ThumbDown');
readobject2(HSpin,'UpDown.Horz','GlyphImage');
readobject2(VSpin,'UpDown.Vert','GlyphImage');
readobject(TrackBar,'Track');
readobject(Trackbarvert,'TRACKVERT');
if trackbar=nil then
ReadTrack(Trackbar,'TRACK');
if trackbarvert=nil then
ReadTrack(Trackbarvert,'TRACKVERT');
SetFrame;
ReBuildCombobox;
ReBuildComboxArrow;
RebuildToolbar;
colors[csCaption]:=GetCaptionColor;
if BGBrush<>0 then begin
deleteobject(BgBrush);
BGBrush:=0;
end;
BGBrush:=CreateSolidBrush(colors[csButtonFace]);
sectionlist.free;
Empty := False;
end;
procedure TSkinData.SetFrame;
var i:integer;
w:integer;
begin
// ReadSysbutton;
// Readbutton;
button.frame:=5;
if button.radioframe=0 then begin
if button.radiomap.height>=16 then w:=16
else w:=13;
button.radioframe:= button.radiomap.width div w;
if button.radioframe<4 then button.radioframe:=4;
end;
if button.checkframe=0 then begin
if button.checkmap.height>=16 then w:=16
else w:=13;
button.checkframe:= button.checkmap.width div w;
if button.checkframe<4 then button.checkframe:=4;
end;
// for i:= 0 to length(sysbtn)-1 do
// sysbtn[i].frame:=5;
if title<>nil then Title.frame:=2;
if Progress<>nil then begin
if progress.style=0 then
Progress.frame:=2
else
Progress.frame:=1;
end;
if MenuBar<>nil then MenuBar.frame:=2;
if Box<>nil then Box.frame:=2;
if Toolbar<>nil then Toolbar.frame:=1;
if Toolbarbtn<>nil then toolbarbtn.frame:=5;
if Tab<>nil then Tab.frame:=5;
if TabSheet<>nil then TabSheet.frame:=1;
// if MinCaption<>nil then MinCaption.frame:=1;
if StatusBar<>nil then StatusBar.frame:=3;
if BoxLabel<>nil then BoxLabel.frame:=1;
if ComBox<>nil then ComBox.frame:=4;
if ComBoxborder<>nil then ComBoxborder.frame:=4;
if ExtraImages<>nil then ExtraImages.frame:=5;
if (header<>nil) and (header.frame=0) then header.frame:=5;
if MenuItem<>nil then MenuItem.frame:=5;
if MenuItemBG<>nil then MenuItemBG.frame:=1;
if SArrow<>nil then SArrow.frame:=23;
if HBar<>nil then Hbar.frame:=4;
if VBar<>nil then Vbar.frame:=4;
if VSpin<>nil then VSpin.frame := 8;
if HSpin<>nil then HSpin.frame := 8;
if TrackHorz<>nil then TrackHorz.frame := 5;
if TrackVert<>nil then TrackVert.frame := 5;
if TrackLeft<>nil then TrackLeft.frame := 5;
if TrackRight<>nil then TrackRight.frame := 5;
if TrackTop<>nil then TrackTop.frame := 5;
if TrackBottom<>nil then TrackBottom.frame := 5;
if hslider<>nil then
HSlider.frame:=ini.readinteger('HorzScrollThumb','FrameCount',3);
if vslider<>nil then
VSlider.frame:=ini.readinteger('VertScrollThumb','FrameCount',3);
end;
function TSkinData.GetPrecolor(var acolor:Tcolor;n:integer):boolean;
begin
result:=false;
if (n>-1) and (n0 then result:=copy(s,1,i-1)
else result:='';
end;
procedure TSkinData.DefineProperties(Filer: TFiler);
begin
inherited;
Filer.DefineBinaryProperty('SkinStream', ReadData, WriteData, True);
end;
procedure TSkinData.ReadData(Stream : TStream);
var ASize : longint;
begin
Stream.Read (ASize, sizeof (ASize));
if ASize > 0 then begin
data.SetSize (ASize);
Stream.Read (data.Memory^, ASize);
if not (csDesigning in ComponentState) then begin
LoadSkin ;
end;
end;
end;
procedure TSkinData.WriteData(Stream : TStream);
var ASize : longint;
begin
ASize := data.Size;
Stream.Write(ASize, sizeof (ASize));
if ASize > 0 then
Stream.Write (data.Memory^, ASize);
end;
function TSkinData.GetSkinStore: string;
begin
Result := '(none)';
if csDesigning in ComponentState then
begin
if (data.size>0) then
Result := '(Good)';
end;
end;
procedure TSkinData.SetSkinStore(const Value: string);
begin
end;
procedure TSkinData.SetVersion( Value: string);
begin
end;
procedure TSkinData.Loaded;
begin
inherited;
if (csDesigning in ComponentState) then exit;
if (@pGetScrollBarInfo=nil) then
skincontrols:=skincontrols-[xcScrollbar];
if skinmanager=nil then
SkinManager:=TSkinManage.create(0);
// skinmanager.addskindata(self);
skinmanager.addskindata(self);
CreateCaptionFont;
CreateLogo;
if ftype = sfMainform then begin
skinmanager.installhook;
if factive then begin
if not empty then begin
skinmanager.setaction(skin_Active);
end else
factive:=false;
end;
if not (xcMainmenu in SkinControls) then
skincontrols:=skincontrols-[xcSystemMenu]
else
skincontrols:=skincontrols-[xcMenuitem];
GetAppIcon();
end
else begin
skinmanager.active:=true;
inc(skinmanager.state);
if (owner is Tform ) and factive then
skinmanager.addform(tform(owner).handle);
end;
end;
procedure TSkinData.SetActive( Value: boolean);
begin
if factive<>value then begin
factive:=value;
if (csDesigning in ComponentState) then exit;
if (csReading in ComponentState) then exit;
// if (skinformtype=sfMainform) or (skinformtype=sfDllForm) then begin
if (skinformtype=sfMainform) then begin
if value then begin
if not empty then begin
skinmanager.updatedata:=self;
skinmanager.setaction(skin_Active);
skinmanager.state:=skin_Active;
// skinmanager.updatedata:=self;
end;
end else begin
skinmanager.updatedata:=self;
skinmanager.setaction(skin_uninstall);
// skinmanager.updatedata:=self;
end;
end else if (skinformtype=sfOnlyThisForm) then begin
skinmanager.updatedata:=self;
if value then begin
if not empty then
skinmanager.setaction(skin_Active);
end else begin
skinmanager.setaction(skin_uninstall);
end;
end;
end;
end;
procedure TSkinData.UpdateSkin;
begin
if (csDesigning in ComponentState) then exit;
if (csReading in ComponentState) then exit;
if skinmanager=nil then loaded;
// if skinformtype<>sfMainform then exit;
// if SkinFormtype = sfOnlyThisForm then begin
// exit;
// end;
skinmanager.updatedata:=self;
skinmanager.DeleteSysbtn;
if skinmanager.state=skin_Active then
skinmanager.setaction(skin_change);
end;
procedure TSkinData.ChangeProperty(control: TObject;aprop,value:string);
var PropInfo:PPropInfo;
begin
if control<>nil then begin
PropInfo:=GetPropInfo(control,aprop);
if PropInfo<>nil then begin
if propinfo^.PropType^.Kind= tkEnumeration then
SetEnumProp(control,PropInfo,value);
end;
end;
end;
procedure TSkinData.GetAppIcon;
var deficon, SmallIcon: HIcon;
cx, cy,i: Integer;
Temp :Tbitmap;
begin
Temp:=Tbitmap.create;
cx := GetSystemMetrics(SM_CXSMICON);
cy := GetSystemMetrics(SM_CYSMICON);
temp.canvas.brush.color:=clFuchsia;
temp.width:=cx;temp.height:=cy;
DefIcon := SendMessage(application.Handle, WM_GETICON, ICON_SMALL, 0);
if DefIcon = 0 then
DefIcon := SendMessage(application.Handle, WM_GETICON, ICON_BIG, 0);
if DefIcon <> 0 then begin
SmallIcon := CopyImage(DefIcon, IMAGE_ICON, cx, cy, LR_COPYFROMRESOURCE);
DrawIconEx(temp.Canvas.Handle, 0, 0, SmallIcon,
cx, cy, 0, 0, DI_NORMAL);
DestroyIcon(SmallIcon);
sysicon.assign(temp);
sysicon.TransparentColor:= clFuchsia;
sysicon.Transparent:=true;
end;
temp.free;
end;
function TSkinData.GetCaptionColor:Tcolor;
var h,w:integer;
begin
result:= colors[csButtonFace];
if border[3]=nil then exit;
if border[3].map.empty then exit;
w:= border[3].map.width;
h:= border[3].map.height div border[3].frame;
result:= border[3].map.Canvas.Pixels[w div 3, h div 3];
end;
function TSkinData.GetScrollBarInfo(hwnd: HWND; idObject: Longint;
var psbi: TScrollBarInfo):boolean;
begin
result:=false;
if (@pGetScrollBarInfo<>nil) then
result:=pGetScrollBarInfo(hwnd,idObject,psbi);
end;
procedure SkinDll(adata: pointer);
begin
if skinmanager=nil then
SkinManager:=TSkinManage.create(1);
skinmanager.assigndata(adata);
skinmanager.installhook;
inc(skinmanager.state);
end;
procedure DoTrackMouse(ahwnd:THandle);
var trackinfo : TTrackMouseEvent;
begin
trackinfo.cbSize:=16;
trackinfo.hwndTrack:=ahwnd;
trackinfo.dwFlags:=2;
if @pTrackMouseEvent<>nil then
pTrackMouseEvent( trackinfo );
end;
var
hUser: HModule;
initialization
hUser := LoadLibrary('user32.dll');
@pGetScrollBarInfo := GetProcAddress(hUser, 'GetScrollBarInfo');
@pTrackMouseEvent:= GetProcAddress(hUser, 'TrackMouseEvent');
@pGetComboBoxInfo:= GetProcAddress(hUser, 'GetComboBoxInfo');
@pDisableProcessWindowsGhosting:= GetProcAddress(hUser, 'DisableProcessWindowsGhosting');
finalization
FreeLibrary(hUser);
end.
//1E78284C93F3FAD280060ECD0396E017