//************************************************************************************************** // // Unit Vcl.Styles.Ext // unit for the VCL Styles Utils // https://github.com/RRUZ/vcl-styles-utils/ // // The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); // you may not use this file except in compliance with the License. You may obtain a copy of the // License at http://www.mozilla.org/MPL/ // // Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF // ANY KIND, either express or implied. See the License for the specific language governing rights // and limitations under the License. // // The Original Code is Vcl.Styles.Ext.pas. // // The Initial Developer of the Original Code is Rodrigo Ruz V. // Portions created by Rodrigo Ruz V. are Copyright (C) 2012-2016 Rodrigo Ruz V. // All Rights Reserved. // //************************************************************************************************** unit Vcl.Styles.Ext; interface {$IF RTLVersion>=24} {$LEGACYIFEND ON} {$IFEND} {$DEFINE USE_VCL_STYLESAPI} Uses System.Classes, System.Generics.Collections, Winapi.Windows, Vcl.Styles, Vcl.Themes, Vcl.Forms, Vcl.Graphics, Vcl.Controls, Vcl.ExtCtrls; type TStyleHookList = TList; type /// The TVclStylesPreview class, is a control for display a preview of any Vcl style loaded /// /// /// sample of use /// /// var /// StyleName : string; /// SourceInfo: TSourceInfo; /// LStyle : TCustomStyleServices; /// FPreview : TVclStylesPreview; /// begin /// FPreview:=TVclStylesPreview.Create(Self); /// FPreview.Parent:=PanelPreview; /// FPreview.BoundsRect := PanelPreview.ClientRect; /// StyleName:='Carbon'; /// if (StyleName <>'') and (not SameText(StyleName, 'Windows')) then /// begin /// TStyleManager.StyleNames;//call DiscoverStyleResources /// LStyle:=TStyleManager.Style[StyleName]; /// FPreview.Caption:=StyleName; /// FPreview.Style:=LStyle; /// TVclStylesPreviewClass(FPreview).Paint; /// end; /// .... /// end; /// /// TVclStylesPreview = class(TCustomControl) private FStyle: TCustomStyleServices;//TCustomStyle; FIcon: HICON; FCaption: TCaption; FRegion : HRGN; FBitmap: TBitmap; protected procedure Paint; override; public property Icon:HICON read FIcon Write FIcon; property Style:TCustomStyleServices read FStyle Write FStyle; property Caption : TCaption read FCaption write FCaption; property BitMap : TBitmap read FBitmap write FBitmap; constructor Create(AControl: TComponent); override; destructor Destroy; override; end; TStyleServicesHandle = type Pointer; TSourceInfo = record Data: TStyleServicesHandle; StyleClass: TCustomStyleServicesClass; end; {$REGION 'Documentation'} /// Helper class for the TStyleManager /// {$ENDREGION} TStyleManagerHelper = Class Helper for TStyleManager strict private class function GetStyleSourceInfo(const StyleName: string): TSourceInfo; static; class function GetStyles: TList; class function _GetStyles: TList; static; public class function RegisteredStyles: TDictionary; {$REGION 'Documentation'} /// Get the TSourceInfo for a Style /// {$ENDREGION} class property StyleSourceInfo[const StyleName: string]: TSourceInfo read GetStyleSourceInfo; {$REGION 'Documentation'} /// Send the CM_CUSTOMSTYLECHANGED message to all the forms /// {$ENDREGION} class procedure RefreshCurrentTheme; {$REGION 'Documentation'} /// Return the loaded styles (TCustomStyleServices) in the system /// {$ENDREGION} class property Styles: TList read _GetStyles; {$REGION 'Documentation'} /// Force to reload a modified vcl style /// {$ENDREGION} class procedure ReloadStyle(const StyleName : string); {$REGION 'Documentation'} /// remove a vcl style /// {$ENDREGION} class procedure RemoveStyle(const StyleName : string); class function StyleLoaded(const StyleName : string) : Boolean; end; const VclStyles_MaxSysColor = 23; VclStyles_SysColors: array[0..VclStyles_MaxSysColor - 1] of TIdentMapEntry = ( (Value: Vcl.Graphics.clActiveBorder; Name: 'clActiveBorder'), (Value: Vcl.Graphics.clActiveCaption; Name: 'clActiveCaption'), (Value: Vcl.Graphics.clBtnFace; Name: 'clBtnFace'), (Value: Vcl.Graphics.clBtnHighlight; Name: 'clBtnHighlight'), (Value: Vcl.Graphics.clBtnShadow; Name: 'clBtnShadow'), (Value: Vcl.Graphics.clBtnText; Name: 'clBtnText'), (Value: Vcl.Graphics.clCaptionText; Name: 'clCaptionText'), (Value: Vcl.Graphics.clGrayText; Name: 'clGrayText'), (Value: Vcl.Graphics.clHighlight; Name: 'clHighlight'), (Value: Vcl.Graphics.clHighlightText; Name: 'clHighlightText'), (Value: Vcl.Graphics.clInactiveBorder; Name: 'clInactiveBorder'), (Value: Vcl.Graphics.clInactiveCaption; Name: 'clInactiveCaption'), (Value: Vcl.Graphics.clInactiveCaptionText; Name: 'clInactiveCaptionText'), (Value: Vcl.Graphics.clInfoBk; Name: 'clInfoBk'), (Value: Vcl.Graphics.clInfoText; Name: 'clInfoText'), (Value: Vcl.Graphics.clMenu; Name: 'clMenu'), (Value: Vcl.Graphics.clMenuText; Name: 'clMenuText'), (Value: Vcl.Graphics.clScrollBar; Name: 'clScrollBar'), (Value: Vcl.Graphics.cl3DDkShadow; Name: 'cl3DDkShadow'), (Value: Vcl.Graphics.cl3DLight; Name: 'cl3DLight'), (Value: Vcl.Graphics.clWindow; Name: 'clWindow'), (Value: Vcl.Graphics.clWindowFrame; Name: 'clWindowFrame'), (Value: Vcl.Graphics.clWindowText; Name: 'clWindowText')); procedure ApplyEmptyVCLStyleHook(ControlClass :TClass); procedure RemoveEmptyVCLStyleHook(ControlClass :TClass); function IsStyleHookRegistered(ControlClass: TClass; StyleHookClass: TStyleHookClass) : Boolean; function GetRegisteredStylesHooks(ControlClass: TClass) : TStyleHookList; procedure DrawSampleWindow(Style:TCustomStyle;Canvas:TCanvas;ARect:TRect;const ACaption : string;hIcon:HICON=0);overload; {$IFDEF USE_VCL_STYLESAPI} type TCustomStyleExt = class(TCustomStyle) strict private FStream : TStream; public function GetStyleInfo : TStyleInfo; private function GetBitmapList: TObjectList; procedure SetStyleInfo(const Value: TStyleInfo); function GetSource: TObject; public {$REGION 'Documentation'} /// Create a TCustomStyleExt using a vcl style stored in a file /// {$ENDREGION} constructor Create(const FileName :string);reintroduce; overload; {$REGION 'Documentation'} /// Create a TCustomStyleExt using a vcl style stored in a stream /// {$ENDREGION} constructor Create(const Stream:TStream);reintroduce; overload; constructor Create(const Style:TCustomStyle);reintroduce; overload; destructor Destroy;override; {$REGION 'Documentation'} /// Replace a internal bitmap of the Style /// {$ENDREGION} procedure ReplaceBitmap(DestIndex : Integer;Src: TBitmap); {$REGION 'Documentation'} /// Set a returns the TStyleInfo fo the current style /// {$ENDREGION} property StyleInfo : TStyleInfo read GetStyleInfo write SetStyleInfo; {$REGION 'Documentation'} /// Return the list of the bitmaps of the style /// {$ENDREGION} property BitmapList: TObjectList read GetBitmapList; property LocalStream : TStream read FStream; {$REGION 'Documentation'} /// Copy the modified style to an Stream /// {$ENDREGION} procedure CopyToStream(Stream : TStream); property Source: TObject read GetSource; procedure SetStyleColor(Color: TStyleColor; NewColor: TColor); procedure SetStyleFontColor(Font: TStyleFont; NewColor: TColor); procedure SetSystemColor(Color: TColor; NewColor: TColor); procedure SetStyleFont(Font: TStyleFont; NewFont: TFont); end; { TCustomStyleHelper = Class Helper for TCustomStyle private function GetSource: TObject; public property Source: TObject read GetSource; procedure SetStyleColor(Color: TStyleColor; NewColor: TColor); procedure SetStyleFontColor(Font: TStyleFont; NewColor: TColor); procedure SetSystemColor(Color: TColor; NewColor: TColor); End; } //function DoHasElementFixedPosition(Details: TThemedElementDetails): Boolean; {$ENDIF} implementation uses System.Rtti, System.Types, System.Sysutils, {$IFDEF USE_VCL_STYLESAPI} System.ZLib, System.UITypes, Vcl.StdCtrls, Vcl.ImgList, Vcl.Consts, Vcl.GraphUtil, Vcl.Imaging.pngimage, Winapi.Messages, {$ENDIF} Vcl.Dialogs; {$IF (DEFINED (USE_VCL_STYLESAPI) and (CompilerVersion >=23))} {$I '..\source\vcl\StyleUtils.inc'} {$I '..\source\vcl\StyleAPI.inc'} {$IFEND} type TCustomControlClass = class(TCustomControl); TStyleHookDictionary = TDictionary; TCustomStyleEngineHelper = Class Helper for TCustomStyleEngine public class function GetRegisteredStyleHooks : TStyleHookDictionary; End; { const THEME_WP_CAPTION = 77; THEME_WP_SMALLCAPTION = 78; THEME_WP_MINCAPTION = 79; THEME_WP_SMALLMINCAPTION = 80; THEME_WP_MAXCAPTION = 81; THEME_WP_SMALLMAXCAPTION = 82; THEME_WP_FRAMELEFT = 83; THEME_WP_FRAMERIGHT = 84; THEME_WP_FRAMEBOTTOM = 85; THEME_WP_SMALLFRAMELEFT = 86; THEME_WP_SMALLFRAMERIGHT = 87; THEME_WP_SMALLFRAMEBOTTOM = 88; THEME_WP_SYSBUTTON = 89; THEME_WP_MDISYSBUTTON = 90; THEME_WP_MINBUTTON = 91; THEME_WP_MDIMINBUTTON = 92; THEME_WP_MAXBUTTON = 93; THEME_WP_CLOSEBUTTON = 94; THEME_WP_SMALLCLOSEBUTTON = 95; THEME_WP_MDICLOSEBUTTON = 96; THEME_WP_RESTOREBUTTON = 97; THEME_WP_MDIRESTOREBUTTON = 98; THEME_WP_HELPBUTTON = 99; THEME_WP_MDIHELPBUTTON = 100; THEME_WP_HORZSCROLL = 101; THEME_WP_HORZTHUMB = 102; THEME_WP_VERTSCROLL = 103; THEME_WP_VERTTHUMB = 104; THEME_WP_DIALOG = 105; THEME_WP_CAPTIONSIZINGTEMPLATE = 106; THEME_WP_SMALLCAPTIONSIZINGTEMPLATE = 107; THEME_WP_FRAMELEFTSIZINGTEMPLATE = 108; THEME_WP_SMALLFRAMELEFTSIZINGTEMPLATE = 109; THEME_WP_FRAMERIGHTSIZINGTEMPLATE = 110; THEME_WP_SMALLFRAMERIGHTSIZINGTEMPLATE = 111; THEME_WP_FRAMEBOTTOMSIZINGTEMPLATE = 112; THEME_WP_SMALLFRAMEBOTTOMSIZINGTEMPLATE = 113; THEME_WP_FRAME = 114; function DoHasElementFixedPosition(Details: TThemedElementDetails): Boolean; begin Result := False; if Details.Element <> teWindow then Exit; case Details.Part of THEME_WP_SMALLCLOSEBUTTON, THEME_WP_SMALLCAPTION: Result := TseStyle(FSource).WindowGetFixPosition(kwscToolWindow, kwbClose); THEME_WP_CLOSEBUTTON: Result := TseStyle(FSource).WindowGetFixPosition(kwscStandard, kwbClose); THEME_WP_HELPBUTTON: Result := TseStyle(FSource).WindowGetFixPosition(kwscStandard, kwbHelp); THEME_WP_MAXBUTTON, THEME_WP_RESTOREBUTTON: Result := TseStyle(FSource).WindowGetFixPosition(kwscStandard, kwbMax); THEME_WP_MINBUTTON: Result := TseStyle(FSource).WindowGetFixPosition(kwscStandard, kwbMin); THEME_WP_SYSBUTTON, THEME_WP_CAPTION: Result := TseStyle(FSource).WindowGetFixPosition(kwscStandard, kwbSysMenu); end; end; } class function TCustomStyleEngineHelper.GetRegisteredStyleHooks: TStyleHookDictionary; {$IF (CompilerVersion >= 31)} const Offset = SizeOf(Pointer) * 3; var p : Pointer; {$IFEND} begin {$IF (CompilerVersion <31)} Result:= Self.FRegisteredStyleHooks; {$ELSE} { TCustomStyleEngine.FRegisteredStyleHooks: 00651030 3052AA xor [edx-$56],dl 00651033 02F7 add dh,bh 00651035 097623 or [esi+$23],esi TCustomStyleEngine.$ClassInitFlag: 00651038 FFFF db $ff $ff 0065103A FFFF db $ff $ff TCustomStyleEngine.FRegSysStylesList: 0065103C D037 shl [edi],1 } //Use the address of the Self.FRegSysStylesList property to calculate the offset of the FRegisteredStyleHooks p := Pointer(PByte(@Self.FRegSysStylesList) - Offset); Result := TStyleHookDictionary(p^); {$IFEND} end; { TStyleManagerHelper } class function TStyleManagerHelper.RegisteredStyles: TDictionary; {$IF (CompilerVersion >= 31)} const Offset = SizeOf(Pointer) * 3; {$IFEND} var t : TPair; SourceInfo : TSourceInfo; LRegisteredStyles: TDictionary; {$IF (CompilerVersion >= 31)} p : Pointer; {$IFEND} begin Result:=TDictionary.Create; {$IF (CompilerVersion < 31)} LRegisteredStyles := Self.FRegisteredStyles; {$ELSE} { TStyleManager.FFlags: 006CD058 0100 add [eax],eax 006CD05A 0000 add [eax],al TStyleManager.FRegisteredStyles: 006CD05C 7050 jo $006cd0ae 006CD05E B702 mov bh,$02 TStyleManager.FStyleClassDescriptors: 006CD060 A850 test al,$50 006CD062 B702 mov bh,$02 TStyleManager.FStyleEngines: 006CD064 1851B7 sbb [ecx-$49],dl 006CD067 02E0 add ah,al 006CD069 50 push eax 006CD06A B702 mov bh,$02 TStyleManager.FSystemStyle: 006CD06C 2077B0 and [edi-$50],dh 006CD06F 0200 add al,[eax] TStyleManager.FSystemHooks: 006CD071 07 pop es 006CD076 FFFF db $ff $ff } //Use the address of the Self.Flags property to calculate the offset of the FRegisteredStyles {$IFDEF CPUX64} p := Pointer(PByte(@Self.Flags) + 8); {$ELSE} p := Pointer(PByte(@Self.Flags) + 4); {$ENDIF CPUX64} LRegisteredStyles := TDictionary(p^); {$IFEND} for t in LRegisteredStyles do begin SourceInfo.Data := t.Value.Data; SourceInfo.StyleClass := t.Value.StyleClass; Result.Add(t.Key, SourceInfo); end; end; class function TStyleManagerHelper.GetStyles: TList; {$IF (CompilerVersion >= 31)} var p : Pointer; {$IFEND} begin {$IF (CompilerVersion <31)} Result := Self.FStyles; {$ELSE} { TStyleManager.FStyles: 0067E06C E050 loopne $0067e0be 0067E06E AD lodsd 0067E06F 0220 add ah,[eax] 0067E071 77A6 jnbe $0067e019 0067E073 0200 add al,[eax] .... .... TStyleManager.FFlags: 0067E05C 0001 add [ecx],al 0067E05E 0000 add [eax],al TStyleManager.FRegisteredStyles: 0067E060 7050 jo $0067e0b2 0067E062 AD lodsd 0067E063 02A850AD0218 add ch,[eax+$1802ad50] } {$IFDEF CPUX64} p := Pointer(PByte(@Self.Flags) + 32); {$ELSE} p := Pointer(PByte(@Self.Flags) + 16); {$ENDIF CPUX64} Result := TList(p^); {$IFEND} end; class function TStyleManagerHelper.GetStyleSourceInfo(const StyleName: string): TSourceInfo; Var LRegisteredStyles : TDictionary; begin LRegisteredStyles := TStyleManager.RegisteredStyles; try if LRegisteredStyles.ContainsKey(StyleName) then Result:=LRegisteredStyles[StyleName]; finally LRegisteredStyles.Free; end; end; class procedure TStyleManagerHelper.RefreshCurrentTheme; var I: Integer; begin for I := 0 to Screen.FormCount - 1 do if Screen.Forms[I].HandleAllocated then if IsWindowVisible(Screen.Forms[I].Handle) then PostMessage(Screen.Forms[I].Handle, CM_CUSTOMSTYLECHANGED, 0, 0) else SendMessage(Screen.Forms[I].Handle, CM_CUSTOMSTYLECHANGED, 0, 0); end; class procedure TStyleManagerHelper.ReloadStyle(const StyleName : string); var LStyle: TCustomStyleServices; LPair : TPair; LRegisteredStyles : TDictionary; begin if SameText(StyleName, ActiveStyle.Name, loUserLocale) then SetStyle(SystemStyle); for LStyle in Styles do if SameText(StyleName, LStyle.Name, loUserLocale) then begin LStyle.Free; Styles.Remove(LStyle); end; LRegisteredStyles := Self.RegisteredStyles; try for LPair in LRegisteredStyles do if SameText(StyleName, LPair.Key, loUserLocale) then if (LPair.Value.Data<>nil) then begin TStream(LPair.Value.Data).Position:=0; break; end; finally LRegisteredStyles.Free; end; SetStyle(StyleName); end; class procedure TStyleManagerHelper.RemoveStyle(const StyleName: string); var LStyle: TCustomStyleServices; LPair : TPair; begin if SameText(StyleName, ActiveStyle.Name, loUserLocale) then SetStyle(SystemStyle); for LStyle in Styles do if SameText(StyleName, LStyle.Name, loUserLocale) then begin LStyle.Free; Styles.Remove(LStyle); end; for LPair in Self.RegisteredStyles do if SameText(StyleName, LPair.Key, loUserLocale) then begin TMemoryStream(LPair.Value.Data).Free; Self.RegisteredStyles.Remove(LPair.Key); end; end; class function TStyleManagerHelper._GetStyles: TList; begin Result := TStyleManager.GetStyles; end; class function TStyleManagerHelper.StyleLoaded( const StyleName: string): Boolean; begin Result := TStyleManager.Style[StyleName] <> nil; end; function GetRegisteredStylesHooks(ControlClass: TClass) : TStyleHookList; begin Result:=nil; if TCustomStyleEngine.GetRegisteredStyleHooks.ContainsKey(ControlClass) then Result:=TCustomStyleEngine.GetRegisteredStyleHooks[ControlClass]; end; function IsStyleHookRegistered(ControlClass: TClass; StyleHookClass: TStyleHookClass) : Boolean; var List : TStyleHookList; begin Result:=False; if TCustomStyleEngine.GetRegisteredStyleHooks.ContainsKey(ControlClass) then begin List := TCustomStyleEngine.GetRegisteredStyleHooks[ControlClass]; Result:=List.IndexOf(StyleHookClass) <> -1; end; end; Procedure ApplyEmptyVCLStyleHook(ControlClass :TClass); begin if not IsStyleHookRegistered(ControlClass, TStyleHook) then TStyleManager.Engine.RegisterStyleHook(ControlClass, TStyleHook); end; Procedure RemoveEmptyVCLStyleHook(ControlClass :TClass); begin if IsStyleHookRegistered(ControlClass, TStyleHook) then TStyleManager.Engine.UnRegisterStyleHook(ControlClass, TStyleHook); end; {$IFDEF USE_VCL_STYLESAPI} { TVCLStyleExt } constructor TCustomStyleExt.Create(const FileName: string); var LStream: TFileStream; begin LStream := TFileStream.Create(FileName, fmOpenRead); try Create(LStream); finally LStream.Free; end; end; procedure TCustomStyleExt.CopyToStream(Stream: TStream); var I : Integer; begin Stream.Size:=0; Stream.Position:=0; TseStyle(Source).FCleanCopy.Name := TseStyle(Source).StyleSource.Name; TseStyle(Source).FCleanCopy.Author := TseStyle(Source).StyleSource.Author; TseStyle(Source).FCleanCopy.AuthorEMail := TseStyle(Source).StyleSource.AuthorEMail; TseStyle(Source).FCleanCopy.AuthorURL := TseStyle(Source).StyleSource.AuthorURL; TseStyle(Source).FCleanCopy.Version := TseStyle(Source).StyleSource.Version; //Replace the modified bitmaps for i := 0 to TseStyle(Source).FCleanCopy.Bitmaps.Count-1 do TseStyle(Source).FCleanCopy.Bitmaps[i].Assign(TseStyle(Source).StyleSource.Bitmaps[i]); //TseStyle(Source).StyleSource.SysColors.Assign(TseStyle(Source).SysColors); //Replace the modified colors TseStyle(Source).FCleanCopy.SysColors.Assign(TseStyle(Source).SysColors); TseStyle(Source).FCleanCopy.Colors.Assign(TseStyle(Source).Colors); TseStyle(Source).FCleanCopy.Fonts.Assign(TseStyle(Source).Fonts); //ShowMessage(ColorToString(TseStyle(Source).SysColors[clWindow])); TseStyle(Source).SaveToStream(Stream); { TseStyle(Source).StyleSource.Fonts.Assign(TseStyle(Source).Fonts); TseStyle(Source).StyleSource.Colors.Assign(TseStyle(Source).Colors); TseStyle(Source).StyleSource.SysColors.Assign(TseStyle(Source).SysColors); TseStyle(Source).StyleSource.SaveToStream(Stream); } end; constructor TCustomStyleExt.Create(const Style: TCustomStyle); begin //Style.Source //inherited Create(TStream(Style.)); end; constructor TCustomStyleExt.Create(const Stream: TStream); var LSource: TObject; begin inherited Create; FStream:=TMemoryStream.Create; Stream.Seek(0, soBeginning); //index 0 to load FStream.CopyFrom(Stream, Stream.Size); Stream.Seek(0, soBeginning); //restore index 0 after LSource:=Source; FStream.Seek(0, soBeginning);//index 0 to load TseStyle(LSource).LoadFromStream(FStream); end; destructor TCustomStyleExt.Destroy; begin if Assigned(FStream) then FStream.Free; inherited Destroy; end; function TCustomStyleExt.GetBitmapList: TObjectList; var LSource: TObject; I{,Lindex}: Integer; LseBitmap : TseBitmap; begin LSource:=Source; Result:=TObjectList.Create; { Lindex:=0; for I:=0 to Length(TseStyle(LSource).FObjects)-1 do if (TseStyle(LSource).FObjects[i]<>nil) and (TSeStyleObject(TseStyle(LSource).FObjects[i]).Bitmaps<>nil) then begin Result.Add(TBitmap.Create); Result[Lindex].PixelFormat:=pf32bit; LseBitmap:=TSeStyleObject(TseStyle(LSource).FObjects[i]).Bitmaps[0]; Result[Lindex].Width := LseBitmap.Width; Result[Lindex].Height:= LseBitmap.Height; LseBitmap.Draw(Result[Lindex].Canvas,0,0); //Result[Lindex].SaveToFile(Format('C:\Users\Dexter\Desktop\Brazil\%d.bmp',[LIndex])); inc(Lindex); break; end; } for I:=0 to TseStyle(LSource).StyleSource.Bitmaps.Count-1 do begin Result.Add(TBitmap.Create); Result[I].PixelFormat:=pf32bit; LseBitmap:=TseStyle(LSource).StyleSource.Bitmaps[I]; Result[I].Width := LseBitmap.Width; Result[I].Height:= LseBitmap.Height; LseBitmap.Draw(Result[I].Canvas,0,0); end; end; procedure TCustomStyleExt.ReplaceBitmap(DestIndex: Integer; Src: TBitmap); var BF : TBlendFunction; Canvas : TCanvas; LBitMap : TseBitmap; DstRect, SrcRect: TRect; begin LBitMap:=TseStyle(Source).StyleSource.Bitmaps[DestIndex]; SrcRect:=Rect(0 ,0, Src.Width, Src.Height); DstRect:=Rect(0 ,0, Src.Width, Src.Height); Canvas:= LBitMap.Canvas; SetStretchBltMode(Canvas.Handle, COLORONCOLOR); if LBitMap.AlphaBlend then begin BF.BlendOp := AC_SRC_OVER; BF.BlendFlags := 0; BF.SourceConstantAlpha := 255; BF.AlphaFormat := AC_SRC_ALPHA; Winapi.Windows.AlphaBlend(Canvas.Handle, DstRect.Left, DstRect.Top, DstRect.Right - DstRect.Left, DstRect.Bottom - DstRect.Top, Src.Canvas.Handle, SrcRect.Left, SrcRect.Top, SrcRect.Right - SrcRect.Left, SrcRect.Bottom - SrcRect.Top, BF); end else if LBitMap.Transparent then begin Winapi.Windows.TransparentBlt(Canvas.Handle, DstRect.Left, DstRect.Top, DstRect.Right - DstRect.Left, DstRect.Bottom - DstRect.Top, Src.Canvas.Handle, SrcRect.Left, SrcRect.Top, SrcRect.Right - SrcRect.Left, SrcRect.Bottom - SrcRect.Top, seTransparent); end else begin Winapi.Windows.StretchBlt(Canvas.Handle, DstRect.Left, DstRect.Top, DstRect.Right - DstRect.Left, DstRect.Bottom - DstRect.Top, Src.Canvas.Handle, SrcRect.Left, SrcRect.Top, SrcRect.Right - SrcRect.Left, SrcRect.Bottom - SrcRect.Top, SRCCOPY); end; end; procedure TCustomStyleExt.SetStyleColor(Color: TStyleColor; NewColor: TColor); begin case Color of scBorder: if TSeStyle(Source).Colors[ktcBorder]<>NewColor then TSeStyle(Source).Colors[ktcBorder]:=NewColor; scButtonDisabled: if TSeStyle(Source).Colors[ktcButtonDisabled]<>NewColor then TSeStyle(Source).Colors[ktcButtonDisabled]:=NewColor; scButtonFocused: if TSeStyle(Source).Colors[ktcButtonFocused]<>NewColor then TSeStyle(Source).Colors[ktcButtonFocused]:=NewColor; scButtonHot: if TSeStyle(Source).Colors[ktcButtonHot]<>NewColor then TSeStyle(Source).Colors[ktcButtonHot]:=NewColor; scButtonNormal: if TSeStyle(Source).Colors[ktcButton]<>NewColor then TSeStyle(Source).Colors[ktcButton]:=NewColor; scButtonPressed: if TSeStyle(Source).Colors[ktcButtonPressed]<>NewColor then TSeStyle(Source).Colors[ktcButtonPressed]:=NewColor; scCategoryButtons: if TSeStyle(Source).Colors[ktcCategoryButtons]<>NewColor then TSeStyle(Source).Colors[ktcCategoryButtons]:=NewColor; scCategoryButtonsGradientBase: if TSeStyle(Source).Colors[ktcCategoryButtonsGradientBase]<>NewColor then TSeStyle(Source).Colors[ktcCategoryButtonsGradientBase]:=NewColor; scCategoryButtonsGradientEnd: if TSeStyle(Source).Colors[ktcCategoryButtonsGradientEnd]<>NewColor then TSeStyle(Source).Colors[ktcCategoryButtonsGradientEnd]:=NewColor; scCategoryPanelGroup: if TSeStyle(Source).Colors[ktcCategoryPanelGroup]<>NewColor then TSeStyle(Source).Colors[ktcCategoryPanelGroup]:=NewColor; scComboBox: if TSeStyle(Source).Colors[ktcComboBox]<>NewColor then TSeStyle(Source).Colors[ktcComboBox]:=NewColor; scComboBoxDisabled: if TSeStyle(Source).Colors[ktcComboBoxDisabled]<>NewColor then TSeStyle(Source).Colors[ktcComboBoxDisabled]:=NewColor; scEdit: if TSeStyle(Source).Colors[ktcEdit]<>NewColor then TSeStyle(Source).Colors[ktcEdit]:=NewColor; scEditDisabled: if TSeStyle(Source).Colors[ktcEditDisabled]<>NewColor then TSeStyle(Source).Colors[ktcEditDisabled]:=NewColor; scGrid: if TSeStyle(Source).Colors[ktcGrid]<>NewColor then TSeStyle(Source).Colors[ktcGrid]:=NewColor; scGenericBackground: if TSeStyle(Source).Colors[ktcGenericBackground]<>NewColor then TSeStyle(Source).Colors[ktcGenericBackground]:=NewColor; scGenericGradientEnd: if TSeStyle(Source).Colors[ktcGenericGradientEnd]<>NewColor then TSeStyle(Source).Colors[ktcGenericGradientEnd]:=NewColor; scGenericGradientBase: if TSeStyle(Source).Colors[ktcGenericGradientBase]<>NewColor then TSeStyle(Source).Colors[ktcGenericGradientBase]:=NewColor; scHintGradientBase: if TSeStyle(Source).Colors[ktcHintGradientBase]<>NewColor then TSeStyle(Source).Colors[ktcHintGradientBase]:=NewColor; scHintGradientEnd: if TSeStyle(Source).Colors[ktcHintGradientEnd]<>NewColor then TSeStyle(Source).Colors[ktcHintGradientEnd]:=NewColor; scListBox: if TSeStyle(Source).Colors[ktcListBox]<>NewColor then TSeStyle(Source).Colors[ktcListBox]:=NewColor; scListBoxDisabled: if TSeStyle(Source).Colors[ktcListBoxDisabled]<>NewColor then TSeStyle(Source).Colors[ktcListBoxDisabled]:=NewColor; scListView: if TSeStyle(Source).Colors[ktcListView]<>NewColor then TSeStyle(Source).Colors[ktcListView]:=NewColor; scPanel: if TSeStyle(Source).Colors[ktcPanel]<>NewColor then TSeStyle(Source).Colors[ktcPanel]:=NewColor; scPanelDisabled: if TSeStyle(Source).Colors[ktcPanelDisabled]<>NewColor then TSeStyle(Source).Colors[ktcPanelDisabled]:=NewColor; scSplitter: if TSeStyle(Source).Colors[ktcSplitter]<>NewColor then TSeStyle(Source).Colors[ktcSplitter]:=NewColor; scToolBarGradientBase: if TSeStyle(Source).Colors[ktcToolBarGradientBase]<>NewColor then TSeStyle(Source).Colors[ktcToolBarGradientBase]:=NewColor; scToolBarGradientEnd: if TSeStyle(Source).Colors[ktcToolBarGradientEnd]<>NewColor then TSeStyle(Source).Colors[ktcToolBarGradientEnd]:=NewColor; scTreeView: if TSeStyle(Source).Colors[ktcTreeView]<>NewColor then TSeStyle(Source).Colors[ktcTreeView]:=NewColor; scWindow: if TSeStyle(Source).Colors[ktcWindow]<>NewColor then TSeStyle(Source).Colors[ktcWindow]:=NewColor; end; end; procedure TCustomStyleExt.SetStyleFont(Font: TStyleFont; NewFont: TFont); begin case Font of sfButtonTextDisabled: if TSeStyle(Source).Fonts[ktfButtonTextDisabled]<> NewFont then TSeStyle(Source).Fonts[ktfButtonTextDisabled]:=NewFont; sfButtonTextFocused: if TSeStyle(Source).Fonts[ktfButtonTextFocused]<> NewFont then TSeStyle(Source).Fonts[ktfButtonTextFocused]:=NewFont; sfButtonTextHot: if TSeStyle(Source).Fonts[ktfButtonTextHot]<> NewFont then TSeStyle(Source).Fonts[ktfButtonTextHot]:=NewFont; sfButtonTextNormal: if TSeStyle(Source).Fonts[ktfButtonTextNormal]<> NewFont then TSeStyle(Source).Fonts[ktfButtonTextNormal]:=NewFont; sfButtonTextPressed: if TSeStyle(Source).Fonts[ktfButtonTextPressed]<> NewFont then TSeStyle(Source).Fonts[ktfButtonTextPressed]:=NewFont; sfCaptionTextInactive: if TSeStyle(Source).Fonts[ktfCaptionTextInactive]<> NewFont then TSeStyle(Source).Fonts[ktfCaptionTextInactive]:=NewFont; sfCaptionTextNormal: if TSeStyle(Source).Fonts[ktfCaptionTextNormal]<> NewFont then TSeStyle(Source).Fonts[ktfCaptionTextNormal]:=NewFont; sfCategoryPanelGroupHeaderHot: if TSeStyle(Source).Fonts[ktfCategoryPanelGroupHeaderHot]<> NewFont then TSeStyle(Source).Fonts[ktfCategoryPanelGroupHeaderHot]:=NewFont; sfCategoryPanelGroupHeaderNormal: if TSeStyle(Source).Fonts[ktfCategoryPanelGroupHeaderNormal]<> NewFont then TSeStyle(Source).Fonts[ktfCategoryPanelGroupHeaderNormal]:=NewFont; sfCatgeoryButtonsCategoryNormal: if TSeStyle(Source).Fonts[ktfCatgeoryButtonsCategoryNormal]<> NewFont then TSeStyle(Source).Fonts[ktfCatgeoryButtonsCategoryNormal]:=NewFont; sfCatgeoryButtonsCategorySelected: if TSeStyle(Source).Fonts[ktfCatgeoryButtonsCategorySelected]<> NewFont then TSeStyle(Source).Fonts[ktfCatgeoryButtonsCategorySelected]:=NewFont; sfCatgeoryButtonsHot: if TSeStyle(Source).Fonts[ktfCatgeoryButtonsHot]<> NewFont then TSeStyle(Source).Fonts[ktfCatgeoryButtonsHot]:=NewFont; sfCatgeoryButtonsNormal: if TSeStyle(Source).Fonts[ktfCatgeoryButtonsNormal]<> NewFont then TSeStyle(Source).Fonts[ktfCatgeoryButtonsNormal]:=NewFont; sfCatgeoryButtonsSelected: if TSeStyle(Source).Fonts[ktfCatgeoryButtonsSelected]<> NewFont then TSeStyle(Source).Fonts[ktfCatgeoryButtonsSelected]:=NewFont; sfCheckBoxTextDisabled: if TSeStyle(Source).Fonts[ktfCheckBoxTextDisabled]<> NewFont then TSeStyle(Source).Fonts[ktfCheckBoxTextDisabled]:=NewFont; sfCheckBoxTextFocused: if TSeStyle(Source).Fonts[ktfCheckBoxTextFocused]<> NewFont then TSeStyle(Source).Fonts[ktfCheckBoxTextFocused]:=NewFont; sfCheckBoxTextHot: if TSeStyle(Source).Fonts[ktfCheckBoxTextHot]<> NewFont then TSeStyle(Source).Fonts[ktfCheckBoxTextHot]:=NewFont; sfCheckBoxTextNormal: if TSeStyle(Source).Fonts[ktfCheckBoxTextNormal]<> NewFont then TSeStyle(Source).Fonts[ktfCheckBoxTextNormal]:=NewFont; sfCheckBoxTextPressed: if TSeStyle(Source).Fonts[ktfCheckBoxTextPressed]<> NewFont then TSeStyle(Source).Fonts[ktfCheckBoxTextPressed]:=NewFont; sfComboBoxItemDisabled: if TSeStyle(Source).Fonts[ktfComboBoxItemDisabled]<> NewFont then TSeStyle(Source).Fonts[ktfComboBoxItemDisabled]:=NewFont; sfComboBoxItemFocused: if TSeStyle(Source).Fonts[ktfComboBoxItemFocused]<> NewFont then TSeStyle(Source).Fonts[ktfComboBoxItemFocused]:=NewFont; sfComboBoxItemHot: if TSeStyle(Source).Fonts[ktfComboBoxItemHot]<> NewFont then TSeStyle(Source).Fonts[ktfComboBoxItemHot]:=NewFont; sfComboBoxItemNormal: if TSeStyle(Source).Fonts[ktfComboBoxItemNormal]<> NewFont then TSeStyle(Source).Fonts[ktfComboBoxItemNormal]:=NewFont; sfComboBoxItemSelected: if TSeStyle(Source).Fonts[ktfComboBoxItemSelected]<> NewFont then TSeStyle(Source).Fonts[ktfComboBoxItemSelected]:=NewFont; sfEditBoxTextDisabled: if TSeStyle(Source).Fonts[ktfEditBoxTextDisabled]<> NewFont then TSeStyle(Source).Fonts[ktfEditBoxTextDisabled]:=NewFont; sfEditBoxTextFocused: if TSeStyle(Source).Fonts[ktfEditBoxTextFocused]<> NewFont then TSeStyle(Source).Fonts[ktfEditBoxTextFocused]:=NewFont; sfEditBoxTextHot: if TSeStyle(Source).Fonts[ktfEditBoxTextHot]<> NewFont then TSeStyle(Source).Fonts[ktfEditBoxTextHot]:=NewFont; sfEditBoxTextNormal: if TSeStyle(Source).Fonts[ktfEditBoxTextNormal]<> NewFont then TSeStyle(Source).Fonts[ktfEditBoxTextNormal]:=NewFont; sfEditBoxTextSelected: if TSeStyle(Source).Fonts[ktfEditBoxTextSelected]<> NewFont then TSeStyle(Source).Fonts[ktfEditBoxTextSelected]:=NewFont; sfGridItemFixedHot: if TSeStyle(Source).Fonts[ktfGridItemFixedHot]<> NewFont then TSeStyle(Source).Fonts[ktfGridItemFixedHot]:=NewFont; sfGridItemFixedNormal: if TSeStyle(Source).Fonts[ktfGridItemFixedNormal]<> NewFont then TSeStyle(Source).Fonts[ktfGridItemFixedNormal]:=NewFont; sfGridItemFixedPressed: if TSeStyle(Source).Fonts[ktfGridItemFixedPressed]<> NewFont then TSeStyle(Source).Fonts[ktfGridItemFixedPressed]:=NewFont; sfGridItemNormal: if TSeStyle(Source).Fonts[ktfGridItemNormal]<> NewFont then TSeStyle(Source).Fonts[ktfGridItemNormal]:=NewFont; sfGridItemSelected: if TSeStyle(Source).Fonts[ktfGridItemSelected]<> NewFont then TSeStyle(Source).Fonts[ktfGridItemSelected]:=NewFont; sfGroupBoxTextDisabled: if TSeStyle(Source).Fonts[ktfGroupBoxTextDisabled]<> NewFont then TSeStyle(Source).Fonts[ktfGroupBoxTextDisabled]:=NewFont; sfGroupBoxTextNormal: if TSeStyle(Source).Fonts[ktfGroupBoxTextNormal]<> NewFont then TSeStyle(Source).Fonts[ktfGroupBoxTextNormal]:=NewFont; sfHeaderSectionTextDisabled: if TSeStyle(Source).Fonts[ktfHeaderSectionTextDisabled]<> NewFont then TSeStyle(Source).Fonts[ktfHeaderSectionTextDisabled]:=NewFont; sfHeaderSectionTextHot: if TSeStyle(Source).Fonts[ktfHeaderSectionTextHot]<> NewFont then TSeStyle(Source).Fonts[ktfHeaderSectionTextHot]:=NewFont; sfHeaderSectionTextNormal: if TSeStyle(Source).Fonts[ktfHeaderSectionTextNormal]<> NewFont then TSeStyle(Source).Fonts[ktfHeaderSectionTextNormal]:=NewFont; sfHeaderSectionTextPressed: if TSeStyle(Source).Fonts[ktfHeaderSectionTextPressed]<> NewFont then TSeStyle(Source).Fonts[ktfHeaderSectionTextPressed]:=NewFont; sfListItemTextDisabled: if TSeStyle(Source).Fonts[ktfListItemTextDisabled]<> NewFont then TSeStyle(Source).Fonts[ktfListItemTextDisabled]:=NewFont; sfListItemTextFocused: if TSeStyle(Source).Fonts[ktfListItemTextFocused]<> NewFont then TSeStyle(Source).Fonts[ktfListItemTextFocused]:=NewFont; sfListItemTextHot: if TSeStyle(Source).Fonts[ktfListItemTextHot]<> NewFont then TSeStyle(Source).Fonts[ktfListItemTextHot]:=NewFont; sfListItemTextNormal: if TSeStyle(Source).Fonts[ktfListItemTextNormal]<> NewFont then TSeStyle(Source).Fonts[ktfListItemTextNormal]:=NewFont; sfListItemTextSelected: if TSeStyle(Source).Fonts[ktfListItemTextSelected]<> NewFont then TSeStyle(Source).Fonts[ktfListItemTextSelected]:=NewFont; sfMenuItemTextDisabled: if TSeStyle(Source).Fonts[ktfMenuItemTextDisabled]<> NewFont then TSeStyle(Source).Fonts[ktfMenuItemTextDisabled]:=NewFont; sfMenuItemTextHot: if TSeStyle(Source).Fonts[ktfMenuItemTextHot]<> NewFont then TSeStyle(Source).Fonts[ktfMenuItemTextHot]:=NewFont; sfMenuItemTextNormal: if TSeStyle(Source).Fonts[ktfMenuItemTextNormal]<> NewFont then TSeStyle(Source).Fonts[ktfMenuItemTextNormal]:=NewFont; sfMenuItemTextSelected: if TSeStyle(Source).Fonts[ktfMenuItemTextSelected]<> NewFont then TSeStyle(Source).Fonts[ktfMenuItemTextSelected]:=NewFont; sfPanelTextDisabled: if TSeStyle(Source).Fonts[ktfPanelTextDisabled]<> NewFont then TSeStyle(Source).Fonts[ktfPanelTextDisabled]:=NewFont; sfPanelTextNormal: if TSeStyle(Source).Fonts[ktfPanelTextNormal]<> NewFont then TSeStyle(Source).Fonts[ktfPanelTextNormal]:=NewFont; sfPopupMenuItemTextDisabled: if TSeStyle(Source).Fonts[ktfPopupMenuItemTextDisabled]<> NewFont then TSeStyle(Source).Fonts[ktfPopupMenuItemTextDisabled]:=NewFont; sfPopupMenuItemTextHot: if TSeStyle(Source).Fonts[ktfPopupMenuItemTextHot]<> NewFont then TSeStyle(Source).Fonts[ktfPopupMenuItemTextHot]:=NewFont; sfPopupMenuItemTextNormal: if TSeStyle(Source).Fonts[ktfPopupMenuItemTextNormal]<> NewFont then TSeStyle(Source).Fonts[ktfPopupMenuItemTextNormal]:=NewFont; sfPopupMenuItemTextSelected: if TSeStyle(Source).Fonts[ktfPopupMenuItemTextSelected]<> NewFont then TSeStyle(Source).Fonts[ktfPopupMenuItemTextSelected]:=NewFont; sfRadioButtonTextDisabled: if TSeStyle(Source).Fonts[ktfRadioButtonTextDisabled]<> NewFont then TSeStyle(Source).Fonts[ktfRadioButtonTextDisabled]:=NewFont; sfRadioButtonTextFocused: if TSeStyle(Source).Fonts[ktfRadioButtonTextFocused]<> NewFont then TSeStyle(Source).Fonts[ktfRadioButtonTextFocused]:=NewFont; sfRadioButtonTextHot: if TSeStyle(Source).Fonts[ktfRadioButtonTextHot]<> NewFont then TSeStyle(Source).Fonts[ktfRadioButtonTextHot]:=NewFont; sfRadioButtonTextNormal: if TSeStyle(Source).Fonts[ktfRadioButtonTextNormal]<> NewFont then TSeStyle(Source).Fonts[ktfRadioButtonTextNormal]:=NewFont; sfRadioButtonTextPressed: if TSeStyle(Source).Fonts[ktfRadioButtonTextPressed]<> NewFont then TSeStyle(Source).Fonts[ktfRadioButtonTextPressed]:=NewFont; sfSmCaptionTextInactive: if TSeStyle(Source).Fonts[ktfSmCaptionTextInactive]<> NewFont then TSeStyle(Source).Fonts[ktfSmCaptionTextInactive]:=NewFont; sfSmCaptionTextNormal: if TSeStyle(Source).Fonts[ktfSmCaptionTextNormal]<> NewFont then TSeStyle(Source).Fonts[ktfSmCaptionTextNormal]:=NewFont; sfStatusPanelTextDisabled: if TSeStyle(Source).Fonts[ktfStatusPanelTextDisabled]<> NewFont then TSeStyle(Source).Fonts[ktfStatusPanelTextDisabled]:=NewFont; sfStatusPanelTextNormal: if TSeStyle(Source).Fonts[ktfStatusPanelTextNormal]<> NewFont then TSeStyle(Source).Fonts[ktfStatusPanelTextNormal]:=NewFont; sfTabTextActiveDisabled: if TSeStyle(Source).Fonts[ktfTabTextActiveDisabled]<> NewFont then TSeStyle(Source).Fonts[ktfTabTextActiveDisabled]:=NewFont; sfTabTextActiveHot: if TSeStyle(Source).Fonts[ktfTabTextActiveHot]<> NewFont then TSeStyle(Source).Fonts[ktfTabTextActiveHot]:=NewFont; sfTabTextActiveNormal: if TSeStyle(Source).Fonts[ktfTabTextActiveNormal]<> NewFont then TSeStyle(Source).Fonts[ktfTabTextActiveNormal]:=NewFont; sfTabTextInactiveDisabled: if TSeStyle(Source).Fonts[ktfTabTextInactiveDisabled]<> NewFont then TSeStyle(Source).Fonts[ktfTabTextInactiveDisabled]:=NewFont; sfTabTextInactiveHot: if TSeStyle(Source).Fonts[ktfTabTextInactiveHot]<> NewFont then TSeStyle(Source).Fonts[ktfTabTextInactiveHot]:=NewFont; sfTabTextInactiveNormal: if TSeStyle(Source).Fonts[ktfTabTextInactiveNormal]<> NewFont then TSeStyle(Source).Fonts[ktfTabTextInactiveNormal]:=NewFont; sfTextLabelDisabled: if TSeStyle(Source).Fonts[ktfStaticTextDisabled]<> NewFont then TSeStyle(Source).Fonts[ktfStaticTextDisabled]:=NewFont; sfTextLabelFocused: if TSeStyle(Source).Fonts[ktfStaticTextFocused]<> NewFont then TSeStyle(Source).Fonts[ktfStaticTextFocused]:=NewFont; sfTextLabelHot: if TSeStyle(Source).Fonts[ktfStaticTextHot]<> NewFont then TSeStyle(Source).Fonts[ktfStaticTextHot]:=NewFont; sfTextLabelNormal: if TSeStyle(Source).Fonts[ktfStaticTextNormal]<> NewFont then TSeStyle(Source).Fonts[ktfStaticTextNormal]:=NewFont; sfToolItemTextDisabled: if TSeStyle(Source).Fonts[ktfToolItemTextDisabled]<> NewFont then TSeStyle(Source).Fonts[ktfToolItemTextDisabled]:=NewFont; sfToolItemTextHot: if TSeStyle(Source).Fonts[ktfToolItemTextHot]<> NewFont then TSeStyle(Source).Fonts[ktfToolItemTextHot]:=NewFont; sfToolItemTextNormal: if TSeStyle(Source).Fonts[ktfToolItemTextNormal]<> NewFont then TSeStyle(Source).Fonts[ktfToolItemTextNormal]:=NewFont; sfToolItemTextSelected: if TSeStyle(Source).Fonts[ktfToolItemTextSelected]<> NewFont then TSeStyle(Source).Fonts[ktfToolItemTextSelected]:=NewFont; sfTreeItemTextDisabled: if TSeStyle(Source).Fonts[ktfTreeItemTextDisabled]<> NewFont then TSeStyle(Source).Fonts[ktfTreeItemTextDisabled]:=NewFont; sfTreeItemTextFocused: if TSeStyle(Source).Fonts[ktfTreeItemTextFocused]<> NewFont then TSeStyle(Source).Fonts[ktfTreeItemTextFocused]:=NewFont; sfTreeItemTextHot: if TSeStyle(Source).Fonts[ktfTreeItemTextHot]<> NewFont then TSeStyle(Source).Fonts[ktfTreeItemTextHot]:=NewFont; sfTreeItemTextNormal: if TSeStyle(Source).Fonts[ktfTreeItemTextNormal]<> NewFont then TSeStyle(Source).Fonts[ktfTreeItemTextNormal]:=NewFont; sfTreeItemTextSelected: if TSeStyle(Source).Fonts[ktfTreeItemTextSelected]<> NewFont then TSeStyle(Source).Fonts[ktfTreeItemTextSelected]:=NewFont; sfWindowTextDisabled: if TSeStyle(Source).Fonts[ktfWindowTextDisabled]<> NewFont then TSeStyle(Source).Fonts[ktfWindowTextDisabled]:=NewFont; sfWindowTextNormal: if TSeStyle(Source).Fonts[ktfWindowTextNormal]<> NewFont then TSeStyle(Source).Fonts[ktfWindowTextNormal]:=NewFont; end; end; procedure TCustomStyleExt.SetStyleFontColor(Font: TStyleFont; NewColor: TColor); begin case Font of sfButtonTextDisabled: if TSeStyle(Source).Fonts[ktfButtonTextDisabled].Color<> NewColor then TSeStyle(Source).Fonts[ktfButtonTextDisabled].Color:=NewColor; sfButtonTextFocused: if TSeStyle(Source).Fonts[ktfButtonTextFocused].Color<> NewColor then TSeStyle(Source).Fonts[ktfButtonTextFocused].Color:=NewColor; sfButtonTextHot: if TSeStyle(Source).Fonts[ktfButtonTextHot].Color<> NewColor then TSeStyle(Source).Fonts[ktfButtonTextHot].Color:=NewColor; sfButtonTextNormal: if TSeStyle(Source).Fonts[ktfButtonTextNormal].Color<> NewColor then TSeStyle(Source).Fonts[ktfButtonTextNormal].Color:=NewColor; sfButtonTextPressed: if TSeStyle(Source).Fonts[ktfButtonTextPressed].Color<> NewColor then TSeStyle(Source).Fonts[ktfButtonTextPressed].Color:=NewColor; sfCaptionTextInactive: if TSeStyle(Source).Fonts[ktfCaptionTextInactive].Color<> NewColor then TSeStyle(Source).Fonts[ktfCaptionTextInactive].Color:=NewColor; sfCaptionTextNormal: if TSeStyle(Source).Fonts[ktfCaptionTextNormal].Color<> NewColor then TSeStyle(Source).Fonts[ktfCaptionTextNormal].Color:=NewColor; sfCategoryPanelGroupHeaderHot: if TSeStyle(Source).Fonts[ktfCategoryPanelGroupHeaderHot].Color<> NewColor then TSeStyle(Source).Fonts[ktfCategoryPanelGroupHeaderHot].Color:=NewColor; sfCategoryPanelGroupHeaderNormal: if TSeStyle(Source).Fonts[ktfCategoryPanelGroupHeaderNormal].Color<> NewColor then TSeStyle(Source).Fonts[ktfCategoryPanelGroupHeaderNormal].Color:=NewColor; sfCatgeoryButtonsCategoryNormal: if TSeStyle(Source).Fonts[ktfCatgeoryButtonsCategoryNormal].Color<> NewColor then TSeStyle(Source).Fonts[ktfCatgeoryButtonsCategoryNormal].Color:=NewColor; sfCatgeoryButtonsCategorySelected: if TSeStyle(Source).Fonts[ktfCatgeoryButtonsCategorySelected].Color<> NewColor then TSeStyle(Source).Fonts[ktfCatgeoryButtonsCategorySelected].Color:=NewColor; sfCatgeoryButtonsHot: if TSeStyle(Source).Fonts[ktfCatgeoryButtonsHot].Color<> NewColor then TSeStyle(Source).Fonts[ktfCatgeoryButtonsHot].Color:=NewColor; sfCatgeoryButtonsNormal: if TSeStyle(Source).Fonts[ktfCatgeoryButtonsNormal].Color<> NewColor then TSeStyle(Source).Fonts[ktfCatgeoryButtonsNormal].Color:=NewColor; sfCatgeoryButtonsSelected: if TSeStyle(Source).Fonts[ktfCatgeoryButtonsSelected].Color<> NewColor then TSeStyle(Source).Fonts[ktfCatgeoryButtonsSelected].Color:=NewColor; sfCheckBoxTextDisabled: if TSeStyle(Source).Fonts[ktfCheckBoxTextDisabled].Color<> NewColor then TSeStyle(Source).Fonts[ktfCheckBoxTextDisabled].Color:=NewColor; sfCheckBoxTextFocused: if TSeStyle(Source).Fonts[ktfCheckBoxTextFocused].Color<> NewColor then TSeStyle(Source).Fonts[ktfCheckBoxTextFocused].Color:=NewColor; sfCheckBoxTextHot: if TSeStyle(Source).Fonts[ktfCheckBoxTextHot].Color<> NewColor then TSeStyle(Source).Fonts[ktfCheckBoxTextHot].Color:=NewColor; sfCheckBoxTextNormal: if TSeStyle(Source).Fonts[ktfCheckBoxTextNormal].Color<> NewColor then TSeStyle(Source).Fonts[ktfCheckBoxTextNormal].Color:=NewColor; sfCheckBoxTextPressed: if TSeStyle(Source).Fonts[ktfCheckBoxTextPressed].Color<> NewColor then TSeStyle(Source).Fonts[ktfCheckBoxTextPressed].Color:=NewColor; sfComboBoxItemDisabled: if TSeStyle(Source).Fonts[ktfComboBoxItemDisabled].Color<> NewColor then TSeStyle(Source).Fonts[ktfComboBoxItemDisabled].Color:=NewColor; sfComboBoxItemFocused: if TSeStyle(Source).Fonts[ktfComboBoxItemFocused].Color<> NewColor then TSeStyle(Source).Fonts[ktfComboBoxItemFocused].Color:=NewColor; sfComboBoxItemHot: if TSeStyle(Source).Fonts[ktfComboBoxItemHot].Color<> NewColor then TSeStyle(Source).Fonts[ktfComboBoxItemHot].Color:=NewColor; sfComboBoxItemNormal: if TSeStyle(Source).Fonts[ktfComboBoxItemNormal].Color<> NewColor then TSeStyle(Source).Fonts[ktfComboBoxItemNormal].Color:=NewColor; sfComboBoxItemSelected: if TSeStyle(Source).Fonts[ktfComboBoxItemSelected].Color<> NewColor then TSeStyle(Source).Fonts[ktfComboBoxItemSelected].Color:=NewColor; sfEditBoxTextDisabled: if TSeStyle(Source).Fonts[ktfEditBoxTextDisabled].Color<> NewColor then TSeStyle(Source).Fonts[ktfEditBoxTextDisabled].Color:=NewColor; sfEditBoxTextFocused: if TSeStyle(Source).Fonts[ktfEditBoxTextFocused].Color<> NewColor then TSeStyle(Source).Fonts[ktfEditBoxTextFocused].Color:=NewColor; sfEditBoxTextHot: if TSeStyle(Source).Fonts[ktfEditBoxTextHot].Color<> NewColor then TSeStyle(Source).Fonts[ktfEditBoxTextHot].Color:=NewColor; sfEditBoxTextNormal: if TSeStyle(Source).Fonts[ktfEditBoxTextNormal].Color<> NewColor then TSeStyle(Source).Fonts[ktfEditBoxTextNormal].Color:=NewColor; sfEditBoxTextSelected: if TSeStyle(Source).Fonts[ktfEditBoxTextSelected].Color<> NewColor then TSeStyle(Source).Fonts[ktfEditBoxTextSelected].Color:=NewColor; sfGridItemFixedHot: if TSeStyle(Source).Fonts[ktfGridItemFixedHot].Color<> NewColor then TSeStyle(Source).Fonts[ktfGridItemFixedHot].Color:=NewColor; sfGridItemFixedNormal: if TSeStyle(Source).Fonts[ktfGridItemFixedNormal].Color<> NewColor then TSeStyle(Source).Fonts[ktfGridItemFixedNormal].Color:=NewColor; sfGridItemFixedPressed: if TSeStyle(Source).Fonts[ktfGridItemFixedPressed].Color<> NewColor then TSeStyle(Source).Fonts[ktfGridItemFixedPressed].Color:=NewColor; sfGridItemNormal: if TSeStyle(Source).Fonts[ktfGridItemNormal].Color<> NewColor then TSeStyle(Source).Fonts[ktfGridItemNormal].Color:=NewColor; sfGridItemSelected: if TSeStyle(Source).Fonts[ktfGridItemSelected].Color<> NewColor then TSeStyle(Source).Fonts[ktfGridItemSelected].Color:=NewColor; sfGroupBoxTextDisabled: if TSeStyle(Source).Fonts[ktfGroupBoxTextDisabled].Color<> NewColor then TSeStyle(Source).Fonts[ktfGroupBoxTextDisabled].Color:=NewColor; sfGroupBoxTextNormal: if TSeStyle(Source).Fonts[ktfGroupBoxTextNormal].Color<> NewColor then TSeStyle(Source).Fonts[ktfGroupBoxTextNormal].Color:=NewColor; sfHeaderSectionTextDisabled: if TSeStyle(Source).Fonts[ktfHeaderSectionTextDisabled].Color<> NewColor then TSeStyle(Source).Fonts[ktfHeaderSectionTextDisabled].Color:=NewColor; sfHeaderSectionTextHot: if TSeStyle(Source).Fonts[ktfHeaderSectionTextHot].Color<> NewColor then TSeStyle(Source).Fonts[ktfHeaderSectionTextHot].Color:=NewColor; sfHeaderSectionTextNormal: if TSeStyle(Source).Fonts[ktfHeaderSectionTextNormal].Color<> NewColor then TSeStyle(Source).Fonts[ktfHeaderSectionTextNormal].Color:=NewColor; sfHeaderSectionTextPressed: if TSeStyle(Source).Fonts[ktfHeaderSectionTextPressed].Color<> NewColor then TSeStyle(Source).Fonts[ktfHeaderSectionTextPressed].Color:=NewColor; sfListItemTextDisabled: if TSeStyle(Source).Fonts[ktfListItemTextDisabled].Color<> NewColor then TSeStyle(Source).Fonts[ktfListItemTextDisabled].Color:=NewColor; sfListItemTextFocused: if TSeStyle(Source).Fonts[ktfListItemTextFocused].Color<> NewColor then TSeStyle(Source).Fonts[ktfListItemTextFocused].Color:=NewColor; sfListItemTextHot: if TSeStyle(Source).Fonts[ktfListItemTextHot].Color<> NewColor then TSeStyle(Source).Fonts[ktfListItemTextHot].Color:=NewColor; sfListItemTextNormal: if TSeStyle(Source).Fonts[ktfListItemTextNormal].Color<> NewColor then TSeStyle(Source).Fonts[ktfListItemTextNormal].Color:=NewColor; sfListItemTextSelected: if TSeStyle(Source).Fonts[ktfListItemTextSelected].Color<> NewColor then TSeStyle(Source).Fonts[ktfListItemTextSelected].Color:=NewColor; sfMenuItemTextDisabled: if TSeStyle(Source).Fonts[ktfMenuItemTextDisabled].Color<> NewColor then TSeStyle(Source).Fonts[ktfMenuItemTextDisabled].Color:=NewColor; sfMenuItemTextHot: if TSeStyle(Source).Fonts[ktfMenuItemTextHot].Color<> NewColor then TSeStyle(Source).Fonts[ktfMenuItemTextHot].Color:=NewColor; sfMenuItemTextNormal: if TSeStyle(Source).Fonts[ktfMenuItemTextNormal].Color<> NewColor then TSeStyle(Source).Fonts[ktfMenuItemTextNormal].Color:=NewColor; sfMenuItemTextSelected: if TSeStyle(Source).Fonts[ktfMenuItemTextSelected].Color<> NewColor then TSeStyle(Source).Fonts[ktfMenuItemTextSelected].Color:=NewColor; sfPanelTextDisabled: if TSeStyle(Source).Fonts[ktfPanelTextDisabled].Color<> NewColor then TSeStyle(Source).Fonts[ktfPanelTextDisabled].Color:=NewColor; sfPanelTextNormal: if TSeStyle(Source).Fonts[ktfPanelTextNormal].Color<> NewColor then TSeStyle(Source).Fonts[ktfPanelTextNormal].Color:=NewColor; sfPopupMenuItemTextDisabled: if TSeStyle(Source).Fonts[ktfPopupMenuItemTextDisabled].Color<> NewColor then TSeStyle(Source).Fonts[ktfPopupMenuItemTextDisabled].Color:=NewColor; sfPopupMenuItemTextHot: if TSeStyle(Source).Fonts[ktfPopupMenuItemTextHot].Color<> NewColor then TSeStyle(Source).Fonts[ktfPopupMenuItemTextHot].Color:=NewColor; sfPopupMenuItemTextNormal: if TSeStyle(Source).Fonts[ktfPopupMenuItemTextNormal].Color<> NewColor then TSeStyle(Source).Fonts[ktfPopupMenuItemTextNormal].Color:=NewColor; sfPopupMenuItemTextSelected: if TSeStyle(Source).Fonts[ktfPopupMenuItemTextSelected].Color<> NewColor then TSeStyle(Source).Fonts[ktfPopupMenuItemTextSelected].Color:=NewColor; sfRadioButtonTextDisabled: if TSeStyle(Source).Fonts[ktfRadioButtonTextDisabled].Color<> NewColor then TSeStyle(Source).Fonts[ktfRadioButtonTextDisabled].Color:=NewColor; sfRadioButtonTextFocused: if TSeStyle(Source).Fonts[ktfRadioButtonTextFocused].Color<> NewColor then TSeStyle(Source).Fonts[ktfRadioButtonTextFocused].Color:=NewColor; sfRadioButtonTextHot: if TSeStyle(Source).Fonts[ktfRadioButtonTextHot].Color<> NewColor then TSeStyle(Source).Fonts[ktfRadioButtonTextHot].Color:=NewColor; sfRadioButtonTextNormal: if TSeStyle(Source).Fonts[ktfRadioButtonTextNormal].Color<> NewColor then TSeStyle(Source).Fonts[ktfRadioButtonTextNormal].Color:=NewColor; sfRadioButtonTextPressed: if TSeStyle(Source).Fonts[ktfRadioButtonTextPressed].Color<> NewColor then TSeStyle(Source).Fonts[ktfRadioButtonTextPressed].Color:=NewColor; sfSmCaptionTextInactive: if TSeStyle(Source).Fonts[ktfSmCaptionTextInactive].Color<> NewColor then TSeStyle(Source).Fonts[ktfSmCaptionTextInactive].Color:=NewColor; sfSmCaptionTextNormal: if TSeStyle(Source).Fonts[ktfSmCaptionTextNormal].Color<> NewColor then TSeStyle(Source).Fonts[ktfSmCaptionTextNormal].Color:=NewColor; sfStatusPanelTextDisabled: if TSeStyle(Source).Fonts[ktfStatusPanelTextDisabled].Color<> NewColor then TSeStyle(Source).Fonts[ktfStatusPanelTextDisabled].Color:=NewColor; sfStatusPanelTextNormal: if TSeStyle(Source).Fonts[ktfStatusPanelTextNormal].Color<> NewColor then TSeStyle(Source).Fonts[ktfStatusPanelTextNormal].Color:=NewColor; sfTabTextActiveDisabled: if TSeStyle(Source).Fonts[ktfTabTextActiveDisabled].Color<> NewColor then TSeStyle(Source).Fonts[ktfTabTextActiveDisabled].Color:=NewColor; sfTabTextActiveHot: if TSeStyle(Source).Fonts[ktfTabTextActiveHot].Color<> NewColor then TSeStyle(Source).Fonts[ktfTabTextActiveHot].Color:=NewColor; sfTabTextActiveNormal: if TSeStyle(Source).Fonts[ktfTabTextActiveNormal].Color<> NewColor then TSeStyle(Source).Fonts[ktfTabTextActiveNormal].Color:=NewColor; sfTabTextInactiveDisabled: if TSeStyle(Source).Fonts[ktfTabTextInactiveDisabled].Color<> NewColor then TSeStyle(Source).Fonts[ktfTabTextInactiveDisabled].Color:=NewColor; sfTabTextInactiveHot: if TSeStyle(Source).Fonts[ktfTabTextInactiveHot].Color<> NewColor then TSeStyle(Source).Fonts[ktfTabTextInactiveHot].Color:=NewColor; sfTabTextInactiveNormal: if TSeStyle(Source).Fonts[ktfTabTextInactiveNormal].Color<> NewColor then TSeStyle(Source).Fonts[ktfTabTextInactiveNormal].Color:=NewColor; sfTextLabelDisabled: if TSeStyle(Source).Fonts[ktfStaticTextDisabled].Color<> NewColor then TSeStyle(Source).Fonts[ktfStaticTextDisabled].Color:=NewColor; sfTextLabelFocused: if TSeStyle(Source).Fonts[ktfStaticTextFocused].Color<> NewColor then TSeStyle(Source).Fonts[ktfStaticTextFocused].Color:=NewColor; sfTextLabelHot: if TSeStyle(Source).Fonts[ktfStaticTextHot].Color<> NewColor then TSeStyle(Source).Fonts[ktfStaticTextHot].Color:=NewColor; sfTextLabelNormal: if TSeStyle(Source).Fonts[ktfStaticTextNormal].Color<> NewColor then TSeStyle(Source).Fonts[ktfStaticTextNormal].Color:=NewColor; sfToolItemTextDisabled: if TSeStyle(Source).Fonts[ktfToolItemTextDisabled].Color<> NewColor then TSeStyle(Source).Fonts[ktfToolItemTextDisabled].Color:=NewColor; sfToolItemTextHot: if TSeStyle(Source).Fonts[ktfToolItemTextHot].Color<> NewColor then TSeStyle(Source).Fonts[ktfToolItemTextHot].Color:=NewColor; sfToolItemTextNormal: if TSeStyle(Source).Fonts[ktfToolItemTextNormal].Color<> NewColor then TSeStyle(Source).Fonts[ktfToolItemTextNormal].Color:=NewColor; sfToolItemTextSelected: if TSeStyle(Source).Fonts[ktfToolItemTextSelected].Color<> NewColor then TSeStyle(Source).Fonts[ktfToolItemTextSelected].Color:=NewColor; sfTreeItemTextDisabled: if TSeStyle(Source).Fonts[ktfTreeItemTextDisabled].Color<> NewColor then TSeStyle(Source).Fonts[ktfTreeItemTextDisabled].Color:=NewColor; sfTreeItemTextFocused: if TSeStyle(Source).Fonts[ktfTreeItemTextFocused].Color<> NewColor then TSeStyle(Source).Fonts[ktfTreeItemTextFocused].Color:=NewColor; sfTreeItemTextHot: if TSeStyle(Source).Fonts[ktfTreeItemTextHot].Color<> NewColor then TSeStyle(Source).Fonts[ktfTreeItemTextHot].Color:=NewColor; sfTreeItemTextNormal: if TSeStyle(Source).Fonts[ktfTreeItemTextNormal].Color<> NewColor then TSeStyle(Source).Fonts[ktfTreeItemTextNormal].Color:=NewColor; sfTreeItemTextSelected: if TSeStyle(Source).Fonts[ktfTreeItemTextSelected].Color<> NewColor then TSeStyle(Source).Fonts[ktfTreeItemTextSelected].Color:=NewColor; sfWindowTextDisabled: if TSeStyle(Source).Fonts[ktfWindowTextDisabled].Color<> NewColor then TSeStyle(Source).Fonts[ktfWindowTextDisabled].Color:=NewColor; sfWindowTextNormal: if TSeStyle(Source).Fonts[ktfWindowTextNormal].Color<> NewColor then TSeStyle(Source).Fonts[ktfWindowTextNormal].Color:=NewColor; end; end; procedure TCustomStyleExt.SetSystemColor(Color, NewColor: TColor); begin if TseStyle(Source).SysColors[Color]<>NewColor then TseStyle(Source).SysColors[Color]:=NewColor; end; function TCustomStyleExt.GetSource: TObject; begin Result:=TRttiContext.Create.GetType(Self.ClassType).GetField('FSource').GetValue(Self).AsObject; end; procedure TCustomStyleExt.SetStyleInfo(const Value: TStyleInfo); begin TseStyle(Source).StyleSource.Name:=Value.Name; TseStyle(Source).StyleSource.Author:=Value.Author; TseStyle(Source).StyleSource.AuthorEMail:=Value.AuthorEMail; TseStyle(Source).StyleSource.AuthorURL:=Value.AuthorURL; TseStyle(Source).StyleSource.Version:=Value.Version; end; function TCustomStyleExt.GetStyleInfo: TStyleInfo; begin Result.Name := TseStyle(Source).StyleSource.Name; Result.Author := TseStyle(Source).StyleSource.Author; Result.AuthorEMail := TseStyle(Source).StyleSource.AuthorEMail; Result.AuthorURL := TseStyle(Source).StyleSource.AuthorURL; Result.Version := TseStyle(Source).StyleSource.Version; end; { TCustomStyleHelper } //function TCustomStyleHelper.GetSource: TObject; //begin // {$IFDEF USE_RTTI} // Result:=TRttiContext.Create.GetType(Self.ClassType).GetField('FSource').GetValue(Self).AsObject; // {$ELSE} // Result:=Self.FSource; // {$ENDIF} //end; // {$ENDIF} procedure DrawSampleWindow(Style:TCustomStyle;Canvas:TCanvas;ARect:TRect;const ACaption : string;hIcon:HICON=0); var LDetails : TThemedElementDetails; CaptionDetails : TThemedElementDetails; IconDetails : TThemedElementDetails; IconRect : TRect; BorderRect : TRect; CaptionRect : TRect; ButtonRect : TRect; TextRect : TRect; CaptionBitmap : TBitmap; ThemeTextColor : TColor; //BlendFunction : TBlendFunction; function GetBorderSize: TRect; var Size: TSize; Details: TThemedElementDetails; Detail: TThemedWindow; begin Result := Rect(0, 0, 0, 0); Detail := twCaptionActive; Details := Style.GetElementDetails(Detail); Style.GetElementSize(0, Details, esActual, Size); Result.Top := Size.cy; Detail := twFrameLeftActive; Details := Style.GetElementDetails(Detail); Style.GetElementSize(0, Details, esActual, Size); Result.Left := Size.cx; Detail := twFrameRightActive; Details := Style.GetElementDetails(Detail); Style.GetElementSize(0, Details, esActual, Size); Result.Right := Size.cx; Detail := twFrameBottomActive; Details := Style.GetElementDetails(Detail); Style.GetElementSize(0, Details, esActual, Size); Result.Bottom := Size.cy; end; function RectVCenter(var R: TRect; Bounds: TRect): TRect; begin OffsetRect(R, -R.Left, -R.Top); OffsetRect(R, 0, (Bounds.Height - R.Height) div 2); OffsetRect(R, Bounds.Left, Bounds.Top); Result := R; end; begin BorderRect := GetBorderSize; CaptionBitmap := TBitmap.Create; CaptionBitmap.SetSize(ARect.Width, BorderRect.Top); //Draw background LDetails.Element := teWindow; LDetails.Part := 0; Style.DrawElement(Canvas.Handle, LDetails, ARect); //Draw caption border CaptionRect := Rect(0, 0, CaptionBitmap.Width, CaptionBitmap.Height); LDetails := Style.GetElementDetails(twCaptionActive); Style.DrawElement(CaptionBitmap.Canvas.Handle, LDetails, CaptionRect); TextRect := CaptionRect; CaptionDetails := LDetails; //Draw icon IconDetails := Style.GetElementDetails(twSysButtonNormal); if not Style.GetElementContentRect(0, IconDetails, CaptionRect, ButtonRect) then ButtonRect := Rect(0, 0, 0, 0); IconRect := Rect(0, 0, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON)); RectVCenter(IconRect, ButtonRect); if ButtonRect.Width > 0 then { if Assigned(Application.MainForm) then DrawIconEx(CaptionBitmap.Canvas.Handle, IconRect.Left, IconRect.Top, Application.MainForm.Icon.Handle, 0, 0, 0, 0, DI_NORMAL); } if hIcon<>0 then DrawIconEx(CaptionBitmap.Canvas.Handle, IconRect.Left, IconRect.Top, hIcon, 0, 0, 0, 0, DI_NORMAL); Inc(TextRect.Left, ButtonRect.Width + 5); //Draw buttons //Close button LDetails := Style.GetElementDetails(twCloseButtonNormal); if Style.GetElementContentRect(0, LDetails, CaptionRect, ButtonRect) then Style.DrawElement(CaptionBitmap.Canvas.Handle, LDetails, ButtonRect); //Maximize button LDetails := Style.GetElementDetails(twMaxButtonNormal); if Style.GetElementContentRect(0, LDetails, CaptionRect, ButtonRect) then Style.DrawElement(CaptionBitmap.Canvas.Handle, LDetails, ButtonRect); //Minimize button LDetails := Style.GetElementDetails(twMinButtonNormal); if Style.GetElementContentRect(0, LDetails, CaptionRect, ButtonRect) then Style.DrawElement(CaptionBitmap.Canvas.Handle, LDetails, ButtonRect); //Help button LDetails := Style.GetElementDetails(twHelpButtonNormal); if Style.GetElementContentRect(0, LDetails, CaptionRect, ButtonRect) then Style.DrawElement(CaptionBitmap.Canvas.Handle, LDetails, ButtonRect); if ButtonRect.Left > 0 then TextRect.Right := ButtonRect.Left; //Draw text Style.DrawText(CaptionBitmap.Canvas.Handle, CaptionDetails, ACaption, TextRect, [tfLeft, tfSingleLine, tfVerticalCenter]); //Draw caption Canvas.Draw(0, 0, CaptionBitmap); { BlendFunction.BlendOp := AC_SRC_OVER; BlendFunction.BlendFlags := 0; BlendFunction.SourceConstantAlpha := 100; BlendFunction.AlphaFormat := AC_SRC_OVER; WinAPi.Windows.AlphaBlend( Canvas.Handle, 0, 0, CaptionBitmap.Width, CaptionBitmap.Height, CaptionBitmap.Canvas.Handle, 0, 0, CaptionBitmap.Width, CaptionBitmap.Height, BlendFunction ); } CaptionBitmap.Free; //Draw left border CaptionRect := Rect(0, BorderRect.Top, BorderRect.Left, ARect.Height - BorderRect.Bottom); LDetails := Style.GetElementDetails(twFrameLeftActive); if CaptionRect.Bottom - CaptionRect.Top > 0 then Style.DrawElement(Canvas.Handle, LDetails, CaptionRect); //Draw right border CaptionRect := Rect(ARect.Width - BorderRect.Right, BorderRect.Top, ARect.Width, ARect.Height - BorderRect.Bottom); LDetails := Style.GetElementDetails(twFrameRightActive); Style.DrawElement(Canvas.Handle, LDetails, CaptionRect); //Draw Bottom border CaptionRect := Rect(0, ARect.Height - BorderRect.Bottom, ARect.Width, ARect.Height); LDetails := Style.GetElementDetails(twFrameBottomActive); Style.DrawElement(Canvas.Handle, LDetails, CaptionRect); //Draw Ok button LDetails := Style.GetElementDetails(tbPushButtonNormal); ButtonRect.Left:=30; ButtonRect.Top:=ARect.Height-45; ButtonRect.Width:=75; ButtonRect.Height:=25; Style.DrawElement(Canvas.Handle, LDetails, ButtonRect); Style.GetElementColor(LDetails, ecTextColor, ThemeTextColor); Style.DrawText(Canvas.Handle, LDetails, 'OK', ButtonRect, TTextFormatFlags(DT_VCENTER or DT_CENTER), ThemeTextColor); //Draw Cancel button ButtonRect.Left:=110; ButtonRect.Top:=ARect.Height-45; ButtonRect.Width:=75; ButtonRect.Height:=25; Style.DrawElement(Canvas.Handle, LDetails, ButtonRect); Style.GetElementColor(LDetails, ecTextColor, ThemeTextColor); Style.DrawText(Canvas.Handle, LDetails, 'Cancel', ButtonRect, TTextFormatFlags(DT_VCENTER or DT_CENTER), ThemeTextColor); end; { TVclStylePreview } constructor TVclStylesPreview.Create(AControl: TComponent); begin inherited; FRegion := 0; FStyle:=nil; FCaption:=''; FIcon:=0; FBitmap:=TBitmap.Create; FBitmap.PixelFormat:=pf32bit; end; destructor TVclStylesPreview.Destroy; begin if FRegion <> 0 then begin DeleteObject(FRegion); FRegion := 0; end; FBitmap.Free; inherited; end; procedure TVclStylesPreview.Paint; var LDetails : TThemedElementDetails; CaptionDetails : TThemedElementDetails; IconDetails : TThemedElementDetails; IconRect : TRect; BorderRect : TRect; CaptionRect : TRect; ButtonRect : TRect; TextRect : TRect; CaptionBitmap : TBitmap; //LBitmap : TBitmap; ThemeTextColor : TColor; ARect : TRect; LRect : TRect; //BlendFunction : TBlendFunction; LRegion : HRgn; i : Integer; function GetBorderSize: TRect; var Size: TSize; Details: TThemedElementDetails; Detail: TThemedWindow; begin Result := Rect(0, 0, 0, 0); Detail := twCaptionActive; Details := Style.GetElementDetails(Detail); Style.GetElementSize(0, Details, esActual, Size); Result.Top := Size.cy; Detail := twFrameLeftActive; Details := Style.GetElementDetails(Detail); Style.GetElementSize(0, Details, esActual, Size); Result.Left := Size.cx; Detail := twFrameRightActive; Details := Style.GetElementDetails(Detail); Style.GetElementSize(0, Details, esActual, Size); Result.Right := Size.cx; Detail := twFrameBottomActive; Details := Style.GetElementDetails(Detail); Style.GetElementSize(0, Details, esActual, Size); Result.Bottom := Size.cy; end; function RectVCenter(var R: TRect; Bounds: TRect): TRect; begin OffsetRect(R, -R.Left, -R.Top); OffsetRect(R, 0, (Bounds.Height - R.Height) div 2); OffsetRect(R, Bounds.Left, Bounds.Top); Result := R; end; begin if FStyle=nil then Exit; BorderRect := GetBorderSize; ARect:=ClientRect; CaptionBitmap := TBitmap.Create; try CaptionBitmap.SetSize(ARect.Width, BorderRect.Top); { LBitmap:=TBitmap.Create; LBitmap.PixelFormat:=pf32bit; } FBitmap.Width :=ClientRect.Width; FBitmap.Height:=ClientRect.Height; //Draw background LDetails.Element := teWindow; LDetails.Part := 0; Style.DrawElement(FBitmap.Canvas.Handle, LDetails, ARect); //Draw caption border CaptionRect := Rect(0, 0, CaptionBitmap.Width, CaptionBitmap.Height); LDetails := Style.GetElementDetails(twCaptionActive); LRegion := FRegion; try Style.GetElementRegion(LDetails, ARect, FRegion); SetWindowRgn(Handle, FRegion, True); finally if LRegion <> 0 then DeleteObject(LRegion); end; { Style.GetElementRegion(LDetails, ARect, Region); SetWindowRgn(Handle, Region, True); } Style.DrawElement(CaptionBitmap.Canvas.Handle, LDetails, CaptionRect); TextRect := CaptionRect; CaptionDetails := LDetails; //Draw icon IconDetails := Style.GetElementDetails(twSysButtonNormal); if not Style.GetElementContentRect(0, IconDetails, CaptionRect, ButtonRect) then ButtonRect := Rect(0, 0, 0, 0); IconRect := Rect(0, 0, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON)); RectVCenter(IconRect, ButtonRect); if ButtonRect.Width > 0 then if FIcon<>0 then DrawIconEx(CaptionBitmap.Canvas.Handle, IconRect.Left, IconRect.Top, FIcon, 0, 0, 0, 0, DI_NORMAL); Inc(TextRect.Left, ButtonRect.Width + 5); //Draw buttons //Close button LDetails := Style.GetElementDetails(twCloseButtonNormal); if Style.GetElementContentRect(0, LDetails, CaptionRect, ButtonRect) then Style.DrawElement(CaptionBitmap.Canvas.Handle, LDetails, ButtonRect); //Maximize button LDetails := Style.GetElementDetails(twMaxButtonNormal); if Style.GetElementContentRect(0, LDetails, CaptionRect, ButtonRect) then Style.DrawElement(CaptionBitmap.Canvas.Handle, LDetails, ButtonRect); //Minimize button LDetails := Style.GetElementDetails(twMinButtonNormal); if Style.GetElementContentRect(0, LDetails, CaptionRect, ButtonRect) then Style.DrawElement(CaptionBitmap.Canvas.Handle, LDetails, ButtonRect); //Help button LDetails := Style.GetElementDetails(twHelpButtonNormal); if Style.GetElementContentRect(0, LDetails, CaptionRect, ButtonRect) then Style.DrawElement(CaptionBitmap.Canvas.Handle, LDetails, ButtonRect); if ButtonRect.Left > 0 then TextRect.Right := ButtonRect.Left; //Draw text Style.DrawText(CaptionBitmap.Canvas.Handle, CaptionDetails, FCaption, TextRect, [tfLeft, tfSingleLine, tfVerticalCenter]); //Draw caption FBitmap.Canvas.Draw(0, 0, CaptionBitmap); finally CaptionBitmap.Free; end; //Draw left border CaptionRect := Rect(0, BorderRect.Top, BorderRect.Left, ARect.Height - BorderRect.Bottom); LDetails := Style.GetElementDetails(twFrameLeftActive); if CaptionRect.Bottom - CaptionRect.Top > 0 then Style.DrawElement(FBitmap.Canvas.Handle, LDetails, CaptionRect); //Draw right border CaptionRect := Rect(ARect.Width - BorderRect.Right, BorderRect.Top, ARect.Width, ARect.Height - BorderRect.Bottom); LDetails := Style.GetElementDetails(twFrameRightActive); Style.DrawElement(FBitmap.Canvas.Handle, LDetails, CaptionRect); //Draw Bottom border CaptionRect := Rect(0, ARect.Height - BorderRect.Bottom, ARect.Width, ARect.Height); LDetails := Style.GetElementDetails(twFrameBottomActive); Style.DrawElement(FBitmap.Canvas.Handle, LDetails, CaptionRect); //Draw Main Menu LDetails:= Style.GetElementDetails(tmMenuBarBackgroundActive); LRect:=Rect(BorderRect.Left, BorderRect.Top+1, ARect.Width-BorderRect.Left,BorderRect.Top+1+20); Style.DrawElement(FBitmap.Canvas.Handle, LDetails, LRect); LDetails := Style.GetElementDetails(tmMenuBarItemNormal); Style.GetElementColor(LDetails, ecTextColor, ThemeTextColor); // function DrawText(DC: HDC; Details: TThemedElementDetails; // const S: string; var R: TRect; Flags: TTextFormat; Color: TColor = clNone): Boolean; overload; // function DrawText(DC: HDC; Details: TThemedElementDetails; // const S: string; var R: TRect; Flags: TTextFormat; Options: TStyleTextOptions): Boolean; overload; CaptionRect := Rect(LRect.Left+10,LRect.Top+3, LRect.Right ,LRect.Bottom); Style.DrawText(FBitmap.Canvas.Handle, LDetails, 'File', CaptionRect, [tfLeft], ThemeTextColor); CaptionRect := Rect(LRect.Left+40,LRect.Top+3, LRect.Right ,LRect.Bottom); Style.DrawText(FBitmap.Canvas.Handle, LDetails, 'Edit', CaptionRect, [tfLeft], ThemeTextColor); CaptionRect := Rect(LRect.Left+70,LRect.Top+3, LRect.Right ,LRect.Bottom); Style.DrawText(FBitmap.Canvas.Handle, LDetails, 'View', CaptionRect, [tfLeft], ThemeTextColor); CaptionRect := Rect(LRect.Left+110,LRect.Top+3, LRect.Right ,LRect.Bottom); Style.DrawText(FBitmap.Canvas.Handle, LDetails, 'Help', CaptionRect, [tfLeft], ThemeTextColor); //Draw ToolButtons for i := 1 to 3 do begin LDetails := Style.GetElementDetails(ttbButtonNormal); ButtonRect.Left:=BorderRect.Left+5+((i-1)*76); ButtonRect.Top:=LRect.Top+30; ButtonRect.Width:=75; ButtonRect.Height:=25; Style.DrawElement(FBitmap.Canvas.Handle, LDetails, ButtonRect); Style.GetElementColor(LDetails, ecTextColor, ThemeTextColor); Style.DrawText(FBitmap.Canvas.Handle, LDetails, 'ToolButton'+IntToStr(i), ButtonRect, TTextFormatFlags(DT_VCENTER or DT_CENTER), ThemeTextColor); end; //Draw Normal LDetails := Style.GetElementDetails(tbPushButtonNormal); ButtonRect.Left:=BorderRect.Left+5; ButtonRect.Top:=ARect.Height-45; ButtonRect.Width:=75; ButtonRect.Height:=25; Style.DrawElement(FBitmap.Canvas.Handle, LDetails, ButtonRect); Style.GetElementColor(LDetails, ecTextColor, ThemeTextColor); Style.DrawText(FBitmap.Canvas.Handle, LDetails, 'Normal', ButtonRect, TTextFormatFlags(DT_VCENTER or DT_CENTER), ThemeTextColor); //Draw Hot LDetails := Style.GetElementDetails(tbPushButtonHot); ButtonRect.Left:=BorderRect.Left+85; ButtonRect.Top:=ARect.Height-45; ButtonRect.Width:=75; ButtonRect.Height:=25; Style.DrawElement(FBitmap.Canvas.Handle, LDetails, ButtonRect); Style.GetElementColor(LDetails, ecTextColor, ThemeTextColor); Style.DrawText(FBitmap.Canvas.Handle, LDetails, 'Hot', ButtonRect, TTextFormatFlags(DT_VCENTER or DT_CENTER), ThemeTextColor); //Draw Pressed LDetails := Style.GetElementDetails(tbPushButtonPressed); ButtonRect.Left:=BorderRect.Left+165; ButtonRect.Top:=ARect.Height-45; ButtonRect.Width:=75; ButtonRect.Height:=25; Style.DrawElement(FBitmap.Canvas.Handle, LDetails, ButtonRect); Style.GetElementColor(LDetails, ecTextColor, ThemeTextColor); Style.DrawText(FBitmap.Canvas.Handle, LDetails, 'Pressed', ButtonRect, TTextFormatFlags(DT_VCENTER or DT_CENTER), ThemeTextColor); //Draw Disabled LDetails := Style.GetElementDetails(tbPushButtonDisabled); ButtonRect.Left:=BorderRect.Left+245; ButtonRect.Top:=ARect.Height-45; ButtonRect.Width:=75; ButtonRect.Height:=25; Style.DrawElement(FBitmap.Canvas.Handle, LDetails, ButtonRect); Style.GetElementColor(LDetails, ecTextColor, ThemeTextColor); Style.DrawText(FBitmap.Canvas.Handle, LDetails, 'Disabled', ButtonRect, TTextFormatFlags(DT_VCENTER or DT_CENTER), ThemeTextColor); Canvas.Draw(0,0,FBitmap); end; initialization {$IFDEF USE_VCL_STYLESAPI} InitStyleAPI; {$ENDIF} finalization {$IFDEF USE_VCL_STYLESAPI} FinalizeStyleAPI; {$ENDIF} end.