//************************************************************************************************** // // Unit Vcl.Styles.UxTheme // 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.UxTheme.pas. // // The Initial Developer of the Original Code is Rodrigo Ruz V. // Portions created by Rodrigo Ruz V. are Copyright (C) 2013-2017 Rodrigo Ruz V. // All Rights Reserved. // //************************************************************************************************** unit Vcl.Styles.UxTheme; interface implementation { TODO done W8 Check Color text disabled on listview hot item done Test on W10 done Test Task Dialogs done fix preview windows background color when no elements are shown done fix background of homegroup folder (and related) done remove unused code of DrawThemeText and DrawThemeTextEx, (replaced by GetThemeColor) done fix navigation buttons W8, W10 done improve drawing navigation buttons W7 fix related shell dialogs Add support for custom titlebars. msstyles Add support for Classic Theme fix menu fix popup windows with trackbar } {$DEFINE HOOK_Button} {$DEFINE HOOK_Scrollbar} {$DEFINE HOOK_TaskDialog} {$DEFINE HOOK_ProgressBar} {$DEFINE HOOK_DateTimePicker} {$DEFINE HOOK_TreeView} {$DEFINE HOOK_ListView} {$DEFINE HOOK_ListBox} {$DEFINE HOOK_ComboBox} {$DEFINE HOOK_Spin} {$DEFINE HOOK_EDIT} {$DEFINE HOOK_Rebar} {$DEFINE HOOK_ToolBar} {$DEFINE HOOK_Menu} {$DEFINE HOOK_TrackBar} {$DEFINE HOOK_ToolTip} {$DEFINE HOOK_Tab} //Undocumented Windows Themes //Introduced in Windows Vista {$DEFINE HOOK_CommandModule} {$DEFINE HOOK_SearchBox} {$DEFINE HOOK_AddressBand} {$DEFINE HOOK_PreviewPane} {$DEFINE HOOK_TRYHARDER} {$DEFINE HOOK_BREADCRUMBAR} {$DEFINE HOOK_InfoBar} //Introduced in Windows 8 {$DEFINE HOOK_Navigation} uses DDetours, System.SyncObjs, System.SysUtils, System.Types, System.Classes, System.UITypes, System.Math, System.Generics.Collections, System.Generics.Defaults, WinApi.Windows, Winapi.UxTheme, Winapi.Messages, Vcl.Graphics, Vcl.GraphUtil, Vcl.Themes, Vcl.Imaging.pngimage, Vcl.Styles.Hooks, Vcl.Styles.Utils.Graphics, Vcl.Styles.FontAwesome, Vcl.Styles.Utils.SysControls; type TDrawThemeBackground = function(hTheme: HTHEME; hdc: HDC; iPartId, iStateId: Integer; const pRect: TRect; Foo: Pointer): HRESULT; stdcall; {$IFDEF HOOK_ProgressBar} const VSCLASS_PROGRESS_INDERTERMINATE = 'Indeterminate::Progress'; {$ENDIF} {$IFDEF HOOK_ListView} const VSCLASS_ITEMSVIEW_LISTVIEW = 'ItemsView::ListView'; VSCLASS_ITEMSVIEW_HEADER = 'ItemsView::Header'; VSCLASS_EXPLORER_LISTVIEW = 'Explorer::ListView'; VSCLASS_ITEMSVIEW = 'ItemsView'; VSCLASS_LISTVIEWPOPUP = 'ListViewPopup'; {$ENDIF} {$IFDEF HOOK_CommandModule} const VSCLASS_COMMANDMODULE = 'CommandModule'; VSCLASS_CPLCOMMANDMODULE = 'CPLCommandModule::CommandModule'; {$ENDIF} {$IFDEF HOOK_SearchBox} const VSCLASS_SEARCHEDITBOX = 'SearchEditBox'; VSCLASS_SEARCHBOX = 'SearchBox'; VSCLASS_CompositedSEARCHBOX = 'SearchBoxCompositedSearchBox::SearchBox'; VSCLASS_INACTIVESEARCHBOX = 'InactiveSearchBoxCompositedSearchBox::SearchBox'; {$ENDIF} {$IFDEF HOOK_AddressBand} const VSCLASS_ADDRESSBAND = 'AddressBand'; {$ENDIF} {$IFDEF HOOK_PreviewPane} const VSCLASS_PREVIEWPANE = 'PreviewPane'; VSCLASS_READINGPANE = 'ReadingPane'; {$ENDIF} {$IFDEF HOOK_TRYHARDER} const VSCLASS_TRYHARDER = 'TryHarder'; {$ENDIF} {$IFDEF HOOK_BREADCRUMBAR} const VSCLASS_BREADCRUMBAR = 'BreadcrumbBar'; {$ENDIF} {$IFDEF HOOK_Navigation} const VSCLASS_NAVIGATION = 'Navigation'; {$ENDIF} {$IFDEF HOOK_TreeView} const VSCLASS_PROPERTREE = 'PROPERTREE'; {$ENDIF} {$IFDEF HOOK_InfoBar} const VSCLASS_INFOBAR = 'InfoBar'; {$ENDIF} {$IFDEF HOOK_Menu} const MARLETT_RESTORE_CHAR = Char(50); MARLETT_MINIMIZE_CHAR = Char(48); MARLETT_CLOSE_CHAR = Char(114); MARLETT_MAXIMIZE_CHAR = Char(49); {$ENDIF} type TFuncDrawThemeBackground = function(hTheme: HTHEME; hdc: HDC; iPartId, iStateId: Integer; const pRect: TRect; Foo: Pointer; Trampoline : TDrawThemeBackground; LThemeClass : string; hwnd : HWND): HRESULT; stdcall; var Trampoline_UxTheme_OpenThemeDataEx : function(hwnd: HWND; pszClassList: LPCWSTR; dwFlags: DWORD): HTHEME; stdcall = nil; Trampoline_UxTheme_OpenThemeData : function(hwnd: HWND; pszClassList: LPCWSTR): HTHEME; stdcall = nil; {$IF CompilerVersion >= 30} Trampoline_UxTheme_OpenThemeDataForDPI : function(hwnd: HWND; pszClassList: LPCWSTR; dpi: UINT): HTHEME; stdcall = nil; {$IFEND} Trampoline_UxTheme_CloseThemeData : function(hTheme: HTHEME): HRESULT; stdcall = nil; Trampoline_UxTheme_DrawThemeBackground : function(hTheme: HTHEME; hdc: HDC; iPartId, iStateId: Integer; const pRect: TRect; pClipRect: Pointer): HRESULT; stdcall = nil; Trampoline_UxTheme_DrawThemeBackgroundEx : function(hTheme: HTHEME; hdc: HDC; iPartId, iStateId: Integer; const pRect: TRect; pOptions: Pointer): HResult; stdcall = nil; Trampoline_UxTheme_GetThemeColor : function(hTheme: HTHEME; iPartId, iStateId, iPropId: Integer; var pColor: COLORREF): HRESULT; stdcall = nil; Trampoline_UxTheme_GetThemeSysColor : function(hTheme: HTHEME; iColorId: Integer): COLORREF; stdcall = nil; Trampoline_UxTheme_GetThemeSysColorBrush : function(hTheme: HTHEME; iColorId: Integer): HBRUSH; stdcall = nil; Trampoline_UxTheme_DrawThemeText : function(hTheme: HTHEME; hdc: HDC; iPartId, iStateId: Integer; pszText: LPCWSTR; iCharCount: Integer; dwTextFlags, dwTextFlags2: DWORD; const pRect: TRect): HRESULT; stdcall = nil; Trampoline_UxTheme_DrawThemeTextEx : function(hTheme: HTHEME; hdc: HDC; iPartId: Integer; iStateId: Integer; pszText: LPCWSTR; cchText: Integer; dwTextFlags: DWORD; pRect: PRect; var pOptions: TDTTOpts): HResult; stdcall = nil; Trampoline_UxTheme_DrawThemeEdge : function(hTheme: HTHEME; hdc: HDC; iPartId, iStateId: Integer; const pDestRect: TRect; uEdge, uFlags: UINT; pContentRect: PRECT): HRESULT; stdcall = nil; THThemesClasses : TDictionary; THThemesHWND : TDictionary; FuncsDrawThemeBackground : TDictionary; VCLStylesLock : TCriticalSection = nil; function Detour_UxTheme_OpenThemeData(hwnd: HWND; pszClassList: LPCWSTR): HTHEME; stdcall; begin //OutputDebugString(PChar('Detour_UxTheme_OpenThemeData '+pszClassList)); VCLStylesLock.Enter; try Result:=Trampoline_UxTheme_OpenThemeData(hwnd, pszClassList); if THThemesClasses.ContainsKey(Result) then THThemesClasses.Remove(Result); THThemesClasses.Add(Result, pszClassList); if THThemesHWND.ContainsKey(Result) then THThemesHWND.Remove(Result); THThemesHWND.Add(Result, hwnd); finally VCLStylesLock.Leave; end; //OutputDebugString(PChar('Detour_UxTheme_OpenThemeData '+pszClassList+' hTheme '+IntToStr(Result)+' Handle '+IntToHex(hwnd, 8))); end; {$IF CompilerVersion >= 30} //HTHEME WINAPI OpenThemeDataForDpi(HWDN hwnd, PCWSTR pszClassIdList, UINT dpi); function Detour_UxTheme_OpenThemeDataForDPI(hwnd: HWND; pszClassList: LPCWSTR; dpi: UINT): HTHEME; stdcall; begin VCLStylesLock.Enter; try Result := Trampoline_UxTheme_OpenThemeDataForDPI(hwnd, pszClassList, dpi); if THThemesClasses.ContainsKey(Result) then THThemesClasses.Remove(Result); THThemesClasses.Add(Result, pszClassList); if THThemesHWND.ContainsKey(Result) then THThemesHWND.Remove(Result); THThemesHWND.Add(Result, hwnd); finally VCLStylesLock.Leave; end; end; {$IFEND} function Detour_UxTheme_OpenThemeDataEx(hwnd: HWND; pszClassList: LPCWSTR; dwFlags: DWORD): HTHEME; stdcall; begin //OutputDebugString(PChar('Detour_UxTheme_OpenThemeDataEx '+pszClassList)); VCLStylesLock.Enter; try Result:=Trampoline_UxTheme_OpenThemeDataEx(hwnd, pszClassList, dwFlags); if THThemesClasses.ContainsKey(Result) then THThemesClasses.Remove(Result); THThemesClasses.Add(Result, pszClassList); if THThemesHWND.ContainsKey(Result) then THThemesHWND.Remove(Result); THThemesHWND.Add(Result, hwnd); finally VCLStylesLock.Leave; end; //OutputDebugString(PChar('Detour_UxTheme_OpenThemeDataEx '+pszClassList+' hTheme '+IntToStr(Result)+' Handle '+IntToHex(hwnd, 8))); end; function GetStyleHighLightColor : TColor; begin if ColorIsBright(StyleServices.GetSystemColor(clBtnFace)) or not ColorIsBright(StyleServices.GetSystemColor(clHighlight)) then Result := StyleServices.GetSystemColor(clBtnText) else Result := StyleServices.GetSystemColor(clHighlight); end; function GetStyleBtnTextColor : TColor; begin if not StyleServices.GetElementColor(StyleServices.GetElementDetails(tbPushButtonNormal), ecTextColor, Result) then Result := StyleServices.GetSystemColor(clBtnText); end; function GetStyleMenuTextColor : TColor; begin Result:= StyleServices.GetStyleFontColor(sfPopupMenuItemTextNormal); end; function GetThemeClass(hTheme: HTHEME ; iPartId, iStateId: Integer) : string; var hThemeNew : WinApi.UxTheme.HTHEME; begin Result:=''; hThemeNew := Trampoline_UxTheme_OpenThemeData(0, VSCLASS_SCROLLBAR); if hThemeNew=hTheme then Exit(VSCLASS_SCROLLBAR) else CloseThemeData(hThemeNew); hThemeNew := Trampoline_UxTheme_OpenThemeData(0, VSCLASS_LISTVIEW); if hThemeNew = hTheme then Exit(VSCLASS_LISTVIEW) else CloseThemeData(hThemeNew); hThemeNew := Trampoline_UxTheme_OpenThemeData(0, VSCLASS_ITEMSVIEW_HEADER); if hThemeNew = hTheme then Exit(VSCLASS_ITEMSVIEW_HEADER) else CloseThemeData(hThemeNew); hThemeNew := Trampoline_UxTheme_OpenThemeData(0, VSCLASS_NAVIGATION); if hThemeNew = hTheme then Exit(VSCLASS_NAVIGATION) else CloseThemeData(hThemeNew); hThemeNew := Trampoline_UxTheme_OpenThemeData(0, VSCLASS_COMMANDMODULE); if hThemeNew = hTheme then Exit(VSCLASS_COMMANDMODULE) else CloseThemeData(hThemeNew); hThemeNew := Trampoline_UxTheme_OpenThemeData(0, VSCLASS_EDIT); if hThemeNew=hTheme then Exit(VSCLASS_EDIT) else CloseThemeData(hThemeNew); hThemeNew := Trampoline_UxTheme_OpenThemeData(0, VSCLASS_LISTBOX); if hThemeNew = hTheme then Exit(VSCLASS_LISTBOX) else CloseThemeData(hThemeNew); hThemeNew := Trampoline_UxTheme_OpenThemeData(0, VSCLASS_BUTTON); if hThemeNew = hTheme then Exit(VSCLASS_BUTTON) else CloseThemeData(hThemeNew); hThemeNew := Trampoline_UxTheme_OpenThemeData(0, VSCLASS_MENU); if hThemeNew = hTheme then Exit(VSCLASS_MENU) else CloseThemeData(hThemeNew); hThemeNew := Trampoline_UxTheme_OpenThemeData(0, VSCLASS_MENUBAND); if hThemeNew = hTheme then Exit(VSCLASS_MENUBAND) else CloseThemeData(hThemeNew); end; function UxTheme_InfoBar(hTheme: HTHEME; hdc: HDC; iPartId, iStateId: Integer; const pRect: TRect; Foo: Pointer; Trampoline : TDrawThemeBackground; LThemeClass : string; hwnd : HWND): HRESULT; stdcall; var LDetails : TThemedElementDetails; LColor : TColor; begin case iPartId of 1 : begin case iStateId of 1 : //normal begin LDetails := StyleServices.GetElementDetails(tpPanelBackground); StyleServices.GetElementColor(LDetails, ecFillColor, LColor); DrawStyleFillRect(hdc, pRect, LColor); Exit(S_OK); end; 2 : //hot begin LDetails := StyleServices.GetElementDetails(tpPanelBackground); StyleServices.GetElementColor(LDetails, ecFillColor, LColor); DrawStyleFillRect(hdc, pRect, LColor); Exit(S_OK); end; 3 : //Pressed begin LDetails := StyleServices.GetElementDetails(tpPanelBackground); StyleServices.GetElementColor(LDetails, ecFillColor, LColor); DrawStyleFillRect(hdc, pRect, LColor); Exit(S_OK); end; 4 : //selected begin LDetails := StyleServices.GetElementDetails(tpPanelBackground); StyleServices.GetElementColor(LDetails, ecFillColor, LColor); DrawStyleFillRect(hdc, pRect, LColor); Exit(S_OK); end; end; end; end; //OutputDebugString(PChar(Format('UxTheme_InfoBar class %s hTheme %d iPartId %d iStateId %d', [LThemeClass, hTheme, iPartId, iStateId]))); Exit(Trampoline(hTheme, hdc, iPartId, iStateId, pRect, Foo)); end; function UxTheme_BreadCrumBar(hTheme: HTHEME; hdc: HDC; iPartId, iStateId: Integer; const pRect: TRect; Foo: Pointer; Trampoline : TDrawThemeBackground; LThemeClass : string; hwnd : HWND): HRESULT; stdcall; begin case iPartId of 1 : begin case iStateId of 1 : begin //DrawStyleFillRect(hdc, pRect, clGreen); DrawStyleElement(hdc, StyleServices.GetElementDetails(ttbButtonNormal), pRect); DrawStyleElement(hdc, StyleServices.GetElementDetails(tsArrowBtnLeftNormal), pRect); Exit(S_OK); end; 2 : begin DrawStyleElement(hdc, StyleServices.GetElementDetails(ttbButtonNormal), pRect); DrawStyleElement(hdc, StyleServices.GetElementDetails(tsArrowBtnLeftNormal), pRect); Exit(S_OK); end; 3 : //Pressed begin DrawStyleElement(hdc, StyleServices.GetElementDetails(ttbButtonPressed), pRect); DrawStyleElement(hdc, StyleServices.GetElementDetails(tsArrowBtnLeftPressed), pRect); Exit(S_OK); end; 8 : //fade out (hot) begin DrawStyleElement(hdc, StyleServices.GetElementDetails(ttbButtonHot), pRect); DrawStyleElement(hdc, StyleServices.GetElementDetails(tsArrowBtnLeftHot), pRect); Exit(S_OK); end; end; end; end; //OutputDebugString(PChar(Format('UxTheme_BreadCrumBar class %s hTheme %d iPartId %d iStateId %d', [LThemeClass, hTheme, iPartId, iStateId]))); Exit(Trampoline(hTheme, hdc, iPartId, iStateId, pRect, Foo)); end; function UxTheme_TryHarder(hTheme: HTHEME; hdc: HDC; iPartId, iStateId: Integer; const pRect: TRect; Foo: Pointer; Trampoline : TDrawThemeBackground; LThemeClass : string; hwnd : HWND): HRESULT; stdcall; begin case iPartId of 0 : begin DrawStyleFillRect(hdc, pRect, StyleServices.GetSystemColor(clWindow)); Exit(S_OK); end; end; //OutputDebugString(PChar(Format('UxTheme_TryHarder class %s hTheme %d iPartId %d iStateId %d', [LThemeClass, hTheme, iPartId, iStateId]))); Exit(Trampoline(hTheme, hdc, iPartId, iStateId, pRect, Foo)); end; function UxTheme_Tab(hTheme: HTHEME; hdc: HDC; iPartId, iStateId: Integer; const pRect: TRect; Foo: Pointer; Trampoline : TDrawThemeBackground; LThemeClass : string; hwnd : HWND): HRESULT; stdcall; begin case iPartId of TABP_TOPTABITEM : begin case iStateId of TIS_NORMAL : begin DrawStyleElement(hdc, StyleServices.GetElementDetails(ttTabItemNormal), pRect); //DrawStyleFillRect(hdc, pRect, clGreen); Exit(S_OK); end; TIS_HOT : begin DrawStyleElement(hdc, StyleServices.GetElementDetails(ttTabItemHot), pRect); //DrawStyleFillRect(hdc, pRect, clGreen); Exit(S_OK); end; TIS_SELECTED : begin DrawStyleElement(hdc, StyleServices.GetElementDetails(ttTabItemSelected), pRect); //DrawStyleFillRect(hdc, pRect, clGreen); Exit(S_OK); end; end; end; TABP_TOPTABITEMLEFTEDGE : begin case iStateId of TILES_NORMAL : begin DrawStyleElement(hdc, StyleServices.GetElementDetails(ttTabItemLeftEdgeNormal), pRect); //DrawStyleFillRect(hdc, pRect, clGreen); Exit(S_OK); end; TILES_HOT : begin DrawStyleElement(hdc, StyleServices.GetElementDetails(ttTabItemLeftEdgeHot), pRect); //DrawStyleFillRect(hdc, pRect, clGreen); Exit(S_OK); end; TILES_SELECTED : begin DrawStyleElement(hdc, StyleServices.GetElementDetails(ttTabItemLeftEdgeSelected), pRect); //DrawStyleFillRect(hdc, pRect, clGreen); Exit(S_OK); end; TILES_DISABLED : begin DrawStyleElement(hdc, StyleServices.GetElementDetails(ttTabItemLeftEdgeDisabled), pRect); //DrawStyleFillRect(hdc, pRect, clGreen); Exit(S_OK); end; end; end; TABP_TOPTABITEMRIGHTEDGE : begin case iStateId of TIRES_NORMAL : begin DrawStyleElement(hdc, StyleServices.GetElementDetails(ttTabItemRightEdgeNormal), pRect); //DrawStyleFillRect(hdc, pRect, clGreen); Exit(S_OK); end; TIRES_HOT : begin DrawStyleElement(hdc, StyleServices.GetElementDetails(ttTabItemRightEdgeHot), pRect); //DrawStyleFillRect(hdc, pRect, clGreen); Exit(S_OK); end; TIRES_SELECTED : begin DrawStyleElement(hdc, StyleServices.GetElementDetails(ttTabItemRightEdgeSelected), pRect); //DrawStyleFillRect(hdc, pRect, clGreen); Exit(S_OK); end; TIRES_DISABLED : begin DrawStyleElement(hdc, StyleServices.GetElementDetails(ttTabItemRightEdgeDisabled), pRect); //DrawStyleFillRect(hdc, pRect, clGreen); Exit(S_OK); end; end; end; TABP_PANE : begin DrawStyleElement(hdc, StyleServices.GetElementDetails(ttPane), pRect); Exit(S_OK); end; end; //OutputDebugString(PChar(Format('UxTheme_Tab class %s hTheme %d iPartId %d iStateId %d', [LThemeClass, hTheme, iPartId, iStateId]))); Exit(Trampoline(hTheme, hdc, iPartId, iStateId, pRect, Foo)); end; function UxTheme_ListViewPopup(hTheme: HTHEME; hdc: HDC; iPartId, iStateId: Integer; const pRect: TRect; Foo: Pointer; Trampoline : TDrawThemeBackground; LThemeClass : string; hwnd : HWND): HRESULT; stdcall; begin case iPartId of 0 : begin DrawStyleFillRect(hdc, pRect, StyleServices.GetSystemColor(clWindow)); //Windows Vista - W7 if (TOSVersion.Major=6) and ((TOSVersion.Minor=0) or (TOSVersion.Minor=1)) then SetTextColor(hdc, ColorToRGB(StyleServices.GetSystemColor(clWindowText))); Exit(S_OK); end; end; //OutputDebugString(PChar(Format('UxTheme_ListViewPopup class %s hTheme %d iPartId %d iStateId %d', [LThemeClass, hTheme, iPartId, iStateId]))); Exit(Trampoline(hTheme, hdc, iPartId, iStateId, pRect, Foo)); end; function UxTheme_ToolTip(hTheme: HTHEME; hdc: HDC; iPartId, iStateId: Integer; const pRect: TRect; Foo: Pointer; Trampoline : TDrawThemeBackground; LThemeClass : string; hwnd : HWND): HRESULT; stdcall; var LStartColor, LEndColor : TColor; LCanvas : TCanvas; SaveIndex : Integer; begin case iPartId of TTP_STANDARD : begin DrawStyleFillRect(hdc, pRect, StyleServices.GetStyleColor(TStyleColor.scPanel)); Exit(S_OK); end; TTP_BALLOON : begin //DrawStyleFillRect(hdc, pRect, StyleServices.GetStyleColor(TStyleColor.scPanel)); LStartColor := GetHighLightColor(StyleServices.GetStyleColor(TStyleColor.scPanel), 10); LEndColor := StyleServices.GetStyleColor(TStyleColor.scPanel); LCanvas:=TCanvas.Create; SaveIndex := SaveDC(hdc); try LCanvas.Handle:=hdc; GradientFillCanvas(LCanvas, LStartColor, LEndColor, Rect(pRect.Left, pRect.Top, pRect.Width, pRect.Bottom), TGradientDirection.gdVertical); finally LCanvas.Handle := 0; LCanvas.Free; RestoreDC(hdc, SaveIndex); end; Exit(S_OK); end; TTP_BALLOONSTEM : begin //if iStateId = 0 then DrawStyleFillRect(hdc, pRect, GetHighLightColor(StyleServices.GetStyleColor(TStyleColor.scPanel), 10)); Exit(S_OK); end; end; //OutputDebugString(PChar(Format('UxTheme_ToolTip class %s hTheme %d iPartId %d iStateId %d', [LThemeClass, hTheme, iPartId, iStateId]))); Exit(Trampoline(hTheme, hdc, iPartId, iStateId, pRect, Foo)); end; function UxTheme_TrackBar(hTheme: HTHEME; hdc: HDC; iPartId, iStateId: Integer; const pRect: TRect; Foo: Pointer; Trampoline : TDrawThemeBackground; LThemeClass : string; hwnd : HWND): HRESULT; stdcall; begin case iPartId of TKP_TRACKVERT : begin case iStateId of TKS_NORMAL : begin DrawStyleElement(hdc, StyleServices.GetElementDetails(ttbTrackVert), pRect); Exit(S_OK); end; end; end; TKP_THUMBRIGHT : begin case iStateId of TUS_NORMAL : begin DrawStyleElement(hdc, StyleServices.GetElementDetails(ttbThumbRightNormal), pRect); Exit(S_OK); end; TUS_HOT : begin DrawStyleElement(hdc, StyleServices.GetElementDetails(ttbThumbRightHot), pRect); Exit(S_OK); end; TUS_PRESSED : begin DrawStyleElement(hdc, StyleServices.GetElementDetails(ttbThumbRightPressed), pRect); Exit(S_OK); end; TUS_FOCUSED : begin DrawStyleElement(hdc, StyleServices.GetElementDetails(ttbThumbRightFocused), pRect); Exit(S_OK); end; TUS_DISABLED : begin DrawStyleElement(hdc, StyleServices.GetElementDetails(ttbThumbRightDisabled), pRect); Exit(S_OK); end; end; end; end; //OutputDebugString(PChar(Format('UxTheme_TrackBar class %s hTheme %d iPartId %d iStateId %d', [LThemeClass, hTheme, iPartId, iStateId]))); Exit(Trampoline(hTheme, hdc, iPartId, iStateId, pRect, Foo)); end; function UxTheme_PreviewPane(hTheme: HTHEME; hdc: HDC; iPartId, iStateId: Integer; const pRect: TRect; Foo: Pointer; Trampoline : TDrawThemeBackground; LThemeClass : string; hwnd : HWND): HRESULT; stdcall; var LColor : TColor; begin case iPartId of 1: begin case iStateId of //background 1 : begin DrawStyleElement(hdc, StyleServices.GetElementDetails(tcpThemedHeader), pRect); Exit(S_OK); end; end; end; 3: begin case iStateId of //left border of listview 0 : begin StyleServices.GetElementColor(StyleServices.GetElementDetails(tpPanelBackground), ecFillColor, LColor); DrawStyleFillRect(hdc, pRect, LColor); Exit(S_OK); end; end; end; 4: begin case iStateId of //left border of preview pane 0 : begin StyleServices.GetElementColor(StyleServices.GetElementDetails(tpPanelBackground), ecFillColor, LColor); DrawStyleFillRect(hdc, pRect, LColor); Exit(S_OK); end; end; end; end; //OutputDebugString(PChar(Format('UxTheme_PreviewPane class %s hTheme %d iPartId %d iStateId %d', [LThemeClass, hTheme, iPartId, iStateId]))); Exit(Trampoline(hTheme, hdc, iPartId, iStateId, pRect, Foo)); end; function UxTheme_ToolBar(hTheme: HTHEME; hdc: HDC; iPartId, iStateId: Integer; const pRect: TRect; Foo: Pointer; Trampoline : TDrawThemeBackground; LThemeClass : string; hwnd : HWND): HRESULT; stdcall; var LDetails : TThemedElementDetails; LRect : TRect; begin case iPartId of 0 : begin case iStateId of 0 : begin if (hwnd <> 0) then DrawStyleParentBackground(hwnd, hdc, pRect); LDetails.Element := teToolBar; LDetails.Part := 0; LDetails.State := 0; //DrawStyleFillRect(hdc, pRect, clYellow); //DrawStyleElement(hdc, StyleServices.GetElementDetails(tmPopupBackground), pRect); DrawStyleElement(hdc, StyleServices.GetElementDetails(tmPopupBackground), pRect); Exit(S_OK); end; end; end; TP_BUTTON : begin case iStateId of TS_NORMAL : begin DrawStyleElement(hdc, StyleServices.GetElementDetails(ttbButtonNormal), pRect); Exit(S_OK); end; TS_HOT : begin DrawStyleElement(hdc, StyleServices.GetElementDetails(ttbButtonHot), pRect); Exit(S_OK); end; TS_PRESSED : begin DrawStyleElement(hdc, StyleServices.GetElementDetails(ttbButtonPressed), pRect); Exit(S_OK); end; TS_NEARHOT : begin //DrawStyleElement(hdc, StyleServices.GetElementDetails(ttbButtonNearHot), pRect); //DrawStyleFillRect(hdc, pRect, clRed); DrawStyleElement(hdc, StyleServices.GetElementDetails(ttbButtonHot), pRect); Exit(S_OK); end; end; end; TP_SPLITBUTTON : begin case iStateId of TS_NORMAL : begin DrawStyleElement(hdc, StyleServices.GetElementDetails(ttbSplitButtonNormal), pRect); Exit(S_OK); end; TS_HOT : begin DrawStyleElement(hdc, StyleServices.GetElementDetails(ttbSplitButtonHot), pRect); Exit(S_OK); end; TS_PRESSED : begin DrawStyleElement(hdc, StyleServices.GetElementDetails(ttbSplitButtonPressed), pRect); Exit(S_OK); end; TS_NEARHOT : begin //DrawStyleElement(hdc, StyleServices.GetElementDetails(ttbSplitButtonNearHot), pRect); //DrawStyleFillRect(hdc, pRect, clRed); DrawStyleElement(hdc, StyleServices.GetElementDetails(ttbSplitButtonHot), pRect); Exit(S_OK); end; TS_OTHERSIDEHOT : begin //DrawStyleElement(hdc, StyleServices.GetElementDetails(ttbSplitButtonOtherSideHot), pRect); //DrawStyleFillRect(hdc, pRect, clBlue); DrawStyleElement(hdc, StyleServices.GetElementDetails(ttbSplitButtonHot), pRect); Exit(S_OK); end; end; end; TP_SPLITBUTTONDROPDOWN : begin case iStateId of TS_NORMAL : begin LRect:= pRect; LRect.Top := LRect.Top + 9; LRect.Left := LRect.Left + 3; DrawStyleArrow(hdc, TScrollDirection.sdDown, LRect.Location, 3, StyleServices.GetSystemColor(clWindowText)); // //DrawStyleElement(hdc, StyleServices.GetElementDetails(ttbSplitButtonDropDownNormal), pRect); Exit(S_OK); end; TS_HOT : begin DrawStyleElement(hdc, StyleServices.GetElementDetails(ttbSplitButtonDropDownHot), pRect); Exit(S_OK); end; TS_PRESSED : begin DrawStyleElement(hdc, StyleServices.GetElementDetails(ttbSplitButtonDropDownPressed), pRect); Exit(S_OK); end; TS_OTHERSIDEHOT : begin //DrawStyleElement(hdc, StyleServices.GetElementDetails(ttbSplitButtonDropDownOtherSideHot), pRect); DrawStyleElement(hdc, StyleServices.GetElementDetails(ttbSplitButtonDropDownHot), pRect); Exit(S_OK); end; end; end; end; //OutputDebugString(PChar(Format('UxTheme_ToolBar hTheme %d iPartId %d iStateId %d', [hTheme, iPartId, iStateId]))); Exit(Trampoline(hTheme, hdc, iPartId, iStateId, pRect, Foo)); end; function UxTheme_Rebar(hTheme: HTHEME; hdc: HDC; iPartId, iStateId: Integer; const pRect: TRect; Foo: Pointer; Trampoline : TDrawThemeBackground; LThemeClass : string; hwnd : HWND = 0): HRESULT; stdcall; begin case iPartId of RP_BAND : begin //DrawStyleElement(hdc, StyleServices.GetElementDetails(trBand), pRect); DrawStyleFillRect(hdc, pRect, StyleServices.GetSystemColor(clBtnFace)); Exit(S_OK); end; RP_BACKGROUND : begin //DrawStyleElement(hdc, StyleServices.GetElementDetails(trBackground), pRect); DrawStyleFillRect(hdc, pRect, StyleServices.GetSystemColor(clBtnFace)); Exit(S_OK); end end; //OutputDebugString(PChar(Format('UxTheme_Rebar hTheme %d iPartId %d iStateId %d', [hTheme, iPartId, iStateId]))); Exit(Trampoline(hTheme, hdc, iPartId, iStateId, pRect, Foo)); end; function UxTheme_AddressBand(hTheme: HTHEME; hdc: HDC; iPartId, iStateId: Integer; const pRect: TRect; Foo: Pointer; Trampoline : TDrawThemeBackground; LThemeClass : string; hwnd : HWND): HRESULT; stdcall; begin case iPartId of //address bar control 1 : begin case iStateId of //normal 1: begin //DrawStyleElement(hdc, StyleServices.GetElementDetails(teEditBorderNoScrollNormal), pRect); DrawStyleFillRect(hdc, pRect, StyleServices.GetSystemColor(clWindow)); DrawStyleRectangle(hdc, pRect, StyleServices.GetSystemColor(clBtnShadow)); Exit(S_OK); end; //hot 2: begin //DrawStyleElement(hdc, StyleServices.GetElementDetails(teEditBorderNoScrollHot), pRect); DrawStyleFillRect(hdc, pRect, StyleServices.GetSystemColor(clWindow)); DrawStyleRectangle(hdc, pRect, StyleServices.GetSystemColor(clBtnShadow)); Exit(S_OK); end; //editing 4: begin //DrawStyleElement(hdc, StyleServices.GetElementDetails(teEditBorderNoScrollFocused), pRect); DrawStyleFillRect(hdc, pRect, StyleServices.GetSystemColor(clWindow)); DrawStyleRectangle(hdc, pRect, StyleServices.GetSystemColor(clBtnShadow)); Exit(S_OK); end; end; end; end; //OutputDebugString(PChar(Format('UxTheme_AddressBand hTheme %d iPartId %d iStateId %d', [hTheme, iPartId, iStateId]))); Exit(Trampoline(hTheme, hdc, iPartId, iStateId, pRect, Foo)); end; function UxTheme_SearchBox(hTheme: HTHEME; hdc: HDC; iPartId, iStateId: Integer; const pRect: TRect; Foo: Pointer; Trampoline : TDrawThemeBackground; LThemeClass : string; hwnd : HWND): HRESULT; stdcall; begin // OutputDebugString(PChar(Format('UxTheme_SearchBox hTheme %d iPartId %d iStateId %d', [hTheme, iPartId, iStateId]))); case iPartId of //searchbox control 1 : begin case iStateId of //normal 1: begin DrawStyleElement(hdc, StyleServices.GetElementDetails(teEditBorderNoScrollNormal), pRect); Exit(S_OK); end; //hot 2: begin DrawStyleElement(hdc, StyleServices.GetElementDetails(teEditBorderNoScrollHot), pRect); Exit(S_OK); end; 4://editing begin DrawStyleElement(hdc, StyleServices.GetElementDetails(teEditBorderNoScrollFocused), pRect); Exit(S_OK); end; end; end; // X // 2 : // begin // case iStateId of // // 1: // begin // AwesomeFont.DrawChar(hdc, fa_remove, pRect, StyleServices.GetSystemColor(clWindowText)); // Exit(S_OK); // end; // // 2, //hot // 3: //pressed // // begin // LColor := StyleServices.GetSystemColor(clHighlight); // AwesomeFont.DrawChar(hdc, fa_remove, pRect, LColor); // //AlphaBlendRectangle(hdc, LColor, pRect, 32); // Exit(S_OK); // end; // end; // end; //Magnifier 3 : begin case iStateId of 1: //normal begin FontAwesome.DrawChar(hdc, fa_search, pRect, StyleServices.GetSystemColor(clHighlight)); Exit(S_OK); end; end; end; end; //OutputDebugString(PChar(Format('UxTheme_SearchBox hTheme %d iPartId %d iStateId %d', [hTheme, iPartId, iStateId]))); Exit(Trampoline(hTheme, hdc, iPartId, iStateId, pRect, Foo)); end; function UxTheme_MonthCal(hTheme: HTHEME; hdc: HDC; iPartId, iStateId: Integer; const pRect: TRect; Foo: Pointer; Trampoline : TDrawThemeBackground; LThemeClass : string; hwnd : HWND = 0): HRESULT; stdcall; var LDetails : TThemedElementDetails; SaveIndex : Integer; LRect : TRect; LStartColor, LEndColor : TColor; LCanvas : TCanvas; begin case iPartId of MC_BORDERS : begin DrawStyleElement(hdc, StyleServices.GetElementDetails(teEditBorderNoScrollNormal), pRect); Exit(S_OK); end; MC_BACKGROUND, MC_GRIDBACKGROUND : begin DrawStyleFillRect(hdc, pRect, StyleServices.GetStyleColor(scGrid)); Exit(S_OK); end; MC_COLHEADERSPLITTER : begin LStartColor := StyleServices.GetSystemColor(clWindow); LEndColor := StyleServices.GetSystemColor(clHighlight); LCanvas:=TCanvas.Create; SaveIndex := SaveDC(hdc); try LCanvas.Handle:=hdc; LRect:=pRect; GradientFillCanvas(LCanvas, LStartColor, LEndColor, Rect(LRect.Left, LRect.Top, LRect.Width div 2, LRect.Bottom), TGradientDirection.gdHorizontal); GradientFillCanvas(LCanvas, LEndColor, LStartColor, Rect(LRect.Width div 2, LRect.Top, LRect.Width, LRect.Bottom), TGradientDirection.gdHorizontal); finally LCanvas.Handle := 0; LCanvas.Free; RestoreDC(hdc, SaveIndex); end; Exit(S_OK); end; MC_GRIDCELLBACKGROUND : begin LStartColor := StyleServices.GetSystemColor(clHighlight); if iStateId = MCGCB_TODAY then AlphaBlendRectangle(hdc, LStartColor, pRect, 200) else AlphaBlendRectangle(hdc, LStartColor, pRect, 96); Exit(S_OK); end; MC_NAVNEXT : begin case iStateId of MCNN_NORMAL : LDetails := StyleServices.GetElementDetails(tsArrowBtnRightNormal); MCNN_HOT : LDetails := StyleServices.GetElementDetails(tsArrowBtnRightHot); MCNN_PRESSED : LDetails := StyleServices.GetElementDetails(tsArrowBtnRightPressed); MCNN_DISABLED : LDetails := StyleServices.GetElementDetails(tsArrowBtnRightDisabled); end; DrawStyleElement(hdc, LDetails, pRect); Exit(S_OK); end; MC_NAVPREV : begin case iStateId of MCNP_NORMAL : LDetails := StyleServices.GetElementDetails(tsArrowBtnLeftNormal); MCNP_HOT : LDetails := StyleServices.GetElementDetails(tsArrowBtnLeftHot); MCNP_PRESSED : LDetails := StyleServices.GetElementDetails(tsArrowBtnLeftPressed); MCNP_DISABLED: LDetails := StyleServices.GetElementDetails(tsArrowBtnLeftDisabled); end; DrawStyleElement(hdc, LDetails, pRect); Exit(S_OK); end; end; //OutputDebugString(PChar(Format('UxTheme_MonthCal hTheme %d iPartId %d iStateId %d', [hTheme, iPartId, iStateId]))); Exit(Trampoline(hTheme, hdc, iPartId, iStateId, pRect, Foo)); end; function UxTheme_DatePicker(hTheme: HTHEME; hdc: HDC; iPartId, iStateId: Integer; const pRect: TRect; Foo: Pointer; Trampoline : TDrawThemeBackground; LThemeClass : string; hwnd : HWND = 0): HRESULT; stdcall; var LDetails : TThemedElementDetails; LRect : TRect; LColor : TColor; begin case iPartId of DP_DATEBORDER : begin case iStateId of DPDB_NORMAL : LDetails := StyleServices.GetElementDetails(teEditBorderNoScrollNormal); DPDB_HOT : LDetails := StyleServices.GetElementDetails(teEditBorderNoScrollHot); DPDB_FOCUSED : LDetails := StyleServices.GetElementDetails(teEditBorderNoScrollFocused); DPDB_DISABLED : LDetails := StyleServices.GetElementDetails(teEditBorderNoScrollDisabled); end; DrawStyleElement(hdc, LDetails, pRect); Exit(S_OK); end; DP_SHOWCALENDARBUTTONRIGHT : begin case iStateId of DPSCBR_NORMAL :LDetails := StyleServices.GetElementDetails(tcBorderNormal); DPSCBR_HOT :LDetails := StyleServices.GetElementDetails(tcBorderHot); DPSCBR_PRESSED :LDetails := StyleServices.GetElementDetails(tcBorderHot); DPSCBR_DISABLED :LDetails := StyleServices.GetElementDetails(tcBorderDisabled); end; DrawStyleElement(hdc, LDetails, pRect); case iStateId of DPSCBR_NORMAL : begin LColor := StyleServices.GetSystemColor(clWindowText); end; DPSCBR_HOT : begin LColor:= GetStyleHighLightColor; end; DPSCBR_PRESSED : begin LColor:= GetStyleHighLightColor; end; DPSCBR_DISABLED : begin LColor := StyleServices.GetSystemColor(clGrayText); end; else LColor := StyleServices.GetSystemColor(clWindowText); end; LRect:=pRect; InflateRect(LRect, -2, -2); DrawStyleFillRect(hdc, LRect, StyleServices.GetStyleColor(TStyleColor.scEdit)); LRect:=Rect(0, 0, 14, 14); RectVCenter(LRect, pRect); OffsetRect(LRect, (pRect.Width - LRect.Width) div 2, 0); FontAwesome.DrawChar(hdc, fa_calendar_o, LRect, LColor); Exit(S_OK); end; end; //OutputDebugString(PChar(Format('UxTheme_DatePicker hTheme %d iPartId %d iStateId %d', [hTheme, iPartId, iStateId]))); Exit(Trampoline(hTheme, hdc, iPartId, iStateId, pRect, Foo)); end; function UxTheme_ListView(hTheme: HTHEME; hdc: HDC; iPartId, iStateId: Integer; const pRect: TRect; Foo: Pointer; Trampoline : TDrawThemeBackground; LThemeClass : string; hwnd : HWND = 0): HRESULT; stdcall; var LDetails : TThemedElementDetails; SaveIndex : Integer; LCanvas : TCanvas; LRect : TRect; LColor, LStartColor : TColor; begin case iPartId of LVP_LISTITEM : begin case iStateId of LIS_HOT, LISS_HOTSELECTED, LIS_SELECTEDNOTFOCUS, LIS_SELECTED : begin LColor := StyleServices.GetSystemColor(clHighlight); LRect := pRect; if not SameText(LThemeClass, VSCLASS_LISTVIEW) then InflateRect(LRect, -1, -1); if iStateId=LISS_HOTSELECTED then AlphaBlendRectangle(hdc, LColor, LRect, 96) else AlphaBlendRectangle(hdc, LColor, LRect, 50); Exit(S_OK); end; end; end; LVP_LISTDETAIL : begin case iStateId of LIS_NORMAL, LIS_HOT : begin LColor := StyleServices.GetSystemColor(clHighlight); LRect := pRect; if not SameText(LThemeClass, VSCLASS_LISTVIEW) then InflateRect(LRect, -1, -1); if iStateId=LIS_HOT then AlphaBlendRectangle(hdc, LColor, LRect, 96) else AlphaBlendRectangle(hdc, LColor, LRect, 50); Exit(S_OK); end; end; end; LVP_EXPANDBUTTON : begin case iStateId of LVEB_NORMAL : LDetails := StyleServices.GetElementDetails(tcpThemedChevronOpenedNormal); LVEB_HOVER : LDetails := StyleServices.GetElementDetails(tcpThemedChevronOpenedHot); LVEB_PUSHED : LDetails := StyleServices.GetElementDetails(tcpThemedChevronOpenedPressed); else LDetails := StyleServices.GetElementDetails(tcpThemedChevronOpenedNormal); end; SaveIndex := SaveDC(hdc); try if hwnd<>0 then DrawStyleParentBackground(hwnd, hdc, pRect); StyleServices.DrawElement(hdc, LDetails, pRect, nil); finally RestoreDC(hdc, SaveIndex); end; Exit(S_OK); end; LVP_COLLAPSEBUTTON : begin case iStateId of LVCB_NORMAL : LDetails := StyleServices.GetElementDetails(tcpThemedChevronClosedNormal); LVCB_HOVER : LDetails := StyleServices.GetElementDetails(tcpThemedChevronClosedHot); LVCB_PUSHED : LDetails := StyleServices.GetElementDetails(tcpThemedChevronClosedPressed); else LDetails := StyleServices.GetElementDetails(tcpThemedChevronClosedNormal); end; SaveIndex := SaveDC(hdc); try if hwnd<>0 then DrawStyleParentBackground(hwnd, hdc, pRect); StyleServices.DrawElement(hdc, LDetails, pRect, nil); finally RestoreDC(hdc, SaveIndex); end; Exit(S_OK); end; LVP_GROUPHEADER : begin case iStateId of LVGH_OPENMIXEDSELECTIONHOT, LVGH_OPENSELECTED, LVGH_OPENSELECTEDNOTFOCUSEDHOT, LVGH_OPENSELECTEDHOT, LVGH_CLOSEHOT, LVGH_CLOSESELECTEDHOT, LVGH_CLOSESELECTEDNOTFOCUSEDHOT, LVGHL_CLOSESELECTED, LVGH_CLOSESELECTEDNOTFOCUSED, LVGH_CLOSEMIXEDSELECTION, LVGH_CLOSEMIXEDSELECTIONHOT, LVGH_OPENHOT : begin LRect:=pRect; InflateRect(LRect, -1, -1); AlphaBlendRectangle(hdc, StyleServices.GetSystemColor(clHighlight), LRect, 96); Exit(S_OK); end; end; end; LVP_GROUPHEADERLINE : begin case iStateId of LVGHL_CLOSEHOT, LVGHL_OPENHOT, LVGHL_OPENMIXEDSELECTIONHOT, LVGHL_OPENSELECTEDNOTFOCUSEDHOT, LVGHL_CLOSESELECTEDNOTFOCUSEDHOT, LVGHL_OPENSELECTED, LVGHL_CLOSESELECTED, LVGHL_CLOSESELECTEDHOT, LVGHL_CLOSEMIXEDSELECTION, LVGHL_CLOSEMIXEDSELECTIONHOT, LVGHL_OPENSELECTEDHOT : begin LColor := StyleServices.GetSystemColor(clWindowText); LCanvas:=TCanvas.Create; SaveIndex := SaveDC(hdc); try LCanvas.Handle:=hdc; LRect:=pRect; GradientFillCanvas(LCanvas, StyleServices.GetSystemColor(LColor), StyleServices.GetStyleColor(TStyleColor.scEdit){StyleServices.GetSystemColor(clWindow)}, LRect, TGradientDirection.gdHorizontal); finally LCanvas.Handle := 0; LCanvas.Free; RestoreDC(hdc, SaveIndex); end; Exit(S_OK); end; LVGHL_CLOSE, LVGHL_OPENSELECTEDNOTFOCUSED, LVGHL_OPEN, LVGHL_OPENMIXEDSELECTION : begin LColor := StyleServices.GetSystemColor(clWindowText); LCanvas:=TCanvas.Create; SaveIndex := SaveDC(hdc); try LCanvas.Handle:=hdc; LRect:=pRect; GradientFillCanvas(LCanvas, StyleServices.GetSystemColor(LColor), StyleServices.GetStyleColor(TStyleColor.scEdit), LRect, TGradientDirection.gdHorizontal); finally LCanvas.Handle := 0; LCanvas.Free; RestoreDC(hdc, SaveIndex); end; Exit(S_OK); end; end; end; LVP_COLUMNDETAIL : begin LColor := StyleServices.GetSystemColor(clWindow); DrawStyleFillRect(hdc, pRect, LColor); Exit(S_OK) end; end; //OutputDebugString(PChar(Format('UxTheme_ListView hTheme %d iPartId %d iStateId %d', [hTheme, iPartId, iStateId]))); //DrawStyleFillRect(hdc, pRect, clYellow); //Exit(S_OK) Exit(Trampoline(hTheme, hdc, iPartId, iStateId, pRect, Foo)); end; function UxTheme_Header(hTheme: HTHEME; hdc: HDC; iPartId, iStateId: Integer; const pRect: TRect; Foo: Pointer; Trampoline : TDrawThemeBackground; LThemeClass : string; hwnd : HWND = 0): HRESULT; stdcall; var LDetails : TThemedElementDetails; LRect : TRect; LColor : TColor; SaveIndex : Integer; begin case iPartId of 0 : begin DrawStyleElement(hdc, StyleServices.GetElementDetails(tcpThemedHeader), pRect); Exit(S_OK); end; HP_HEADERITEM : begin case iStateId of HIS_NORMAL : LDetails := StyleServices.GetElementDetails(thHeaderItemNormal); HIS_HOT : LDetails := StyleServices.GetElementDetails(thHeaderItemHot); HIS_PRESSED : LDetails := StyleServices.GetElementDetails(thHeaderItemPressed); HIS_SORTEDNORMAL : LDetails := StyleServices.GetElementDetails(thHeaderItemNormal); HIS_SORTEDHOT : LDetails := StyleServices.GetElementDetails(thHeaderItemHot); HIS_SORTEDPRESSED : LDetails := StyleServices.GetElementDetails(thHeaderItemPressed); HIS_ICONNORMAL : LDetails := StyleServices.GetElementDetails(thHeaderItemNormal); HIS_ICONHOT : LDetails := StyleServices.GetElementDetails(thHeaderItemHot); HIS_ICONPRESSED : LDetails := StyleServices.GetElementDetails(thHeaderItemPressed); HIS_ICONSORTEDNORMAL : LDetails := StyleServices.GetElementDetails(thHeaderItemNormal); HIS_ICONSORTEDHOT : LDetails := StyleServices.GetElementDetails(thHeaderItemHot); HIS_ICONSORTEDPRESSED : LDetails := StyleServices.GetElementDetails(thHeaderItemPressed); else LDetails := StyleServices.GetElementDetails(thHeaderItemNormal); end; SaveIndex := SaveDC(hdc); try if hwnd<>0 then DrawStyleParentBackground(hwnd, hdc, pRect); StyleServices.DrawElement(hdc, LDetails, pRect, nil); finally RestoreDC(hdc, SaveIndex); end; Exit(S_OK); end; HP_HEADERSORTARROW : begin // case iStateId of // HSAS_SORTEDUP : LDetails := StyleServices.GetElementDetails(thHeaderSortArrowSortedUp); // HSAS_SORTEDDOWN : LDetails := StyleServices.GetElementDetails(thHeaderSortArrowSortedDown); // end; LColor := GetStyleHighLightColor(); LRect:= pRect; LRect.Top := LRect.Top + 3; if (iStateId=HSAS_SORTEDUP) then DrawStyleArrow(hdc, TScrollDirection.sdUp, LRect.Location, 3, LColor) else DrawStyleArrow(hdc, TScrollDirection.sdDown, LRect.Location, 3, LColor); Exit(S_OK); end; HP_HEADERDROPDOWN : begin case iStateId of HDDS_NORMAL : LDetails := StyleServices.GetElementDetails(ttbSplitButtonDropDownNormal); //tcDropDownButtonNormal, thHeaderDropDownNormal HDDS_SOFTHOT : LDetails := StyleServices.GetElementDetails(ttbSplitButtonDropDownHot); //tcDropDownButtonHot, thHeaderDropDownSoftHot HDDS_HOT : LDetails := StyleServices.GetElementDetails(ttbSplitButtonDropDownHot); //tcDropDownButtonHot, thHeaderDropDownHot end; DrawStyleElement(hdc, LDetails, pRect); Exit(S_OK); end; HP_HEADERDROPDOWNFILTER : begin case iStateId of HDDFS_NORMAL : LDetails := StyleServices.GetElementDetails(ttbSplitButtonDropDownNormal); //tcDropDownButtonNormal, thHeaderDropDownNormal HDDFS_SOFTHOT : LDetails := StyleServices.GetElementDetails(ttbSplitButtonDropDownHot); //tcDropDownButtonHot, thHeaderDropDownSoftHot HDDFS_HOT : LDetails := StyleServices.GetElementDetails(ttbSplitButtonDropDownHot); //tcDropDownButtonHot, thHeaderDropDownHot end; DrawStyleElement(hdc, LDetails, pRect); Exit(S_OK); end; end; //OutputDebugString(PChar(Format('UxTheme_Header hTheme %d iPartId %d iStateId %d', [hTheme, iPartId, iStateId]))); Exit(Trampoline(hTheme, hdc, iPartId, iStateId, pRect, Foo)); end; function UxTheme_ComboBox(hTheme: HTHEME; hdc: HDC; iPartId, iStateId: Integer; const pRect: TRect; Foo: Pointer; Trampoline : TDrawThemeBackground; LThemeClass : string; hwnd : HWND = 0): HRESULT; stdcall; var LRect : TRect; begin case iPartId of CP_BORDER : begin case iStateId of CBB_NORMAL : begin DrawStyleElement(hdc, StyleServices.GetElementDetails(tcBorderNormal), pRect); Exit(S_OK); end; CBB_HOT : begin DrawStyleElement(hdc, StyleServices.GetElementDetails(tcBorderHot), pRect); Exit(S_OK); end; CBB_FOCUSED : begin DrawStyleElement(hdc, StyleServices.GetElementDetails(tcBorderFocused), pRect); Exit(S_OK); end; CBB_DISABLED : begin DrawStyleElement(hdc, StyleServices.GetElementDetails(tcBorderDisabled), pRect); Exit(S_OK); end; end; end; CP_DROPDOWNBUTTONRIGHT : begin LRect:=pRect; InflateRect(LRect, -2, -2); case iStateId of CBXSR_NORMAL : begin DrawStyleElement(hdc, StyleServices.GetElementDetails(tcDropDownButtonNormal), LRect); Exit(S_OK); end; CBXSR_HOT : begin DrawStyleElement(hdc, StyleServices.GetElementDetails(tcDropDownButtonHot), LRect); Exit(S_OK); end; CBXSR_PRESSED : begin DrawStyleElement(hdc, StyleServices.GetElementDetails(tcDropDownButtonPressed), LRect); Exit(S_OK); end; CBXSR_DISABLED : begin DrawStyleElement(hdc, StyleServices.GetElementDetails(tcDropDownButtonDisabled), LRect); Exit(S_OK); end; end; end; end; //OutputDebugString(PChar(Format('UxTheme_ComboBox class %s hTheme %d iPartId %d iStateId %d', [THThemesClasses.Items[hTheme],hTheme, iPartId, iStateId]))); Exit(Trampoline(hTheme, hdc, iPartId, iStateId, pRect, Foo)); end; function UxTheme_Spin(hTheme: HTHEME; hdc: HDC; iPartId, iStateId: Integer; const pRect: TRect; Foo: Pointer; Trampoline : TDrawThemeBackground; LThemeClass : string; hwnd : HWND = 0): HRESULT; stdcall; var LDetails : TThemedElementDetails; LRect : TRect; LColor : TColor; begin case iPartId of SPNP_UP : begin case iStateId of UPS_NORMAL : LDetails := StyleServices.GetElementDetails(tsUpNormal); UPS_HOT : LDetails := StyleServices.GetElementDetails(tsUpHot); UPS_PRESSED : LDetails := StyleServices.GetElementDetails(tsUpPressed); UPS_DISABLED : LDetails := StyleServices.GetElementDetails(tsUpDisabled); end; LColor := StyleServices.GetStyleFontColor(TStyleFont.sfButtonTextNormal); case iStateId of UPS_NORMAL : LColor := StyleServices.GetStyleFontColor(TStyleFont.sfButtonTextNormal); UPS_HOT : LColor := StyleServices.GetStyleFontColor(TStyleFont.sfButtonTextHot); UPS_PRESSED : LColor := StyleServices.GetStyleFontColor(TStyleFont.sfButtonTextPressed); UPS_DISABLED : LColor := StyleServices.GetStyleFontColor(TStyleFont.sfButtonTextDisabled); end; DrawStyleElement(hdc, LDetails, pRect); LRect:= pRect; LRect.Top := LRect.Top + 3; LRect.Left := LRect.Left + 5; DrawStyleArrow(hdc, TScrollDirection.sdUp, LRect.Location, 2, LColor); Exit(S_OK); end; SPNP_DOWN : begin case iStateId of DNS_NORMAL : LDetails := StyleServices.GetElementDetails(tsDownNormal); DNS_HOT : LDetails := StyleServices.GetElementDetails(tsDownHot); DNS_PRESSED : LDetails := StyleServices.GetElementDetails(tsDownPressed); DNS_DISABLED : LDetails := StyleServices.GetElementDetails(tsDownDisabled); end; LColor := StyleServices.GetStyleFontColor(TStyleFont.sfButtonTextNormal); case iStateId of DNS_NORMAL : LColor := StyleServices.GetStyleFontColor(TStyleFont.sfButtonTextNormal); DNS_HOT : LColor := StyleServices.GetStyleFontColor(TStyleFont.sfButtonTextHot); DNS_PRESSED : LColor := StyleServices.GetStyleFontColor(TStyleFont.sfButtonTextPressed); DNS_DISABLED : LColor := StyleServices.GetStyleFontColor(TStyleFont.sfButtonTextDisabled); end; DrawStyleElement(hdc, LDetails, pRect); LRect:= pRect; LRect.Top := LRect.Top + 3; LRect.Left := LRect.Left + 5; DrawStyleArrow(hdc, TScrollDirection.sdDown, LRect.Location, 2, LColor); Exit(S_OK); end; end; //OutputDebugString(PChar(Format('UxTheme_Spin class %s hTheme %d iPartId %d iStateId %d', [THThemesClasses.Items[hTheme],hTheme, iPartId, iStateId]))); Exit(Trampoline(hTheme, hdc, iPartId, iStateId, pRect, Foo)); end; function UxTheme_ListBox(hTheme: HTHEME; hdc: HDC; iPartId, iStateId: Integer; const pRect: TRect; Foo: Pointer; Trampoline : TDrawThemeBackground; LThemeClass : string; hwnd : HWND = 0): HRESULT; stdcall; var LDetails : TThemedElementDetails; begin case iPartId of LBCP_BORDER_NOSCROLL : begin case iStateId of LBPSN_NORMAL : LDetails := StyleServices.GetElementDetails(teEditBorderNoScrollNormal); LBPSN_FOCUSED : LDetails := StyleServices.GetElementDetails(teEditBorderNoScrollFocused); LBPSN_HOT : LDetails := StyleServices.GetElementDetails(teEditBorderNoScrollHot); LBPSN_DISABLED : LDetails := StyleServices.GetElementDetails(teEditBorderNoScrollDisabled); end; DrawStyleElement(hdc, LDetails, pRect); Exit(S_OK); end; end; //OutputDebugString(PChar(Format('UxTheme_ListBox class %s hTheme %d iPartId %d iStateId %d', [LThemeClass, hTheme, iPartId, iStateId]))); Exit(Trampoline(hTheme, hdc, iPartId, iStateId, pRect, Foo)); end; function UxTheme_Navigation(hTheme: HTHEME; hdc: HDC; iPartId, iStateId: Integer; const pRect: TRect; Foo: Pointer; Trampoline : TDrawThemeBackground; LThemeClass : string; hwnd : HWND): HRESULT; stdcall; var LColor : TColor; LCanvas : TCanvas; LRect : TRect; LBitmap : TBitmap; LIcon : Word; begin case iPartId of 1, //left button 2 ://right button begin case iStateId of 1, //enabled left 2, //hot left 3, //pressed left 4 : //disabled left begin LBitmap := TBitmap.Create; try if iPartId = 1 then LIcon:= fa_arrow_left else LIcon:= fa_arrow_right; LBitmap.PixelFormat := pf24bit; LBitmap.SetSize(pRect.Width, pRect.Height); LRect:= Rect(0, 0, LBitmap.Width, LBitmap.Height); LColor:= StyleServices.GetSystemColor(clBtnFace); DrawStyleFillRect(LBitmap.Canvas.Handle, pRect, LColor); case iStateId of 1 : begin DrawStyleElement(LBitmap.Canvas.Handle, StyleServices.GetElementDetails(ttbButtonNormal), pRect); //DrawStyleElement(LBitmap.Canvas.Handle, StyleServices.GetElementDetails(tbCommandLinkGlyphNormal), LRect); LRect := Rect(0, 0, 16, 16); RectVCenter(LRect, pRect); OffsetRect(LRect, (pRect.Width - LRect.Width) div 2, 0); FontAwesome.DrawChar(LBitmap.Canvas.Handle, LIcon, LRect, StyleServices.GetSystemColor(clBtnText)); end; 2 : begin DrawStyleElement(LBitmap.Canvas.Handle, StyleServices.GetElementDetails(ttbButtonHot), pRect); //DrawStyleElement(LBitmap.Canvas.Handle, StyleServices.GetElementDetails(tbCommandLinkGlyphHot), LRect); LRect := Rect(0, 0, 16, 16); RectVCenter(LRect, pRect); OffsetRect(LRect, (pRect.Width - LRect.Width) div 2, 0); FontAwesome.DrawChar(LBitmap.Canvas.Handle, LIcon, LRect, StyleServices.GetSystemColor(clHighlight)); end; 3 : begin DrawStyleElement(LBitmap.Canvas.Handle, StyleServices.GetElementDetails(ttbButtonPressed), pRect); //DrawStyleElement(LBitmap.Canvas.Handle, StyleServices.GetElementDetails(tbCommandLinkGlyphPressed), LRect); LRect := Rect(0, 0, 16, 16); RectVCenter(LRect, pRect); OffsetRect(LRect, (pRect.Width - LRect.Width) div 2, 0); FontAwesome.DrawChar(LBitmap.Canvas.Handle, LIcon, LRect, StyleServices.GetSystemColor(clHighlight)); end; 4 : begin DrawStyleElement(LBitmap.Canvas.Handle, StyleServices.GetElementDetails(ttbButtonDisabled), pRect); //DrawStyleElement(LBitmap.Canvas.Handle, StyleServices.GetElementDetails(tbCommandLinkGlyphDisabled), LRect); LRect := Rect(0, 0, 16, 16); RectVCenter(LRect, pRect); OffsetRect(LRect, (pRect.Width - LRect.Width) div 2, 0); FontAwesome.DrawChar(LBitmap.Canvas.Handle, LIcon, LRect, StyleServices.GetSystemColor(clGrayText)); end; end; //FlipBitmap24Horizontal(LBitmap); LCanvas := TCanvas.Create; try LCanvas.Handle := hdc; LCanvas.Draw(pRect.Left, pRect.Top, LBitmap); finally LCanvas.Handle := 0; LCanvas.Free; end; finally LBitmap.Free; end; Exit(S_OK); end; end; end; 3 : //drop down button begin case iStateId of 1 : //enabled begin DrawStyleFillRect(hdc, pRect, StyleServices.GetSystemColor(clBtnFace)); DrawStyleElement(hdc, StyleServices.GetElementDetails(ttbSplitButtonDropDownNormal), pRect); Exit(S_OK); end; 2 : //hot begin DrawStyleFillRect(hdc, pRect, StyleServices.GetSystemColor(clBtnFace)); DrawStyleElement(hdc, StyleServices.GetElementDetails(ttbSplitButtonDropDownHot), pRect); Exit(S_OK); end; 3 : //pressed begin DrawStyleFillRect(hdc, pRect, StyleServices.GetSystemColor(clBtnFace)); DrawStyleElement(hdc, StyleServices.GetElementDetails(ttbSplitButtonDropDownPressed), pRect); Exit(S_OK); end; 4 : //disabled begin DrawStyleFillRect(hdc, pRect, StyleServices.GetSystemColor(clBtnFace)); DrawStyleElement(hdc, StyleServices.GetElementDetails(ttbSplitButtonDropDownDisabled), pRect); Exit(S_OK); end; end; end; end; //OutputDebugString(PChar(Format('UxTheme_Navigation class %s hTheme %d iPartId %d iStateId %d', [LThemeClass, hTheme, iPartId, iStateId]))); Exit(Trampoline(hTheme, hdc, iPartId, iStateId, pRect, Foo)); end; function UxTheme_TreeView(hTheme: HTHEME; hdc: HDC; iPartId, iStateId: Integer; const pRect: TRect; Foo: Pointer; Trampoline : TDrawThemeBackground; LThemeClass : string; hwnd : HWND): HRESULT; stdcall; var LColor : TColor; LRect : TRect; begin case iPartId of TVP_GLYPH : begin LColor:= StyleServices.GetSystemColor(clWindowText); LRect:= pRect; LRect.Top := LRect.Top + 5; LRect.Left := LRect.Left + 5; if (iStateId=GLPS_OPENED) or (iStateId=HGLPS_OPENED) then DrawStyleArrow(hdc, TScrollDirection.sdDown, LRect.Location, 3, LColor) else DrawStyleArrow(hdc, TScrollDirection.sdRight, LRect.Location, 3, LColor); Exit(S_OK); end; TVP_HOTGLYPH : begin LColor:= StyleServices.GetSystemColor(clHighlightText); LRect:= pRect; LRect.Top := LRect.Top + 5; LRect.Left := LRect.Left + 5; if (iStateId=HGLPS_OPENED) then DrawStyleArrow(hdc, TScrollDirection.sdDown, LRect.Location, 3, LColor) else DrawStyleArrow(hdc, TScrollDirection.sdRight, LRect.Location, 3, LColor); Exit(S_OK); end; TVP_TREEITEM : begin case iStateId of TREIS_HOT, TREIS_SELECTED, TREIS_SELECTEDNOTFOCUS, TREIS_HOTSELECTED : begin AlphaBlendRectangle(hdc, StyleServices.GetSystemColor(clHighlight), pRect, 96); Exit(S_OK); end; end; end; end; //OutputDebugString(PChar(Format('UxTheme_TreeView class %s hTheme %d iPartId %d iStateId %d', [THThemesClasses.Items[hTheme],hTheme, iPartId, iStateId]))); Exit(Trampoline(hTheme, hdc, iPartId, iStateId, pRect, Foo)); end; function UxTheme_Button(hTheme: HTHEME; hdc: HDC; iPartId, iStateId: Integer; const pRect: TRect; Foo: Pointer; Trampoline : TDrawThemeBackground; LThemeClass : string; hwnd : HWND): HRESULT; stdcall; var LDetails : TThemedElementDetails; SaveIndex : Integer; begin case iPartId of BP_PUSHBUTTON : begin case iStateId of PBS_NORMAL : LDetails := StyleServices.GetElementDetails(tbPushButtonNormal); PBS_HOT : LDetails := StyleServices.GetElementDetails(tbPushButtonHot); PBS_PRESSED : LDetails := StyleServices.GetElementDetails(tbPushButtonPressed); PBS_DISABLED : LDetails := StyleServices.GetElementDetails(tbPushButtonDisabled); PBS_DEFAULTED : LDetails := StyleServices.GetElementDetails(tbPushButtonDefaulted); PBS_DEFAULTED_ANIMATING : LDetails := StyleServices.GetElementDetails(tbPushButtonDefaultedAnimating); end; SaveIndex := SaveDC(hdc); try if hwnd<>0 then DrawStyleParentBackground(hwnd, hdc, pRect); StyleServices.DrawElement(hdc, LDetails, pRect, nil); finally RestoreDC(hdc, SaveIndex); end; Exit(S_OK); end; BP_COMMANDLINK : begin case iStateId of CMDLS_NORMAL : LDetails := StyleServices.GetElementDetails(tbPushButtonNormal); CMDLS_HOT : LDetails := StyleServices.GetElementDetails(tbPushButtonHot); CMDLS_PRESSED : LDetails := StyleServices.GetElementDetails(tbPushButtonPressed); CMDLS_DISABLED : LDetails := StyleServices.GetElementDetails(tbPushButtonDisabled); CMDLS_DEFAULTED : LDetails := StyleServices.GetElementDetails(tbPushButtonDefaulted); CMDLS_DEFAULTED_ANIMATING : LDetails := StyleServices.GetElementDetails(tbPushButtonDefaultedAnimating); end; SaveIndex := SaveDC(hdc); try if hwnd<>0 then DrawStyleParentBackground(hwnd, hdc, pRect); StyleServices.DrawElement(hdc, LDetails, pRect, nil); finally RestoreDC(hdc, SaveIndex); end; Exit(S_OK); end; BP_COMMANDLINKGLYPH : begin case iStateId of CMDLGS_NORMAL : LDetails := StyleServices.GetElementDetails(tbCommandLinkGlyphNormal); CMDLGS_HOT : LDetails := StyleServices.GetElementDetails(tbCommandLinkGlyphHot); CMDLGS_PRESSED : LDetails := StyleServices.GetElementDetails(tbCommandLinkGlyphPressed); CMDLGS_DISABLED : LDetails := StyleServices.GetElementDetails(tbCommandLinkGlyphDisabled); CMDLGS_DEFAULTED: LDetails := StyleServices.GetElementDetails(tbCommandLinkGlyphDefaulted); end; SaveIndex := SaveDC(hdc); try if hwnd<>0 then DrawStyleParentBackground(hwnd, hdc, pRect); StyleServices.DrawElement(hdc, LDetails, pRect, nil); finally RestoreDC(hdc, SaveIndex); end; Exit(S_OK); end; BP_RADIOBUTTON : begin case iStateId of RBS_UNCHECKEDNORMAL : LDetails := StyleServices.GetElementDetails(tbRadioButtonUncheckedNormal); RBS_UNCHECKEDHOT : LDetails := StyleServices.GetElementDetails(tbRadioButtonUncheckedHot); RBS_UNCHECKEDPRESSED : LDetails := StyleServices.GetElementDetails(tbRadioButtonUncheckedPressed); RBS_UNCHECKEDDISABLED : LDetails := StyleServices.GetElementDetails(tbRadioButtonUncheckedDisabled); RBS_CHECKEDNORMAL : LDetails := StyleServices.GetElementDetails(tbRadioButtonCheckedNormal); RBS_CHECKEDHOT : LDetails := StyleServices.GetElementDetails(tbRadioButtonCheckedHot); RBS_CHECKEDPRESSED : LDetails := StyleServices.GetElementDetails(tbRadioButtonCheckedPressed); RBS_CHECKEDDISABLED : LDetails := StyleServices.GetElementDetails(tbRadioButtonCheckedDisabled); end; DrawStyleElement(hdc, LDetails, pRect); Exit(S_OK); end; BP_CHECKBOX : begin case iStateId of CBS_UNCHECKEDNORMAL : LDetails := StyleServices.GetElementDetails(tbCheckBoxUncheckedNormal); CBS_UNCHECKEDHOT : LDetails := StyleServices.GetElementDetails(tbCheckBoxUncheckedHot); CBS_UNCHECKEDPRESSED : LDetails := StyleServices.GetElementDetails(tbCheckBoxUncheckedPressed); CBS_UNCHECKEDDISABLED : LDetails := StyleServices.GetElementDetails(tbCheckBoxUncheckedDisabled); CBS_CHECKEDNORMAL : LDetails := StyleServices.GetElementDetails(tbCheckBoxCheckedNormal); CBS_CHECKEDHOT : LDetails := StyleServices.GetElementDetails(tbCheckBoxCheckedHot); CBS_CHECKEDPRESSED : LDetails := StyleServices.GetElementDetails(tbCheckBoxCheckedPressed); CBS_CHECKEDDISABLED : LDetails := StyleServices.GetElementDetails(tbCheckBoxCheckedDisabled); CBS_MIXEDNORMAL : LDetails := StyleServices.GetElementDetails(tbCheckBoxMixedNormal); CBS_MIXEDHOT : LDetails := StyleServices.GetElementDetails(tbCheckBoxMixedHot); CBS_MIXEDPRESSED : LDetails := StyleServices.GetElementDetails(tbCheckBoxMixedPressed); CBS_MIXEDDISABLED : LDetails := StyleServices.GetElementDetails(tbCheckBoxMixedDisabled); { For Windows >= Vista } CBS_IMPLICITNORMAL : LDetails := StyleServices.GetElementDetails(tbCheckBoxImplicitNormal); CBS_IMPLICITHOT : LDetails := StyleServices.GetElementDetails(tbCheckBoxImplicitHot); CBS_IMPLICITPRESSED : LDetails := StyleServices.GetElementDetails(tbCheckBoxImplicitPressed); CBS_IMPLICITDISABLED : LDetails := StyleServices.GetElementDetails(tbCheckBoxImplicitDisabled); CBS_EXCLUDEDNORMAL : LDetails := StyleServices.GetElementDetails(tbCheckBoxExcludedNormal); CBS_EXCLUDEDHOT : LDetails := StyleServices.GetElementDetails(tbCheckBoxExcludedHot); CBS_EXCLUDEDPRESSED : LDetails := StyleServices.GetElementDetails(tbCheckBoxExcludedPressed); CBS_EXCLUDEDDISABLED : LDetails := StyleServices.GetElementDetails(tbCheckBoxExcludedDisabled); end; DrawStyleElement(hdc, LDetails, pRect); Exit(S_OK); end end; //OutputDebugString(PChar(Format('UxTheme_Button class %s hTheme %d iPartId %d iStateId %d', [THThemesClasses.Items[hTheme],hTheme, iPartId, iStateId]))); Exit(Trampoline(hTheme, hdc, iPartId, iStateId, pRect, Foo)); end; function UxTheme_TaskDialog(hTheme: HTHEME; hdc: HDC; iPartId, iStateId: Integer; const pRect: TRect; Foo: Pointer; Trampoline : TDrawThemeBackground; LThemeClass : string; hwnd : HWND): HRESULT; stdcall; var LStartColor, LEndColor, LColor : TColor; SaveIndex : Integer; LDetails : TThemedElementDetails; LCanvas : TCanvas; begin case iPartId of TDLG_PRIMARYPANEL : begin //LDetails := StyleServices.GetElementDetails(ttdPrimaryPanel); //ttdPrimaryPanel this element is not included in the VCL Styles yet LColor := StyleServices.GetStyleColor(scEdit); if LColor = StyleServices.GetStyleColor(scBorder) then LColor := StyleServices.GetStyleColor(scPanel);//GetShadowColor(LColor, -10); DrawStyleFillRect(hdc, pRect, LColor); Exit(S_OK); end; TDLG_FOOTNOTEPANE, TDLG_SECONDARYPANEL : begin //LDetails := StyleServices.GetElementDetails(tpPanelBackground); //ttdSecondaryPanel this element is not included in the VCL Styles yet StyleServices.GetElementColor(StyleServices.GetElementDetails(tpPanelBackground), ecFillColor, LColor); DrawStyleFillRect(hdc, pRect, LColor); Exit(S_OK); end; TDLG_EXPANDOBUTTON : begin case iStateId of TDLGEBS_NORMAL : LDetails := StyleServices.GetElementDetails(tcpThemedChevronClosedNormal); TDLGEBS_HOVER : LDetails := StyleServices.GetElementDetails(tcpThemedChevronClosedHot); TDLGEBS_PRESSED : LDetails := StyleServices.GetElementDetails(tcpThemedChevronClosedPressed); TDLGEBS_EXPANDEDNORMAL : LDetails := StyleServices.GetElementDetails(tcpThemedChevronOpenedNormal); TDLGEBS_EXPANDEDHOVER : LDetails := StyleServices.GetElementDetails(tcpThemedChevronOpenedHot); TDLGEBS_EXPANDEDPRESSED : LDetails := StyleServices.GetElementDetails(tcpThemedChevronOpenedPressed); end; SaveIndex := SaveDC(hdc); try if (hwnd <> 0) then DrawStyleParentBackground(hwnd, hdc, pRect); StyleServices.DrawElement(hdc, LDetails, pRect, nil); finally RestoreDC(hdc, SaveIndex); end; Exit(S_OK); end; TDLG_FOOTNOTESEPARATOR : begin LStartColor := StyleServices.GetSystemColor(clBtnShadow); LEndColor := StyleServices.GetSystemColor(clBtnHighlight); LCanvas:=TCanvas.Create; SaveIndex := SaveDC(hdc); try LCanvas.Handle:=hdc; LCanvas.Pen.Color:=LStartColor; LCanvas.MoveTo(pRect.Left, pRect.Top); LCanvas.LineTo(pRect.Right, pRect.Top); LCanvas.Pen.Color:=LEndColor; LCanvas.MoveTo(pRect.Left, pRect.Top+1); LCanvas.LineTo(pRect.Right, pRect.Top+1); finally LCanvas.Handle := 0; LCanvas.Free; RestoreDC(hdc, SaveIndex); end; Exit(S_OK); end end; //OutputDebugString(PChar(Format('UxTheme_TaskDialog class %s hTheme %d iPartId %d iStateId %d', [THThemesClasses.Items[hTheme],hTheme, iPartId, iStateId]))); Exit(Trampoline(hTheme, hdc, iPartId, iStateId, pRect, Foo)); end; function UxTheme_ProgressBar(hTheme: HTHEME; hdc: HDC; iPartId, iStateId: Integer; const pRect: TRect; Foo: Pointer; Trampoline : TDrawThemeBackground; LThemeClass : string; hwnd : HWND): HRESULT; stdcall; var LDetails : TThemedElementDetails; SaveIndex : Integer; begin case iPartId of PP_BAR : LDetails := StyleServices.GetElementDetails(tpBar); PP_BARVERT : LDetails := StyleServices.GetElementDetails(tpBarVert); PP_CHUNK : LDetails := StyleServices.GetElementDetails(tpChunk); PP_CHUNKVERT : LDetails := StyleServices.GetElementDetails(tpChunkVert); PP_FILL : if SameText(LThemeClass, VSCLASS_PROGRESS) then LDetails := StyleServices.GetElementDetails(tpChunk)//GetElementDetails(tpChunk);//GetElementDetails(tpFill); not defined else LDetails := StyleServices.GetElementDetails(tpBar); PP_FILLVERT : LDetails := StyleServices.GetElementDetails(tpChunkVert);//GetElementDetails(tpFillVert); not defined // Use the Native PP_PULSEOVERLAY part to get better results. // PP_PULSEOVERLAY : if SameText(THThemesClasses.Items[hTheme], VSCLASS_PROGRESS) then // LDetails := StyleServices.GetElementDetails(tpChunk)//GetElementDetails(tpPulseOverlay); // else // LDetails := StyleServices.GetElementDetails(tpBar); PP_MOVEOVERLAY : if SameText(LThemeClass, VSCLASS_PROGRESS) then LDetails := StyleServices.GetElementDetails(tpMoveOverlay) else LDetails := StyleServices.GetElementDetails(tpChunk); // PP_PULSEOVERLAYVERT : LDetails := StyleServices.GetElementDetails(tpPulseOverlayVert); // PP_MOVEOVERLAYVERT : LDetails := StyleServices.GetElementDetails(tpMoveOverlayVert); PP_TRANSPARENTBAR : LDetails := StyleServices.GetElementDetails(tpBar);//GetElementDetails(tpTransparentBarNormal); not defined PP_TRANSPARENTBARVERT : LDetails := StyleServices.GetElementDetails(tpBarVert);//GetElementDetails(tpTransparentBarVertNormal); not defined else begin //OutputDebugString(PChar(Format('UxTheme_ProgressBar hTheme %d iPartId %d iStateId %d', [hTheme, iPartId, iStateId]))); Exit(Trampoline(hTheme, hdc, iPartId, iStateId, pRect, Foo)); end; end; SaveIndex := SaveDC(hdc); try if hwnd<>0 then DrawStyleParentBackground(hwnd, hdc, pRect); StyleServices.DrawElement(hdc, LDetails, pRect, nil); finally RestoreDC(hdc, SaveIndex); end; Result := S_OK; end; function UxTheme_ScrollBar(hTheme: HTHEME; hdc: HDC; iPartId, iStateId: Integer; const pRect: TRect; Foo: Pointer; Trampoline : TDrawThemeBackground; LThemeClass : string; hwnd : HWND = 0): HRESULT; stdcall; var LDetails : TThemedElementDetails; LScrollDetails: TThemedScrollBar; begin LScrollDetails := tsScrollBarRoot; LDetails.Element := TThemedElement.teScrollBar; LDetails.Part := iPartId; LDetails.State := iStateId; LDetails := StyleServices.GetElementDetails(TThemedScrollBar.tsThumbBtnHorzNormal); case iPartId of SBP_ARROWBTN : begin case iStateId of ABS_UPNORMAL : LScrollDetails := tsArrowBtnUpNormal; ABS_UPHOT : LScrollDetails := tsArrowBtnUpHot; ABS_UPPRESSED : LScrollDetails := tsArrowBtnUpPressed; ABS_UPDISABLED : LScrollDetails := tsArrowBtnUpDisabled; ABS_DOWNNORMAL : LScrollDetails := tsArrowBtnDownNormal; ABS_DOWNHOT : LScrollDetails := tsArrowBtnDownHot; ABS_DOWNPRESSED : LScrollDetails := tsArrowBtnDownPressed; ABS_DOWNDISABLED : LScrollDetails := tsArrowBtnDownDisabled; ABS_LEFTNORMAL : LScrollDetails := tsArrowBtnLeftNormal; ABS_LEFTHOT : LScrollDetails := tsArrowBtnLeftHot; ABS_LEFTPRESSED : LScrollDetails := tsArrowBtnLeftPressed; ABS_LEFTDISABLED : LScrollDetails := tsArrowBtnLeftDisabled; ABS_RIGHTNORMAL : LScrollDetails := tsArrowBtnRightNormal; ABS_RIGHTHOT : LScrollDetails := tsArrowBtnRightHot; ABS_RIGHTPRESSED : LScrollDetails := tsArrowBtnRightPressed; ABS_RIGHTDISABLED : LScrollDetails := tsArrowBtnRightDisabled; ABS_UPHOVER : LScrollDetails := tsArrowBtnUpNormal;//tsArrowBtnUpHover; ABS_DOWNHOVER : LScrollDetails := tsArrowBtnDownNormal;//tsArrowBtnDownHover; ABS_LEFTHOVER : LScrollDetails := tsArrowBtnLeftNormal;//tsArrowBtnLeftHover; ABS_RIGHTHOVER : LScrollDetails := tsArrowBtnRightNormal;//tsArrowBtnRightHover; end; end; SBP_THUMBBTNHORZ: begin case iStateId of SCRBS_NORMAL : LScrollDetails := tsThumbBtnHorzNormal; SCRBS_HOT : LScrollDetails := tsThumbBtnHorzHot; SCRBS_PRESSED : LScrollDetails := tsThumbBtnHorzPressed; SCRBS_DISABLED : LScrollDetails := tsThumbBtnHorzDisabled; SCRBS_HOVER : LScrollDetails := tsThumbBtnHorzNormal; end; end; SBP_THUMBBTNVERT: begin case iStateId of SCRBS_NORMAL : LScrollDetails := tsThumbBtnVertNormal; SCRBS_HOT : LScrollDetails := tsThumbBtnVertHot; SCRBS_PRESSED : LScrollDetails := tsThumbBtnVertPressed; SCRBS_DISABLED : LScrollDetails := tsThumbBtnVertDisabled; SCRBS_HOVER : LScrollDetails := tsThumbBtnVertNormal; end; end; SBP_LOWERTRACKHORZ: begin case iStateId of SCRBS_NORMAL : LScrollDetails := tsLowerTrackHorzNormal; SCRBS_HOT : LScrollDetails := tsLowerTrackHorzHot; SCRBS_PRESSED : LScrollDetails := tsLowerTrackHorzPressed; SCRBS_DISABLED : LScrollDetails := tsLowerTrackHorzDisabled; SCRBS_HOVER : LScrollDetails := tsLowerTrackHorzNormal;//tsLowerTrackHorzHover; //no support for hover end; end; SBP_UPPERTRACKHORZ : begin case iStateId of SCRBS_NORMAL : LScrollDetails := tsUpperTrackHorzNormal; SCRBS_HOT : LScrollDetails := tsUpperTrackHorzHot; SCRBS_PRESSED : LScrollDetails := tsUpperTrackHorzPressed; SCRBS_DISABLED : LScrollDetails := tsUpperTrackHorzDisabled; SCRBS_HOVER : LScrollDetails := tsUpperTrackHorzNormal;//tsUpperTrackHorzHover; //no support for hover end; end; SBP_LOWERTRACKVERT: begin case iStateId of SCRBS_NORMAL : LScrollDetails := tsLowerTrackVertNormal; SCRBS_HOT : LScrollDetails := tsLowerTrackVertHot; SCRBS_PRESSED : LScrollDetails := tsLowerTrackVertPressed; SCRBS_DISABLED : LScrollDetails := tsLowerTrackVertDisabled; SCRBS_HOVER : LScrollDetails := tsLowerTrackVertNormal;//tsLowerTrackVertHover; //no support for hover end; end; SBP_UPPERTRACKVERT: begin case iStateId of SCRBS_NORMAL : LScrollDetails := tsUpperTrackVertNormal; SCRBS_HOT : LScrollDetails := tsUpperTrackVertHot; SCRBS_PRESSED : LScrollDetails := tsUpperTrackVertPressed; SCRBS_DISABLED : LScrollDetails := tsUpperTrackVertDisabled; SCRBS_HOVER : LScrollDetails := tsUpperTrackVertNormal;//tsUpperTrackVertHover; //no support for hover end; end; SBP_SIZEBOX : begin case iStateId of SZB_RIGHTALIGN : LScrollDetails := tsSizeBoxRightAlign; SZB_LEFTALIGN : LScrollDetails := tsSizeBoxLeftAlign; SZB_TOPRIGHTALIGN : LScrollDetails := tsSizeBoxTopRightAlign; SZB_TOPLEFTALIGN : LScrollDetails := tsSizeBoxTopLeftAlign; SZB_HALFBOTTOMRIGHTALIGN : LScrollDetails := tsSizeBoxHalfBottomRightAlign; SZB_HALFBOTTOMLEFTALIGN : LScrollDetails := tsSizeBoxHalfBottomLeftAlign; SZB_HALFTOPRIGHTALIGN : LScrollDetails := tsSizeBoxHalfTopRightAlign; SZB_HALFTOPLEFTALIGN : LScrollDetails := tsSizeBoxHalfTopLeftAlign; end; end; SBP_GRIPPERHORZ : begin case iStateId of SCRBS_NORMAL : LScrollDetails := tsGripperHorzNormal; SCRBS_HOT : LScrollDetails := tsGripperHorzHot; SCRBS_PRESSED : LScrollDetails := tsGripperHorzPressed; SCRBS_DISABLED : LScrollDetails := tsGripperHorzDisabled; SCRBS_HOVER : LScrollDetails := tsGripperHorzHover;//tsGripperHorzHover; //no support for hover end; end; SBP_GRIPPERVERT : begin case iStateId of SCRBS_NORMAL : LScrollDetails := tsGripperVertNormal; SCRBS_HOT : LScrollDetails := tsGripperVertHot; SCRBS_PRESSED : LScrollDetails := tsGripperVertPressed; SCRBS_DISABLED : LScrollDetails := tsGripperVertDisabled; SCRBS_HOVER : LScrollDetails := tsGripperVertNormal;//tsGripperVertHover; //no support for hover end; end; end; LDetails := StyleServices.GetElementDetails(LScrollDetails); if (iPartId=SBP_THUMBBTNHORZ) then StyleServices.DrawElement(hdc, StyleServices.GetElementDetails(tsUpperTrackHorzNormal), pRect, nil) else if (iPartId=SBP_THUMBBTNVERT) then StyleServices.DrawElement(hdc, StyleServices.GetElementDetails(tsUpperTrackVertNormal), pRect, nil); //OutputDebugString(PChar(Format('UxTheme_ScrollBar class %s hTheme %d iPartId %d iStateId %d Left %d Top %d Width %d Height %d', //[THThemesClasses.Items[hTheme],hTheme, iPartId, iStateId, PRect.Left, prect.Top, prect.Width, prect.Height]))); StyleServices.DrawElement(hdc, LDetails, pRect, nil); Exit(S_OK); end; function UxTheme_Edit(hTheme: HTHEME; hdc: HDC; iPartId, iStateId: Integer; const pRect: TRect; Foo: Pointer; Trampoline : TDrawThemeBackground; LThemeClass : string; hwnd : HWND = 0): HRESULT; stdcall; var LDetails : TThemedElementDetails; begin //OutputDebugString(PChar(Format('UxTheme_Edit class %s hTheme %d iPartId %d iStateId %d', [THThemesClasses.Items[hTheme], hTheme, iPartId, iStateId]))); case iPartId of EP_BACKGROUNDWITHBORDER, EP_EDITBORDER_NOSCROLL : begin case iStateId of EPSN_NORMAL : LDetails := StyleServices.GetElementDetails(teEditBorderNoScrollNormal); EPSN_HOT : LDetails := StyleServices.GetElementDetails(teEditBorderNoScrollHot); EPSN_FOCUSED : LDetails := StyleServices.GetElementDetails(teEditBorderNoScrollFocused); EPSN_DISABLED : begin //LDetails := StyleServices.GetElementDetails(teEditBorderNoScrollDisabled); DrawStyleFillRect(hdc, pRect, StyleServices.GetSystemColor(clWindow)); Exit(S_OK); end; end; DrawStyleElement(hdc, LDetails, pRect); Exit(S_OK); end; EP_EDITBORDER_HSCROLL : begin case iStateId of EPSH_NORMAL : LDetails := StyleServices.GetElementDetails(teEditBorderHScrollNormal); EPSH_HOT : LDetails := StyleServices.GetElementDetails(teEditBorderHScrollHot); EPSH_FOCUSED : LDetails := StyleServices.GetElementDetails(teEditBorderHScrollFocused); EPSH_DISABLED : LDetails := StyleServices.GetElementDetails(teEditBorderHScrollDisabled); end; DrawStyleElement(hdc, LDetails, pRect); Exit(S_OK); end; EP_EDITBORDER_VSCROLL : begin case iStateId of EPSV_NORMAL : LDetails := StyleServices.GetElementDetails(teEditBorderVScrollNormal); EPSV_HOT : LDetails := StyleServices.GetElementDetails(teEditBorderVScrollHot); EPSV_FOCUSED : LDetails := StyleServices.GetElementDetails(teEditBorderVScrollFocused); EPSV_DISABLED : LDetails := StyleServices.GetElementDetails(teEditBorderVScrollDisabled); end; DrawStyleElement(hdc, LDetails, pRect); Exit(S_OK); end; EP_EDITBORDER_HVSCROLL : begin case iStateId of EPSHV_NORMAL : LDetails := StyleServices.GetElementDetails(teEditBorderHVScrollNormal); EPSHV_HOT : LDetails := StyleServices.GetElementDetails(teEditBorderHVScrollHot); EPSHV_FOCUSED : LDetails := StyleServices.GetElementDetails(teEditBorderHVScrollFocused); EPSHV_DISABLED : LDetails := StyleServices.GetElementDetails(teEditBorderHVScrollDisabled); end; DrawStyleElement(hdc, LDetails, pRect); Exit(S_OK); end end; //OutputDebugString(PChar(Format('UxTheme_Edit class %s hTheme %d iPartId %d iStateId %d', [THThemesClasses.Items[hTheme],hTheme, iPartId, iStateId]))); Exit(Trampoline(hTheme, hdc, iPartId, iStateId, pRect, Foo)); end; {$IFDEF HOOK_Menu} procedure DrawMenuSpecialChar(DC: HDC; const Sign: Char; DestRect: TRect; const Bold: Boolean = False; const Disabled: Boolean = False); var LogFont: TLogFont; pOldFont: HGDIOBJ; AFont: HFONT; oldColor: COLORREF; OldMode: integer; begin LogFont.lfHeight := DestRect.Height; LogFont.lfWidth := 0; LogFont.lfEscapement := 0; LogFont.lfOrientation := 0; if Bold then LogFont.lfWeight := FW_BOLD else LogFont.lfWeight := FW_NORMAL; LogFont.lfItalic := 0; LogFont.lfUnderline := 0; LogFont.lfStrikeOut := 0; LogFont.lfCharSet := DEFAULT_CHARSET; LogFont.lfOutPrecision := OUT_DEFAULT_PRECIS; LogFont.lfClipPrecision := CLIP_DEFAULT_PRECIS; LogFont.lfQuality := ANTIALIASED_QUALITY;//DEFAULT_QUALITY; LogFont.lfPitchAndFamily := DEFAULT_PITCH; LogFont.lfFaceName := 'Marlett'; if Disabled then oldColor := ColorToRGB(StyleServices.GetStyleFontColor(sfPopupMenuItemTextDisabled)) else oldColor := ColorToRGB(StyleServices.GetStyleFontColor(sfPopupMenuItemTextNormal)); AFont := CreateFontIndirect(LogFont); if AFont <> 0 then try oldColor := SetTextColor(DC, oldColor); pOldFont := SelectObject(DC, AFont); try OldMode := SetBkMode(DC, Transparent); Winapi.Windows.DrawText(DC, Sign, 1, DestRect, DT_LEFT or DT_SINGLELINE); SetBkMode(DC, OldMode); SelectObject(DC, oldColor); finally if pOldFont <> 0 then SelectObject(DC, pOldFont); end; finally DeleteObject(AFont); end; end; function UxTheme_Menu(hTheme: HTHEME; hdc: HDC; iPartId, iStateId: Integer; const pRect: TRect; Foo: Pointer; Trampoline : TDrawThemeBackground; LThemeClass : string; hwnd : HWND): HRESULT; stdcall; var LRect, LRect2 : TRect; LColor : TColor; LPRect : System.Types.PRect; begin case iPartId of MENU_POPUPBORDERS : //OK begin DrawStyleElement(hdc, StyleServices.GetElementDetails(tmPopupBorders), pRect); Exit(S_OK); end; MENU_POPUPITEM : //OK begin case iStateId of MPI_NORMAL : begin DrawStyleElement(hdc, StyleServices.GetElementDetails(tmPopupItemNormal), pRect); Exit(S_OK); end; MPI_HOT : begin DrawStyleElement(hdc, StyleServices.GetElementDetails(tmPopupItemHot), pRect); Exit(S_OK); end; MPI_DISABLED : begin DrawStyleElement(hdc, StyleServices.GetElementDetails(tmPopupItemDisabled), pRect); Exit(S_OK); end; MPI_DISABLEDHOT : begin DrawStyleElement(hdc, StyleServices.GetElementDetails(tmPopupItemHot), pRect); Exit(S_OK); end; end; end; // MENU_BARBACKGROUND : // begin // case iStateId of // MB_ACTIVE : // begin // DrawStyleElement(hdc, StyleServices.GetElementDetails(tmMenuBarBackgroundActive), pRect); // Exit(S_OK); // end; // // MB_INACTIVE : // begin // DrawStyleElement(hdc, StyleServices.GetElementDetails(tmMenuBarBackgroundInactive), pRect); // Exit(S_OK); // end; // end; // end; // // MENU_BARITEM : // begin // case iStateId of // MBI_NORMAL : // begin // DrawStyleElement(hdc, StyleServices.GetElementDetails(tmMenuBarItemNormal), pRect); // Exit(S_OK); // end; // // MBI_HOT : // begin // DrawStyleElement(hdc, StyleServices.GetElementDetails(tmMenuBarItemHot), pRect); // Exit(S_OK); // end; // // MBI_PUSHED : // begin // DrawStyleElement(hdc, StyleServices.GetElementDetails(tmMenuBarItemPushed), pRect); // Exit(S_OK); // end; // // MBI_DISABLED : // begin // DrawStyleElement(hdc, StyleServices.GetElementDetails(tmMenuBarItemDisabled), pRect); // Exit(S_OK); // end; // // MBI_DISABLEDHOT : // begin // DrawStyleElement(hdc, StyleServices.GetElementDetails(tmMenuBarItemDisabledHot), pRect); // Exit(S_OK); // end; // // MBI_DISABLEDPUSHED : // begin // DrawStyleElement(hdc, StyleServices.GetElementDetails(tmMenuBarItemDisabledPushed), pRect); // Exit(S_OK); // end; // end; // end; MENU_POPUPSEPARATOR : //ok begin //W7 Only ?? //DrawStyleElement(hdc, StyleServices.GetElementDetails(tmPopupItemNormal), pRect); DrawStyleElement(hdc, StyleServices.GetElementDetails(tmPopupSeparator), pRect); Exit(S_OK); end; MENU_POPUPGUTTER : begin if Foo<>nil then begin LPRect:=Foo; if (LPRect.Width>0) and (LPRect.Height>0) then begin LRect2:=LPRect^; //DrawStyleParentBackground(hwnd, hdc, LRect2); DrawStyleFillRect(hdc, LRect2, StyleServices.GetSystemColor(clMenu)); //DrawStyleElement(hdc, StyleServices.GetElementDetails(tmPopupBackground), LRect2); Exit(S_OK); end; end; DrawStyleFillRect(hdc, pRect, StyleServices.GetSystemColor(clMenu)); //DrawStyleElement(hdc, StyleServices.GetElementDetails(tmPopupBackground), pRect); Exit(S_OK); end; MENU_POPUPBACKGROUND : begin LPRect:=nil; if Foo<>nil then begin LPRect:=Foo; if (LPRect.Width=0) or (LPRect.Height=0) then LPRect:=nil; end; if LPRect=nil then begin DrawStyleElement(hdc, StyleServices.GetElementDetails(tmPopupBackground), pRect); Exit(S_OK); end else begin LRect2:=LPRect^; //DrawStyleElement(hdc, StyleServices.GetElementDetails(tmPopupBackground), LRect2); //DrawStyleParentBackgroundEx(hwnd, hdc, LRect2); DrawStyleFillRect(hdc, LRect2, StyleServices.GetSystemColor(clMenu)); //Windows Vista - W7 if (TOSVersion.Major=6) and ((TOSVersion.Minor=0) or (TOSVersion.Minor=1)) then SetTextColor(hdc, ColorToRGB(GetStyleMenuTextColor)); Exit(S_OK); end; end; MENU_POPUPSUBMENU : //OK begin case iStateId of MSM_DISABLED, MSM_NORMAL : begin if iStateId=MSM_DISABLED then LColor:= StyleServices.GetStyleFontColor(sfPopupMenuItemTextDisabled) else LColor:= StyleServices.GetStyleFontColor(sfPopupMenuItemTextNormal); LRect:= pRect; LRect.Top := LRect.Top + 3; DrawStyleArrow(hdc, TScrollDirection.sdRight, LRect.Location, 3, LColor); Exit(S_OK); end; end; end; MENU_POPUPCHECKBACKGROUND : begin case iStateId of MCB_DISABLED ://OK begin //DrawStyleElement(hdc, StyleServices.GetElementDetails(tmMenuBarItemNormal), pRect); //DrawStyleFillRect(hdc, pRect, clFuchsia); Exit(S_OK); end; MCB_NORMAL : //OK begin //DrawStyleElement(hdc, StyleServices.GetElementDetails(tmMenuBarItemNormal), pRect); //DrawStyleFillRect(hdc, pRect, clBlue); Exit(S_OK); end; MCB_BITMAP : //OK begin //DrawStyleElement(hdc, StyleServices.GetElementDetails(tmMenuBarItemNormal), pRect); //DrawStyleFillRect(hdc, pRect, clGreen); Exit(S_OK); end; end; end; MENU_POPUPCHECK : begin case iStateId of MC_CHECKMARKNORMAL : //OK begin //DrawStyleFillRect(hdc, pRect, clFuchsia); FontAwesome.DrawChar(hdc, fa_check, pRect, StyleServices.GetSystemColor(clMenuText)); Exit(S_OK); end; MC_CHECKMARKDISABLED : //OK begin //DrawStyleFillRect(hdc, pRect, clBlue); FontAwesome.DrawChar(hdc, fa_check, pRect, StyleServices.GetSystemColor(clGrayText)); Exit(S_OK); end; MC_BULLETNORMAL : //OK begin //DrawStyleFillRect(hdc, pRect, clGreen); FontAwesome.DrawChar(hdc, fa_circle, pRect, StyleServices.GetSystemColor(clMenuText)); Exit(S_OK); end; MC_BULLETDISABLED : //OK begin //DrawStyleFillRect(hdc, pRect, clGreen); FontAwesome.DrawChar(hdc, fa_circle, pRect, StyleServices.GetSystemColor(clGrayText)); Exit(S_OK); end; end; end; MENU_SYSTEMRESTORE : begin case iStateId of MSYSR_NORMAL : begin LRect:=pRect; LRect.Top:= LRect.Top + 3; LRect.Width:=10; LRect.Height:=10; DrawMenuSpecialChar(hdc, MARLETT_RESTORE_CHAR, LRect, False, False); Exit(S_OK); end; MSYSR_DISABLED : begin LRect:=pRect; LRect.Top:= LRect.Top + 3; LRect.Width:=10; LRect.Height:=10; DrawMenuSpecialChar(hdc, MARLETT_RESTORE_CHAR, LRect, False, True); Exit(S_OK); end; end; end; MENU_SYSTEMMINIMIZE : begin case iStateId of MSYSMN_NORMAL : begin LRect:=pRect; LRect.Top:= LRect.Top + 3; LRect.Width:=10; LRect.Height:=10; DrawMenuSpecialChar(hdc, MARLETT_MINIMIZE_CHAR, LRect, False, False); Exit(S_OK); end; MSYSMN_DISABLED : begin LRect:=pRect; LRect.Top:= LRect.Top + 3; LRect.Width:=10; LRect.Height:=10; DrawMenuSpecialChar(hdc, MARLETT_MINIMIZE_CHAR, LRect, False, True); Exit(S_OK); end; end; end; MENU_SYSTEMMAXIMIZE : begin case iStateId of MSYSMX_NORMAL : begin LRect := pRect; LRect.Top := LRect.Top + 3; LRect.Width := 10; LRect.Height := 10; DrawMenuSpecialChar(hdc, MARLETT_MAXIMIZE_CHAR, LRect, False, False); Exit(S_OK); end; MSYSMX_DISABLED : begin LRect := pRect; LRect.Top := LRect.Top + 3; LRect.Width :=10; LRect.Height :=10; DrawMenuSpecialChar(hdc, MARLETT_MAXIMIZE_CHAR, LRect, False, True); Exit(S_OK); end; end; end; MENU_SYSTEMCLOSE : //OK begin case iStateId of MSYSC_NORMAL : begin //DrawStyleElement(hdc, StyleServices.GetElementDetails(tmSystemCloseNormal), pRect); LRect:=pRect; LRect.Top:= LRect.Top + 3; LRect.Width:=10; LRect.Height:=10; DrawMenuSpecialChar(hdc, MARLETT_CLOSE_CHAR, LRect, False, False); Exit(S_OK); end; MSYSC_DISABLED : begin LRect:=pRect; LRect.Top:= LRect.Top + 3; LRect.Width:=10; LRect.Height:=10; DrawMenuSpecialChar(hdc, MARLETT_CLOSE_CHAR, LRect, False, True); Exit(S_OK); end; end; end; end; //OutputDebugString(PChar(Format('UxTheme_Menu class %s hTheme %d iPartId %d iStateId %d', [LThemeClass, hTheme, iPartId, iStateId]))); Exit(Trampoline(hTheme, hdc, iPartId, iStateId, pRect, Foo)); //DrawStyleFillRect(hdc, pRect, clBlue); //Exit(S_OK); end; {$ENDIF} function UxTheme_CommandModule(hTheme: HTHEME; hdc: HDC; iPartId, iStateId: Integer; const pRect: TRect; Foo: Pointer; Trampoline : TDrawThemeBackground; LThemeClass : string; hwnd : HWND): HRESULT; stdcall; var LDetails : TThemedElementDetails; LColor : TColor; LRect : TRect; begin case iPartId of //Top Bar 1 : begin case iStateId of 0: begin DrawStyleElement(hdc, StyleServices.GetElementDetails(tcpThemedHeader), pRect); Exit(S_OK); end; end; end; //Buttons background 3 : begin case iStateId of //normal 1: begin DrawStyleElement(hdc, StyleServices.GetElementDetails(tbPushButtonNormal), pRect); Exit(S_OK); end; //Hot 2: begin //DrawStyleElement(hdc, StyleServices.GetElementDetails(tbPushButtonHot), pRect); LColor := StyleServices.GetSystemColor(clHighlight); DrawStyleElement(hdc, StyleServices.GetElementDetails(tbPushButtonNormal), pRect); LRect:=pRect; InflateRect(LRect, -1, -1); DrawStyleRectangle(hdc, LRect, LColor); //AlphaBlendFillCanvas(hdc, LColor, pRect, 96); Exit(S_OK); end; //pressed 3: begin //DrawStyleElement(hdc, StyleServices.GetElementDetails(tbPushButtonPressed), pRect); LColor := StyleServices.GetSystemColor(clHighlight); //AlphaBlendFillCanvas(hdc, LColor, pRect, 96); DrawStyleElement(hdc, StyleServices.GetElementDetails(tbPushButtonNormal), pRect); LRect:=pRect; InflateRect(LRect, -1, -1); DrawStyleRectangle(hdc, LRect, LColor); Exit(S_OK); end; //focused 4: begin //DrawStyleElement(hdc, StyleServices.GetElementDetails(tbPushButtonDefaulted), pRect); LColor := StyleServices.GetSystemColor(clHighlight); //AlphaBlendFillCanvas(hdc, LColor, pRect, 50); DrawStyleElement(hdc, StyleServices.GetElementDetails(tbPushButtonNormal), pRect); LRect:=pRect; InflateRect(LRect, -1, -1); DrawStyleRectangle(hdc, LRect, LColor); Exit(S_OK); end; end; end; //button with dropdown 4 : begin case iStateId of //normal 1: begin DrawStyleElement(hdc, StyleServices.GetElementDetails(tbPushButtonNormal), pRect); Exit(S_OK); end; //hot 2: begin LColor := StyleServices.GetSystemColor(clHighlight); DrawStyleElement(hdc, StyleServices.GetElementDetails(tbPushButtonNormal), pRect); LRect:=pRect; InflateRect(LRect, -1, -1); DrawStyleRectangle(hdc, LRect, LColor); //AlphaBlendFillCanvas(hdc, LColor, pRect, 96); //DrawStyleElement(hdc, StyleServices.GetElementDetails(tbPushButtonHot), pRect); Exit(S_OK); end; //pressed 3: begin LColor := StyleServices.GetSystemColor(clHighlight); //AlphaBlendFillCanvas(hdc, LColor, pRect, 96); DrawStyleElement(hdc, StyleServices.GetElementDetails(tbPushButtonNormal), pRect); LRect:=pRect; InflateRect(LRect, -1, -1); DrawStyleRectangle(hdc, LRect, LColor); //DrawStyleElement(hdc, StyleServices.GetElementDetails(tbPushButtonPressed), pRect); Exit(S_OK); end; //focused 4: begin LColor := StyleServices.GetSystemColor(clHighlight); DrawStyleElement(hdc, StyleServices.GetElementDetails(tbPushButtonNormal), pRect); LRect:=pRect; InflateRect(LRect, -1, -1); DrawStyleRectangle(hdc, LRect, LColor); //AlphaBlendFillCanvas(hdc, LColor, pRect, 96); //DrawStyleElement(hdc, StyleServices.GetElementDetails(tbPushButtonDefaulted), pRect); Exit(S_OK); end; 5: // hot arrow button begin LColor := StyleServices.GetSystemColor(clHighlight); DrawStyleElement(hdc, StyleServices.GetElementDetails(tbPushButtonNormal), pRect); LRect:=pRect; InflateRect(LRect, -1, -1); DrawStyleRectangle(hdc, LRect, LColor); //AlphaBlendFillCanvas(hdc, LColor, pRect, 96); //DrawStyleElement(hdc, StyleServices.GetElementDetails(tbPushButtonHot), pRect); Exit(S_OK); end; end; end; //arrow button with dropdown - background 5 : begin case iStateId of //normal 1: begin DrawStyleElement(hdc, StyleServices.GetElementDetails(tbPushButtonNormal), pRect); Exit(S_OK); end; //hot on arrow 2: begin //DrawStyleElement(hdc, StyleServices.GetElementDetails(tbPushButtonHot), pRect); LColor := StyleServices.GetSystemColor(clHighlight); //AlphaBlendFillCanvas(hdc, LColor, pRect, 96); DrawStyleElement(hdc, StyleServices.GetElementDetails(tbPushButtonNormal), pRect); LRect:=pRect; InflateRect(LRect, -1, -1); DrawStyleRectangle(hdc, LRect, LColor); Exit(S_OK); end; //pressed arrow (button down) 3: begin //DrawStyleElement(hdc, StyleServices.GetElementDetails(tbPushButtonPressed), pRect); LColor := StyleServices.GetSystemColor(clHighlight); //AlphaBlendFillCanvas(hdc, LColor, pRect, 96); DrawStyleElement(hdc, StyleServices.GetElementDetails(tbPushButtonNormal), pRect); LRect:=pRect; InflateRect(LRect, -1, -1); DrawStyleRectangle(hdc, LRect, LColor); Exit(S_OK); end; //selected 4: begin //DrawStyleElement(hdc, StyleServices.GetElementDetails(tbPushButtonDefaulted), pRect); LColor := StyleServices.GetSystemColor(clHighlight); //AlphaBlendFillCanvas(hdc, LColor, pRect, 50); DrawStyleElement(hdc, StyleServices.GetElementDetails(tbPushButtonNormal), pRect); LRect:=pRect; InflateRect(LRect, -1, -1); DrawStyleRectangle(hdc, LRect, LColor); Exit(S_OK); end; //hot on button 5: begin LColor := StyleServices.GetSystemColor(clHighlight); //AlphaBlendFillCanvas(hdc, LColor, pRect, 96); //DrawStyleElement(hdc, StyleServices.GetElementDetails(tbPushButtonHot), pRect); DrawStyleElement(hdc, StyleServices.GetElementDetails(tbPushButtonNormal), pRect); LRect:=pRect; InflateRect(LRect, -1, -1); DrawStyleRectangle(hdc, LRect, LColor); Exit(S_OK); end; end; end; //dropdown arrow 6 : begin case iStateId of 0: begin LRect:=pRect; LRect.Left := LRect.Left + 5; LRect.Width := LRect.Width + 5; DrawStyleDownArrow(hdc, LRect, GetStyleBtnTextColor); Exit(S_OK); end; //down arrow normal 1: begin LRect:=pRect; LRect.Left := LRect.Left + 2; LRect.Width := LRect.Width + 2; DrawStyleDownArrow(hdc, LRect, GetStyleBtnTextColor); Exit(S_OK); end; end; end; 8 ://arrow button - Top Bar of listview begin case iStateId of //normal 1: begin LRect:=pRect; LRect.Left := LRect.Left + 5; LRect.Width := LRect.Width + 5; DrawStyleDownArrow(hdc, LRect, GetStyleBtnTextColor); Exit(S_OK); end; //hot 2: begin LRect:=pRect; LRect.Left := LRect.Left + 5; LRect.Width := LRect.Width + 5; DrawStyleDownArrow(hdc, LRect, GetStyleBtnTextColor); Exit(S_OK); end; end; end; 9 : //button -Top Bar of listview begin case iStateId of //normal 1: begin DrawStyleElement(hdc, StyleServices.GetElementDetails(tbPushButtonNormal), pRect); Exit(S_OK); end; //hot 2: begin LColor := StyleServices.GetSystemColor(clHighlight); //AlphaBlendFillCanvas(hdc, LColor, pRect, 96); DrawStyleElement(hdc, StyleServices.GetElementDetails(tbPushButtonNormal), pRect); LRect := pRect; InflateRect(LRect, -1, -1); DrawStyleRectangle(hdc, LRect, LColor); Exit(S_OK); end; 3: //pressed arrow (button down) begin LColor := StyleServices.GetSystemColor(clHighlight); //AlphaBlendFillCanvas(hdc, LColor, pRect, 96); DrawStyleElement(hdc, StyleServices.GetElementDetails(tbPushButtonNormal), pRect); LRect := pRect; InflateRect(LRect, -1, -1); DrawStyleRectangle(hdc, LRect, LColor); Exit(S_OK); end; //selected 4: begin LColor := StyleServices.GetSystemColor(clHighlight); //AlphaBlendFillCanvas(hdc, LColor, pRect, 50); DrawStyleElement(hdc, StyleServices.GetElementDetails(tbPushButtonNormal), pRect); LRect := pRect; InflateRect(LRect, -1, -1); DrawStyleRectangle(hdc, LRect, LColor); Exit(S_OK); end; //hot on button 5: begin LColor := StyleServices.GetSystemColor(clHighlight); //AlphaBlendFillCanvas(hdc, LColor, pRect, 96); DrawStyleElement(hdc, StyleServices.GetElementDetails(tbPushButtonNormal), pRect); LRect:=pRect; InflateRect(LRect, -1, -1); DrawStyleRectangle(hdc, LRect, LColor); Exit(S_OK); end; end; end; //Top Bar of listview - background solid color 11 : begin case iStateId of 0: begin LDetails := StyleServices.GetElementDetails(tpPanelBackground); StyleServices.GetElementColor(LDetails, ecFillColor, LColor); DrawStyleFillRect(hdc, pRect, LColor); Exit(S_OK); end; end; end; //Top Bar of listview - backgroundimage 12 : begin case iStateId of 0: begin LDetails := StyleServices.GetElementDetails(tpPanelBackground); StyleServices.GetElementColor(LDetails, ecFillColor, LColor); DrawStyleFillRect(hdc, pRect, LColor); Exit(S_OK); end; end; end; end; //OutputDebugString(PChar(Format('UxTheme_CommandModule class %s hTheme %d iPartId %d iStateId %d', [LThemeClass, hTheme, iPartId, iStateId]))); Exit(Trampoline(hTheme, hdc, iPartId, iStateId, pRect, Foo)); end; function Detour_UxTheme_DrawThemeMain(hTheme: HTHEME; hdc: HDC; iPartId, iStateId: Integer; const pRect: TRect; Foo: Pointer; Trampoline : TDrawThemeBackground): HRESULT; stdcall; var LThemeClass : string; LHWND : HWND; LFuncDrawThemeBackground : TFuncDrawThemeBackground; begin VCLStylesLock.Enter; try if StyleServices.IsSystemStyle or not TSysStyleManager.Enabled then Exit(Trampoline(hTheme, hdc, iPartId, iStateId, pRect, Foo)); if not THThemesClasses.ContainsKey(hTheme) then begin LThemeClass := GetThemeClass(hTheme, iPartId, iStateId); if LThemeClass<>'' then begin THThemesClasses.Add(hTheme, LThemeClass); THThemesHWND.Add(hTheme, 0); end else begin //OutputDebugString(PChar(Format('Detour_UxTheme_DrawThemeMain class %s hTheme %d iPartId %d iStateId %d', [LThemeClass, hTheme, iPartId, iStateId]))); Exit(Trampoline(hTheme, hdc, iPartId, iStateId, pRect, Foo)); end; end else LThemeClass := THThemesClasses.Items[hTheme]; // // DrawStyleFillRect(hdc, pRect, clGray); // Exit(S_OK); LHWND := THThemesHWND.Items[hTheme]; //OutputDebugString(PChar(Format('Detour_UxTheme_DrawThemeMain class %s hTheme %d iPartId %d iStateId %d', [LThemeClass, hTheme, iPartId, iStateId]))); if FuncsDrawThemeBackground.ContainsKey(LThemeClass) then begin LFuncDrawThemeBackground := FuncsDrawThemeBackground.Items[LThemeClass]; Exit(LFuncDrawThemeBackground(hTheme, hdc, iPartId, iStateId, pRect, Foo, Trampoline, LThemeClass, LHWND)); end else begin // OutputDebugString(PChar(Format('Detour_UxTheme_DrawThemeMain class %s hTheme %d iPartId %d iStateId %d', [LThemeClass, hTheme, iPartId, iStateId]))); // DrawStyleFillRect(hdc, pRect, clPurple); // Exit(S_OK); // Exit(Trampoline(hTheme, hdc, iPartId, iStateId, pRect, Foo)); end; finally VCLStylesLock.Leave; end; end; function Detour_UxTheme_DrawThemeBackgroundEx(hTheme: HTHEME; hdc: HDC; iPartId, iStateId: Integer; const pRect: TRect; pOptions: Pointer): HRESULT; stdcall; begin if StyleServices.IsSystemStyle or not TSysStyleManager.Enabled then Exit(Trampoline_UxTheme_DrawThemeBackgroundEx(hTheme, hdc, iPartId, iStateId, pRect, pOptions)) else Exit(Detour_UxTheme_DrawThemeMain(hTheme, hdc, iPartId, iStateId, pRect, pOptions, Trampoline_UxTheme_DrawThemeBackgroundEx)); end; function Detour_UxTheme_DrawThemeBackground(hTheme: HTHEME; hdc: HDC; iPartId, iStateId: Integer; const pRect: TRect; pClipRect: Pointer): HRESULT; stdcall; begin if StyleServices.IsSystemStyle or not TSysStyleManager.Enabled then Exit(Trampoline_UxTheme_DrawThemeBackground(hTheme, hdc, iPartId, iStateId, pRect, pClipRect)) else Exit(Detour_UxTheme_DrawThemeMain(hTheme, hdc, iPartId, iStateId, pRect, pClipRect, Trampoline_UxTheme_DrawThemeBackground)); end; function Detour_UxTheme_DrawThemeEdge(hTheme: HTHEME; hdc: HDC; iPartId, iStateId: Integer; const pDestRect: TRect; uEdge, uFlags: UINT; pContentRect: PRECT): HRESULT; stdcall; begin //OutputDebugString(PChar(Format('Detour_UxTheme_DrawThemeEdge class %s hTheme %d iPartId %d iStateId %d', [THThemesClasses.Items[hTheme],hTheme, iPartId, iStateId]))); Exit(Trampoline_UxTheme_DrawThemeEdge(hTheme, hdc, iPartId, iStateId, pDestRect, uEdge, uFlags, pContentRect)); end; function Detour_UxTheme_GetThemeSysColor(hTheme: HTHEME; iColorId: Integer): COLORREF; stdcall; begin if StyleServices.IsSystemStyle or not TSysStyleManager.Enabled then Result:= Trampoline_UxTheme_GetThemeSysColor(hTheme, iColorId) else Result:= StyleServices.GetSystemColor(iColorId or Integer($FF000000)); end; function Detour_UxTheme_GetThemeSysColorBrush(hTheme: HTHEME; iColorId: Integer): HBRUSH; stdcall; begin //OutputDebugString(PChar(Format('GetThemeSysColorBrush hTheme %d iColorId %d', [hTheme, iColorId]))); Exit(Trampoline_UxTheme_GetThemeSysColorBrush(hTheme, iColorId)); end; { Doesn't affect Menus colors Doesn't affect Compressed files font color (blue) } function Detour_UxTheme_GetThemeColor(hTheme: HTHEME; iPartId, iStateId, iPropId: Integer; var pColor: COLORREF): HRESULT; stdcall; var LThemeClass : string; LColor : TColor; begin VCLStylesLock.Enter; try if StyleServices.IsSystemStyle or not TSysStyleManager.Enabled or not THThemesClasses.ContainsKey(hTheme) then Exit(Trampoline_UxTheme_GetThemeColor(hTheme, iPartId, iStateId, iPropId, pColor)); LThemeClass:=THThemesClasses.Items[hTheme]; finally VCLStylesLock.Leave; end; case iPropId of TMT_TEXTCOLOR : if not SameText(LThemeClass, VSCLASS_TASKDIALOGSTYLE) then begin Result:=Trampoline_UxTheme_GetThemeColor(hTheme, iPartId, iStateId, iPropId, pColor); if (Result = S_OK) and (@Trampoline_user32_GetSysColor <> nil) then begin //OutputDebugString(PChar(Format('Intercepted Detour_GetThemeColor Class %s hTheme %d iPartId %d iStateId %d iPropId %d Color %8.x', [LThemeClass, hTheme, iPartId, iStateId, iPropId, pColor]))); //pColor := ColorToRGB(clRed); pColor := ColorToRGB(StyleServices.GetSystemColor(clWindowText)); Exit(S_OK); end; end; end; //Debug Output: Detour_GetThemeColor Class Communications::Rebar hTheme 65566 iPartId 0 iStateId 0 iPropId 3803 Color FAFAFA Process ThemedSysControls.exe (13176) //Debug Output: Detour_GetThemeColor Class TryHarder hTheme 65579 iPartId 1 iStateId 1 iPropId 3803 Color 5B391E Process ThemedSysControls.exe (13176) //Debug Output: Detour_GetThemeColor Class CONTROLPANELSTYLE hTheme 65569 iPartId 7 iStateId 1 iPropId 3803 Color CC6600 Process ThemedSysControls.exe (13176) //Debug Output: Intercepted Detour_GetThemeColor Class CPLCommandModule::CommandModule hTheme 65575 iPartId 3 iStateId 1 iPropId 3803 Color 0 Process ThemedSysControls.exe (14304) //Debug Output: Intercepted Detour_GetThemeColor Class InfoBar hTheme 65576 iPartId 2 iStateId 1 iPropId 3803 Color 0 Process ThemedSysControls.exe (14304) //OutputDebugString(PChar(Format('Detour_GetThemeColor Class %s hTheme %d iPartId %d iStateId %d iPropId %d Color %8.x', [LThemeClass, hTheme, iPartId, iStateId, iPropId, pColor]))); if LThemeClass<>'' then begin if SameText(LThemeClass, 'Tooltip') then begin pColor:=clNone; case iPartId of 4 : case iStateId of 0 : pColor:= ColorToRGB(StyleServices.GetSystemColor(clHighlight)); end; end; if TColor(pColor)=clNone then begin Result:=Trampoline_UxTheme_GetThemeColor(hTheme, iPartId, iStateId, iPropId, pColor); //OutputDebugString(PChar(Format('Detour_GetThemeColor Class %s hTheme %d iPartId %d iStateId %d iPropId %d Color %8.x', [LThemeClass, hTheme, iPartId, iStateId, iPropId, pColor]))); end else Result := S_OK; end ELSE if SameText(LThemeClass, VSCLASS_CONTROLPANELSTYLE) then begin pColor:=clNone; // case iPartId of // EP_EDITTEXT : // case iStateId of // ETS_CUEBANNER : pColor:= ColorToRGB(StyleServices.GetSystemColor(clWindowText)); // end; // end; if TColor(pColor)=clNone then begin Result:=Trampoline_UxTheme_GetThemeColor(hTheme, iPartId, iStateId, iPropId, pColor); //OutputDebugString(PChar(Format('Detour_GetThemeColor Class %s hTheme %d iPartId %d iStateId %d iPropId %d Color %8.x', [LThemeClass, hTheme, iPartId, iStateId, iPropId, pColor]))); end else Result := S_OK; end else if SameText(LThemeClass, VSCLASS_EDIT) then begin pColor:=clNone; case iPartId of EP_EDITTEXT : case iStateId of ETS_CUEBANNER : pColor:= ColorToRGB(StyleServices.GetSystemColor(clWindowText)); end; end; if TColor(pColor)=clNone then begin Result:=Trampoline_UxTheme_GetThemeColor(hTheme, iPartId, iStateId, iPropId, pColor); //OutputDebugString(PChar(Format('Detour_GetThemeColor Class %s hTheme %d iPartId %d iStateId %d iPropId %d Color %8.x', [LThemeClass, hTheme, iPartId, iStateId, iPropId, pColor]))); end else Result := S_OK; end else if SameText(LThemeClass, VSCLASS_TRYHARDER) then begin pColor:=clNone; case iPartId of 0 : case iStateId of 0 : pColor:= ColorToRGB(StyleServices.GetSystemColor(clWindowText)); end; 1 : case iStateId of 1 : pColor:= ColorToRGB(StyleServices.GetSystemColor(clWindowText)); end; end; if TColor(pColor)=clNone then begin Result:=Trampoline_UxTheme_GetThemeColor(hTheme, iPartId, iStateId, iPropId, pColor); //OutputDebugString(PChar(Format('Detour_GetThemeColor Class %s hTheme %d iPartId %d iStateId %d iPropId %d Color %8.x', [LThemeClass, hTheme, iPartId, iStateId, iPropId, pColor]))); end else Result := S_OK; end else if SameText(LThemeClass, VSCLASS_MENU) then begin pColor:=clNone; // case iPartId of // // MENU_BARITEM : // case iStateId of // 0 : pColor:= ColorToRGB(clRed);//ColorToRGB(StyleServices.GetSystemColor(clBtnText)); // end; // // MENU_POPUPBACKGROUND : // case iStateId of // 0 : pColor:= ColorToRGB(clGreen);//ColorToRGB(StyleServices.GetSystemColor(clBtnText)); // end; // // MENU_POPUPITEM : // case iStateId of // 0 : pColor:= ColorToRGB(clFuchsia);//ColorToRGB(StyleServices.GetSystemColor(clBtnText)); // end; // // end; if TColor(pColor) = clNone then begin Result := Trampoline_UxTheme_GetThemeColor(hTheme, iPartId, iStateId, iPropId, pColor); //OutputDebugString(PChar(Format('Detour_GetThemeColor Class %s hTheme %d iPartId %d iStateId %d iPropId %d Color %8.x', [LThemeClass, hTheme, iPartId, iStateId, iPropId, pColor]))); end else Result := S_OK; end else if SameText(VSCLASS_SEARCHEDITBOX, LThemeClass) then begin pColor := clNone; case iPartId of 1 : case iStateId of 2 : pColor:= ColorToRGB(StyleServices.GetSystemColor(clWindowText)); end; end; if TColor(pColor)=clNone then begin Result := Trampoline_UxTheme_GetThemeColor(hTheme, iPartId, iStateId, iPropId, pColor); //OutputDebugString(PChar(Format('Detour_GetThemeColor Class %s hTheme %d iPartId %d iStateId %d iPropId %d Color %8.x', [LThemeClass, hTheme, iPartId, iStateId, iPropId, pColor]))); end else Result := S_OK; end else if SameText(LThemeClass, VSCLASS_TOOLTIP) then begin pColor:=clNone; case iPartId of TTP_STANDARD : case iStateId of 0 : pColor:= ColorToRGB(StyleServices.GetSystemColor(clBtnText)); end; end; if TColor(pColor)=clNone then begin Result:=Trampoline_UxTheme_GetThemeColor(hTheme, iPartId, iStateId, iPropId, pColor); //OutputDebugString(PChar(Format('Detour_GetThemeColor Class %s hTheme %d iPartId %d iStateId %d iPropId %d Color %8.x', [LThemeClass, hTheme, iPartId, iStateId, iPropId, pColor]))); end else Result := S_OK; end else if SameText(LThemeClass, VSCLASS_TEXTSTYLE) then begin pColor:=clNone; case iPartId of TEXT_MAININSTRUCTION : case iStateId of 0 : begin pColor:= ColorToRGB(StyleServices.GetSystemColor(clHighlightText)); end; end; end; if TColor(pColor) = clNone then begin Result := Trampoline_UxTheme_GetThemeColor(hTheme, iPartId, iStateId, iPropId, pColor); //OutputDebugString(PChar(Format('Detour_GetThemeColor Class %s hTheme %d iPartId %d iStateId %d iPropId %d Color %8.x', [LThemeClass, hTheme, iPartId, iStateId, iPropId, pColor]))); end else Result := S_OK; end else {$IFDEF HOOK_ListView} if (SameText(LThemeClass, VSCLASS_HEADER) or SameText(LThemeClass, VSCLASS_ITEMSVIEW_HEADER)) then begin pColor:=clNone; case iPartId of HP_HEADERITEM : case iStateId of 0 : pColor:= ColorToRGB(StyleServices.GetSystemColor(clBtnText)); end; end; if TColor(pColor)=clNone then begin Result:=Trampoline_UxTheme_GetThemeColor(hTheme, iPartId, iStateId, iPropId, pColor); //OutputDebugString(PChar(Format('Detour_GetThemeColor Class %s hTheme %d iPartId %d iStateId %d iPropId %d Color %8.x', [LThemeClass, hTheme, iPartId, iStateId, iPropId, pColor]))); end else Result := S_OK; end else {$ENDIF} {$IFDEF HOOK_PreviewPane} if SameText(LThemeClass, VSCLASS_READINGPANE) then begin pColor:=clNone; case iPartId of 1 : //preview background case iStateId of 0 : pColor:= ColorToRGB(StyleServices.GetSystemColor(clWindow)); end; 2 : //preview text case iStateId of 0 : pColor:= ColorToRGB(StyleServices.GetSystemColor(clWindowText)); end; end; if TColor(pColor) = clNone then begin Result:=Trampoline_UxTheme_GetThemeColor(hTheme, iPartId, iStateId, iPropId, pColor); //OutputDebugString(PChar(Format('Detour_GetThemeColor Class %s hTheme %d iPartId %d iStateId %d iPropId %d Color %8.x', [LThemeClass, hTheme, iPartId, iStateId, iPropId, pColor]))); end else Result := S_OK; end else if SameText(LThemeClass, VSCLASS_PREVIEWPANE) then begin pColor := clNone; case iPartId of 5 : case iStateId of 0 : ColorToRGB(StyleServices.GetSystemColor(clHighlight)); end; 6 : case iStateId of 0 : pColor:= ColorToRGB(StyleServices.GetSystemColor(clBtnText)); end; 7 : case iStateId of 1 : pColor:= GetStyleHighLightColor(); 2 : pColor:= ColorToRGB(clGreen); end; 8 : case iStateId of 0 : pColor:= ColorToRGB(clRed); end; 9 : case iStateId of 1 : pColor:= ColorToRGB(clBlue); 2 : pColor:= ColorToRGB(clYellow); end; end; if TColor(pColor) = clNone then begin Result := Trampoline_UxTheme_GetThemeColor(hTheme, iPartId, iStateId, iPropId, pColor); //OutputDebugString(PChar(Format('Detour_GetThemeColor Class %s hTheme %d iPartId %d iStateId %d iPropId %d Color %8.x', [LThemeClass, hTheme, iPartId, iStateId, iPropId, pColor]))); end else Result := S_OK; end else {$ENDIF} {$IFDEF HOOK_TaskDialog} if SameText(LThemeClass, VSCLASS_TASKDIALOGSTYLE) then begin pColor := clNone; case iPartId of TDLG_MAININSTRUCTIONPANE : begin pColor := ColorToRGB(GetStyleHighLightColor()); if StyleServices.GetStyleColor(scEdit) = StyleServices.GetStyleColor(scBorder) then pColor := ColorToRGB(StyleServices.GetSystemColor(clBtnText)); end; TDLG_CONTENTPANE : begin pColor := ColorToRGB(StyleServices.GetSystemColor(clWindowText)); if StyleServices.GetStyleColor(scEdit)=StyleServices.GetStyleColor(scBorder) then pColor := ColorToRGB(StyleServices.GetSystemColor(clBtnText)); end; TDLG_EXPANDOTEXT, TDLG_EXPANDEDFOOTERAREA, TDLG_FOOTNOTEPANE, TDLG_VERIFICATIONTEXT, //TDLG_RADIOBUTTONPANE, TDLG_EXPANDEDCONTENT : begin pColor := ColorToRGB(StyleServices.GetSystemColor(clWindowText)); if StyleServices.GetStyleColor(scEdit)=StyleServices.GetStyleColor(scBorder) then pColor := ColorToRGB(StyleServices.GetSystemColor(clBtnText)); end; end; if TColor(pColor) = clNone then begin Result := Trampoline_UxTheme_GetThemeColor(hTheme, iPartId, iStateId, iPropId, pColor); //OutputDebugString(PChar(Format('Detour_GetThemeColor Class %s hTheme %d iPartId %d iStateId %d iPropId %d Color %8.x', [LThemeClass, hTheme, iPartId, iStateId, iPropId, pColor]))); end else Result := S_OK; end else {$ENDIF} {$IFDEF HOOK_TreeView} if SameText(LThemeClass, VSCLASS_TREEVIEW) or SameText(LThemeClass, VSCLASS_PROPERTREE) then begin pColor:=clNone; case iPartId of 0, 2 : case iStateId of 0 : pColor:= ColorToRGB(StyleServices.GetSystemColor(clWindow));//OK end; end; if TColor(pColor)=clNone then begin Result:=Trampoline_UxTheme_GetThemeColor(hTheme, iPartId, iStateId, iPropId, pColor); //OutputDebugString(PChar(Format('Detour_GetThemeColor Class %s hTheme %d iPartId %d iStateId %d iPropId %d Color %8.x', [LThemeClass, hTheme, iPartId, iStateId, iPropId, pColor]))); end else Result := S_OK; end else {$ENDIF} {$IFDEF HOOK_ListView} if (SameText(LThemeClass, VSCLASS_ITEMSVIEW) or SameText(LThemeClass, VSCLASS_LISTVIEW) or SameText(LThemeClass, VSCLASS_LISTVIEWSTYLE) or SameText(LThemeClass, VSCLASS_ITEMSVIEW_LISTVIEW) or SameText(LThemeClass, VSCLASS_EXPLORER_LISTVIEW)) then begin pColor:=clNone; case iPartId of 0 : case iStateId of 0 : pColor:= ColorToRGB(StyleServices.GetSystemColor(clWindow)); end; LVP_LISTITEM : case iStateId of 0 : pColor:= ColorToRGB(ClRed); end; LVP_LISTSORTEDDETAIL : case iStateId of 1 : pColor:= ColorToRGB(StyleServices.GetSystemColor(clWindowText)); //normal main column (name) 2 : pColor:= ColorToRGB(clWindowText); //SELECTED 3 : pColor:= ColorToRGB(StyleServices.GetSystemColor(clWindowText)); //hot text 4 : pColor:= ColorToRGB(StyleServices.GetSystemColor(clWindowText)); 5 : pColor:= ColorToRGB(clBlue); 6 : pColor:= ColorToRGB(clYellow); 7 : pColor:= ColorToRGB(clGreen); 8 : pColor:= ColorToRGB(clFuchsia); end; LVP_EMPTYTEXT : case iStateId of 0 : pColor:= ColorToRGB(StyleServices.GetSystemColor(clHighlight)); end; LVP_GROUPHEADER : case iStateId of 0 : pColor:= ColorToRGB(StyleServices.GetSystemColor(clWindowText)); end; end; if TColor(pColor)=clNone then begin //OutputDebugString(PChar(Format('Detour_GetThemeColor Class %s hTheme %d iPartId %d iStateId %d iPropId %d Color %8.x', [LThemeClass, hTheme, iPartId, iStateId, iPropId, pColor]))); Result:=Trampoline_UxTheme_GetThemeColor(hTheme, iPartId, iStateId, iPropId, pColor); end else Result:= S_OK; end else {$ENDIF} {$IFDEF HOOK_CommandModule} if SameText(LThemeClass, VSCLASS_COMMANDMODULE) or SameText(LThemeClass, VSCLASS_CPLCOMMANDMODULE) then begin pColor:=clNone; case iPartId of //button with dropdown 3 : case iStateId of 1 : pColor:= ColorToRGB(GetStyleBtnTextColor);//GetStyleHighLightColor; 6 : pColor:= ColorToRGB(clYellow);//StyleServices.GetSystemColor(clBtnShadow); end; 4 : case iStateId of 1 : pColor:= ColorToRGB(GetStyleBtnTextColor); end; 9 : case iStateId of 1 : pColor:= ColorToRGB(GetStyleBtnTextColor);//ColorToRGB(StyleServices.GetSystemColor(clBtnText)); //Highlight 2 : pColor:= ColorToRGB(GetStyleBtnTextColor);//ColorToRGB(StyleServices.GetSystemColor(clBtnText)); //OK 3 : pColor:= ColorToRGB(GetStyleBtnTextColor);//ColorToRGB(StyleServices.GetSystemColor(clBtnText)); //OK 6 : pColor:= ColorToRGB(clLime);//StyleServices.GetSystemColor(clBtnShadow); end; //header text 10 : case iStateId of 1 : pColor:= ColorToRGB(GetStyleHighLightColor); end; end; Result := S_OK; //if pColor=clNone then //OutputDebugString(PChar(Format('Detour_GetThemeColor Class %s hTheme %d iPartId %d iStateId %d iPropId %d Color %8.x', [LThemeClass, hTheme, iPartId, iStateId, iPropId, pColor]))); end else {$ENDIF} begin Result:=Trampoline_UxTheme_GetThemeColor(hTheme, iPartId, iStateId, iPropId, pColor); //pColor:=ColorToRGB(clRed); //Result := S_OK; //OutputDebugString(PChar(Format('Detour_GetThemeColor Class %s hTheme %d iPartId %d iStateId %d iPropId %d Color %8.x', [LThemeClass, hTheme, iPartId, iStateId, iPropId, pColor]))); end; end else begin Result:=Trampoline_UxTheme_GetThemeColor(hTheme, iPartId, iStateId, iPropId, pColor); //OutputDebugString(PChar(Format('Detour_GetThemeColor hTheme %d iPartId %d iStateId %d Color %8.x', [hTheme, iPartId, iStateId, pColor]))); //OutputDebugString2(Format('Detour_GetThemeColor hTheme %d iPartId %d iStateId %d Color %8.x', [hTheme, iPartId, iStateId, pColor])); end; end; procedure _DrawControlText(Canvas: TCanvas; const S: string; var R: TRect; Flags: Cardinal; ThemeTextColor: TColor); var TextFormat: TTextFormatFlags; begin //Canvas.Font := TWinControlClass(Control).Font; Canvas.Font.Color := ThemeTextColor; TextFormat := TTextFormatFlags(Flags); DrawText(Canvas.Handle, S, Length(S), R, TTextFormatFlags(TextFormat)); end; function Detour_UxTheme_DrawThemeText(hTheme: HTHEME; hdc: HDC; iPartId, iStateId: Integer; pszText: LPCWSTR; iCharCount: Integer; dwTextFlags, dwTextFlags2: DWORD; const pRect: TRect): HRESULT; stdcall; var LThemeClass : string; LThemeClasses : TStrings; LDetails: TThemedElementDetails; ThemeTextColor : TColor; p, SaveIndex : Integer; LCanvas : TCanvas; plf: LOGFONTW; LText : string; LRect : TRect; begin LThemeClasses := TStringList.Create; try VCLStylesLock.Enter; try if StyleServices.IsSystemStyle or not TSysStyleManager.Enabled or (dwTextFlags and DT_CALCRECT <> 0) or not THThemesClasses.ContainsKey(hTheme) then Exit(Trampoline_UxTheme_DrawThemeText(hTheme, hdc, iPartId, iStateId, pszText, iCharCount, dwTextFlags, dwTextFlags2, pRect)); LThemeClass := THThemesClasses.Items[hTheme]; ExtractStrings([';'], [], PChar(LThemeClass), LThemeClasses); // OutputDebugString(PChar(Format('Detour_UxTheme_DrawThemeText hTheme %d iPartId %d iStateId %d text %s %s', [hTheme, iPartId, iStateId, pszText, LThemeClass]))); // if Pos('Search', pszText)>0 then // OutputDebugString(PChar(Format('Detour_UxTheme_DrawThemeText hTheme %d class %s iPartId %d iStateId %d text %s', [hTheme, LThemeClass, iPartId, iStateId, pszText]))); // finally VCLStylesLock.Leave; end; if (LThemeClass <> '') then begin {$IFDEF HOOK_ToolBar} if SameText(LThemeClass, VSCLASS_TOOLBAR) then //OK begin case iPartId of 0 : begin case iStateId of TS_NORMAL : begin ThemeTextColor := StyleServices.GetSystemColor(clWindowText); //StyleServices.GetSystemColor(clBtnText); LDetails := StyleServices.GetElementDetails(ttbButtonNormal); end; TS_HOT : begin //ThemeTextColor := GetStyleHighLightColor(); ThemeTextColor := StyleServices.GetSystemColor(clWindowText); LDetails := StyleServices.GetElementDetails(ttbButtonHot); end; TS_PRESSED : begin //ThemeTextColor := GetStyleHighLightColor(); ThemeTextColor := StyleServices.GetSystemColor(clWindowText); LDetails := StyleServices.GetElementDetails(ttbButtonPressed); end; TS_NEARHOT : begin ThemeTextColor := StyleServices.GetSystemColor(clWindowText);//StyleServices.GetSystemColor(clBtnText); LDetails := StyleServices.GetElementDetails(ttbButtonHot); end; TS_OTHERSIDEHOT : begin ThemeTextColor := StyleServices.GetSystemColor(clWindowText);//GetStyleHighLightColor(); LDetails := StyleServices.GetElementDetails(ttbButtonHot); end; TS_DISABLED : begin ThemeTextColor := StyleServices.GetSystemColor(clGrayText); LDetails := StyleServices.GetElementDetails(ttbButtonDisabled); end; else begin //OutputDebugString(PChar(Format('Detour_UxTheme_DrawThemeTextEx hTheme %d iPartId %d iStateId %d text %s', [hTheme, iPartId, iStateId, pszText]))); Exit(Trampoline_UxTheme_DrawThemeText(hTheme, hdc, iPartId, iStateId, pszText, iCharCount, dwTextFlags, dwTextFlags2, pRect)); end; end; //OutputDebugString(PChar(Format('Detour_UxTheme_DrawThemeText hTheme %d class %s iPartId %d iStateId %d text %s', [hTheme, LThemeClass, iPartId, iStateId, pszText]))); LRect:=pRect; StyleServices.DrawText(hdc, LDetails, string(pszText), LRect, TTextFormatFlags(dwTextFlags), ThemeTextColor); Exit(S_OK); end; else Exit(Trampoline_UxTheme_DrawThemeText(hTheme, hdc, iPartId, iStateId, pszText, iCharCount, dwTextFlags, dwTextFlags2, pRect)); end; end else {$ENDIF} {$IFDEF HOOK_CommandModule} if SameText(LThemeClass, VSCLASS_COMMANDMODULE) then begin //OutputDebugString(PChar(Format('Detour_UxTheme_DrawThemeTextEx hTheme %d iPartId %d iStateId %d text %s', [hTheme, iPartId, iStateId, pszText]))); Exit(Trampoline_UxTheme_DrawThemeText(hTheme, hdc, iPartId, iStateId, pszText, iCharCount, dwTextFlags, dwTextFlags2, pRect)); end else {$ENDIF} {$IFDEF HOOK_Menu} if SameText(LThemeClass, VSCLASS_MENU) then begin case iPartId of MENU_POPUPITEM : begin SaveIndex := SaveDC(hdc); try case iStateId of MPI_NORMAL : LDetails := StyleServices.GetElementDetails(tmPopupItemNormal); MPI_HOT : LDetails := StyleServices.GetElementDetails(tmPopupItemHot); //MPI_PUSHED : LDetails := StyleServices.GetElementDetails(tmMenuBarItemPushed); MPI_DISABLED : LDetails := StyleServices.GetElementDetails(tmPopupItemDisabled); MPI_DISABLEDHOT : LDetails := StyleServices.GetElementDetails(tmPopupItemDisabledHot); //MPI_DISABLEDPUSHED : LDetails := StyleServices.GetElementDetails(tmMenuBarItemDisabledPushed); else LDetails := StyleServices.GetElementDetails(tmPopupItemNormal); end; LRect:=pRect; StyleServices.GetElementColor(LDetails, ecTextColor, ThemeTextColor); LText := string(pszText); StyleServices.DrawText(hdc, LDetails, LText, LRect, TTextFormatFlags(dwTextFlags), ThemeTextColor); Exit(S_OK); finally RestoreDC(hdc, SaveIndex); end; end; MENU_BARITEM : begin SaveIndex := SaveDC(hdc); try case iStateId of MBI_NORMAL : LDetails := StyleServices.GetElementDetails(tmPopupItemNormal); MBI_HOT : LDetails := StyleServices.GetElementDetails(tmMenuBarItemHot); MBI_PUSHED : LDetails := StyleServices.GetElementDetails(tmMenuBarItemPushed); MBI_DISABLED : LDetails := StyleServices.GetElementDetails(tmMenuBarItemDisabled); MBI_DISABLEDHOT : LDetails := StyleServices.GetElementDetails(tmMenuBarItemDisabledHot); MBI_DISABLEDPUSHED : LDetails := StyleServices.GetElementDetails(tmMenuBarItemDisabledPushed); end; LRect:=pRect; StyleServices.DrawText(hdc, LDetails, string(pszText), LRect, TTextFormatFlags(dwTextFlags), ThemeTextColor); Exit(S_OK); finally RestoreDC(hdc, SaveIndex); end; end; else begin //OutputDebugString(PChar(Format('Detour_UxTheme_DrawThemeTextEx hTheme %d iPartId %d iStateId %d text %s', [hTheme, iPartId, iStateId, pszText]))); Exit(Trampoline_UxTheme_DrawThemeText(hTheme, hdc, iPartId, iStateId, pszText, iCharCount, dwTextFlags, dwTextFlags2, pRect)); end; end; end else {$ENDIF} {$IFDEF HOOK_DateTimePicker} if SameText(LThemeClass, VSCLASS_DATEPICKER) then begin case iPartId of DP_DATETEXT : begin case iStateId of DPDT_NORMAL :begin ThemeTextColor := StyleServices.GetSystemColor(clWindowText); LDetails := StyleServices.GetElementDetails(teEditTextNormal); end; DPDT_DISABLED :begin ThemeTextColor := StyleServices.GetSystemColor(clGrayText); LDetails := StyleServices.GetElementDetails(teEditTextDisabled); end; DPDT_SELECTED :begin ThemeTextColor := StyleServices.GetSystemColor(clHighlightText); LDetails := StyleServices.GetElementDetails(tgCellSelected); //Fix issue with selected text color end; end; LRect:=pRect; StyleServices.DrawText(hdc, LDetails, string(pszText), LRect, TTextFormatFlags(dwTextFlags), ThemeTextColor); Exit(S_OK); end; else Exit(Trampoline_UxTheme_DrawThemeText(hTheme, hdc, iPartId, iStateId, pszText, iCharCount, dwTextFlags, dwTextFlags2, pRect)); end; end else if SameText(LThemeClass, VSCLASS_MONTHCAL) then begin case iPartId of MC_TRAILINGGRIDCELLUPPER, MC_GRIDCELLUPPER, MC_GRIDCELL : begin // case iStateId of // MCGCB_SELECTED : LDetails := StyleServices.GetElementDetails(tgCellSelected); // MCGCB_HOT : LDetails := StyleServices.GetElementDetails(tgFixedCellHot); // MCGCB_SELECTEDHOT : LDetails := StyleServices.GetElementDetails(tgCellSelected); // MCGCB_SELECTEDNOTFOCUSED : LDetails := StyleServices.GetElementDetails(tgCellSelected); // MCGCB_TODAY : LDetails := StyleServices.GetElementDetails(tgFixedCellHot); // else // LDetails := StyleServices.GetElementDetails(tgCellNormal); // end; LDetails := StyleServices.GetElementDetails(tgCellNormal); if not StyleServices.GetElementColor(LDetails, ecTextColor, ThemeTextColor) then ThemeTextColor := StyleServices.GetSystemColor(clBtnText); LCanvas := TCanvas.Create; SaveIndex := SaveDC(hdc); try LCanvas.Handle := hdc; ZeroMemory(@plf, SizeOf(plf)); plf.lfHeight := 13; plf.lfCharSet := DEFAULT_CHARSET; StrCopy(plf.lfFaceName, 'Tahoma'); LCanvas.Font.Handle := CreateFontIndirect(plf); LText := string(pszText); p := Pos(Chr($A), LText); if p > 1 then LText := Copy(LText, 1, p-1); LRect := pRect; StyleServices.DrawText(LCanvas.Handle, LDetails, LText, LRect, TTextFormatFlags(dwTextFlags), ThemeTextColor); finally DeleteObject(LCanvas.Font.Handle); LCanvas.Handle := 0; LCanvas.Free; RestoreDC(hdc, SaveIndex); end; //OutputDebugString(PChar(Format('Detour_UxTheme_DrawThemeText hTheme %d iPartId %d iStateId %d text %s', [hTheme, iPartId, iStateId, pszText]))); Exit(S_OK); end; MC_TRAILINGGRIDCELL : begin case iStateId of MCTGC_HOT : LDetails := StyleServices.GetElementDetails(tgFixedCellHot); MCTGC_HASSTATE : LDetails := StyleServices.GetElementDetails(tgCellSelected); MCTGC_HASSTATEHOT : LDetails := StyleServices.GetElementDetails(tgCellSelected); MCTGC_TODAY : LDetails := StyleServices.GetElementDetails(tgFixedCellHot); else LDetails := StyleServices.GetElementDetails(teEditTextDisabled); end; if not StyleServices.GetElementColor(LDetails, ecTextColor, ThemeTextColor) then ThemeTextColor := StyleServices.GetSystemColor(clBtnText); LCanvas := TCanvas.Create; SaveIndex := SaveDC(hdc); try LCanvas.Handle := hdc; ZeroMemory(@plf, SizeOf(plf)); plf.lfHeight := 13; plf.lfCharSet := DEFAULT_CHARSET; StrCopy(plf.lfFaceName, 'Tahoma'); LCanvas.Font.Handle := CreateFontIndirect(plf); LText := string(pszText); p := Pos(Chr($A), LText); if p > 1 then LText:=Copy(LText, 1, p - 1); LRect:=pRect; StyleServices.DrawText(LCanvas.Handle, LDetails, LText, LRect, TTextFormatFlags(dwTextFlags), ThemeTextColor); finally DeleteObject(LCanvas.Font.Handle); LCanvas.Handle := 0; LCanvas.Free; RestoreDC(hdc, SaveIndex); end; Exit(S_OK); end; else begin //OutputDebugString(PChar(Format('Detour_UxTheme_DrawThemeText hTheme %d iPartId %d iStateId %d text %s', [hTheme, iPartId, iStateId, pszText]))); Exit(Trampoline_UxTheme_DrawThemeText(hTheme, hdc, iPartId, iStateId, pszText, iCharCount, dwTextFlags, dwTextFlags2, pRect)); end; end; end else {$ENDIF} {$IFDEF HOOK_Button} if LThemeClasses.IndexOf(VSCLASS_BUTTON)>=0 then //SameText(LThemeClass, VSCLASS_BUTTON) then begin case iPartId of BP_PUSHBUTTON : begin case iStateId of PBS_NORMAL : LDetails := StyleServices.GetElementDetails(tbPushButtonNormal); PBS_HOT : LDetails := StyleServices.GetElementDetails(tbPushButtonHot); PBS_PRESSED : LDetails := StyleServices.GetElementDetails(tbPushButtonPressed); PBS_DISABLED : LDetails := StyleServices.GetElementDetails(tbPushButtonDisabled); PBS_DEFAULTED : LDetails := StyleServices.GetElementDetails(tbPushButtonDefaulted); PBS_DEFAULTED_ANIMATING : LDetails := StyleServices.GetElementDetails(tbPushButtonDefaultedAnimating); end; //StyleServices.DrawText(hdc, LDetails, string(pszText), pRect, dwTextFlags, dwTextFlags2); if not StyleServices.GetElementColor(LDetails, ecTextColor, ThemeTextColor) then ThemeTextColor := StyleServices.GetSystemColor(clBtnText); LRect:=pRect; StyleServices.DrawText(hdc, LDetails, string(pszText), LRect, TTextFormatFlags(dwTextFlags), ThemeTextColor); Exit(S_OK); end; BP_RADIOBUTTON : begin case iStateId of RBS_UNCHECKEDNORMAL : LDetails := StyleServices.GetElementDetails(tbRadioButtonUncheckedNormal); RBS_UNCHECKEDHOT : LDetails := StyleServices.GetElementDetails(tbRadioButtonUncheckedHot); RBS_UNCHECKEDPRESSED : LDetails := StyleServices.GetElementDetails(tbRadioButtonUncheckedPressed); RBS_UNCHECKEDDISABLED : LDetails := StyleServices.GetElementDetails(tbRadioButtonUncheckedDisabled); RBS_CHECKEDNORMAL : LDetails := StyleServices.GetElementDetails(tbRadioButtonCheckedNormal); RBS_CHECKEDHOT : LDetails := StyleServices.GetElementDetails(tbRadioButtonCheckedHot); RBS_CHECKEDPRESSED : LDetails := StyleServices.GetElementDetails(tbRadioButtonCheckedPressed); RBS_CHECKEDDISABLED : LDetails := StyleServices.GetElementDetails(tbRadioButtonCheckedDisabled); end; if not StyleServices.GetElementColor(LDetails, ecTextColor, ThemeTextColor) then ThemeTextColor := StyleServices.GetSystemColor(clBtnText); LRect:=pRect; StyleServices.DrawText(hdc, LDetails, string(pszText), LRect, TTextFormatFlags(dwTextFlags), ThemeTextColor); Exit(S_OK); end; BP_COMMANDLINK : begin case iStateId of CMDLS_NORMAL : LDetails := StyleServices.GetElementDetails(tbPushButtonNormal); CMDLS_HOT : LDetails := StyleServices.GetElementDetails(tbPushButtonHot); CMDLS_PRESSED : LDetails := StyleServices.GetElementDetails(tbPushButtonPressed); CMDLS_DISABLED : LDetails := StyleServices.GetElementDetails(tbPushButtonDisabled); CMDLS_DEFAULTED : LDetails := StyleServices.GetElementDetails(tbPushButtonDefaulted); CMDLS_DEFAULTED_ANIMATING : LDetails := StyleServices.GetElementDetails(tbPushButtonDefaultedAnimating); end; LCanvas:=TCanvas.Create; SaveIndex := SaveDC(hdc); try LCanvas.Handle:=hdc; ZeroMemory(@plf, SizeOf(plf)); plf.lfHeight := 14; plf.lfCharSet := DEFAULT_CHARSET; StrCopy(plf.lfFaceName, 'Tahoma'); LCanvas.Font.Handle := CreateFontIndirect(plf); if not StyleServices.GetElementColor(LDetails, ecTextColor, ThemeTextColor) then ThemeTextColor := StyleServices.GetSystemColor(clBtnText); LRect:=pRect; StyleServices.DrawText(LCanvas.Handle, LDetails, string(pszText), LRect, TTextFormatFlags(dwTextFlags), ThemeTextColor); finally DeleteObject(LCanvas.Font.Handle); LCanvas.Handle := 0; LCanvas.Free; RestoreDC(hdc, SaveIndex); end; Exit(S_OK); end else begin //OutputDebugString(PChar(Format('Detour_UxTheme_DrawThemeText hTheme %d iPartId %d iStateId %d text %s', [hTheme, iPartId, iStateId, pszText]))); Exit(Trampoline_UxTheme_DrawThemeText(hTheme, hdc, iPartId, iStateId, pszText, iCharCount, dwTextFlags, dwTextFlags2, pRect)); end; end; end else {$ENDIF} begin //OutputDebugString(PChar(Format('Detour_UxTheme_DrawThemeText hTheme %d iPartId %d iStateId %d text %s', [hTheme, iPartId, iStateId, pszText]))); Exit(Trampoline_UxTheme_DrawThemeText(hTheme, hdc, iPartId, iStateId, pszText, iCharCount, dwTextFlags, dwTextFlags2, pRect)); end; end else Exit(Trampoline_UxTheme_DrawThemeText(hTheme, hdc, iPartId, iStateId, pszText, iCharCount, dwTextFlags, dwTextFlags2, pRect)); finally LThemeClasses.Free; end; end; function Detour_UxTheme_DrawThemeTextEx(hTheme: HTHEME; hdc: HDC; iPartId: Integer; iStateId: Integer; pszText: LPCWSTR; cchText: Integer; dwTextFlags: DWORD; pRect: PRect; var pOptions: TDTTOpts): HResult; stdcall; var LDetails: TThemedElementDetails; ThemeTextColor : TColor; SaveIndex : Integer; LCanvas : TCanvas; LThemeClass : string; plf: LOGFONTW; begin VCLStylesLock.Enter; try if StyleServices.IsSystemStyle or not TSysStyleManager.Enabled or (dwTextFlags and DT_CALCRECT <> 0) or not THThemesClasses.ContainsKey(hTheme) then Exit(Trampoline_UxTheme_DrawThemeTextEx(hTheme, hdc, iPartId, iStateId, pszText, cchText, dwTextFlags, pRect, pOptions)); LThemeClass:= THThemesClasses.Items[hTheme]; finally VCLStylesLock.Leave; end; if LThemeClass<>'' then begin {$IFDEF HOOK_ListView} if SameText(LThemeClass, VSCLASS_LISTVIEW) or SameText(LThemeClass, VSCLASS_ITEMSVIEW_LISTVIEW) then begin case iPartId of LVP_GROUPHEADER : begin if iStateId=0 then begin LCanvas:=TCanvas.Create; SaveIndex := SaveDC(hdc); try LCanvas.Handle:=hdc; if pOptions.dwFlags AND DTT_FONTPROP <> 0 then begin ZeroMemory(@plf, SizeOf(plf)); plf.lfHeight := 13; plf.lfCharSet := DEFAULT_CHARSET; StrCopy(plf.lfFaceName, 'Tahoma'); LCanvas.Font.Handle := CreateFontIndirect(plf); end; LDetails := StyleServices.GetElementDetails(tlListItemNormal); ThemeTextColor := StyleServices.GetStyleFontColor(sfListItemTextNormal); StyleServices.DrawText(LCanvas.Handle, LDetails, string(pszText), pRect^, TTextFormatFlags(dwTextFlags), ThemeTextColor); finally if pOptions.dwFlags AND DTT_FONTPROP <> 0 then DeleteObject(LCanvas.Font.Handle); LCanvas.Handle := 0; LCanvas.Free; RestoreDC(hdc, SaveIndex); end; Result := S_OK; end else begin //OutputDebugString(PChar(Format('Detour_UxTheme_DrawThemeTextEx hTheme %d iPartId %d iStateId %d text %s', [hTheme, iPartId, iStateId, pszText]))); Exit(Trampoline_UxTheme_DrawThemeTextEx(hTheme, hdc, iPartId, iStateId, pszText, cchText, dwTextFlags, pRect, pOptions)); end; end; else begin //OutputDebugString(PChar(Format('Detour_UxTheme_DrawThemeTextEx hTheme %d iPartId %d iStateId %d text %s', [hTheme, iPartId, iStateId, pszText]))); Exit(Trampoline_UxTheme_DrawThemeTextEx(hTheme, hdc, iPartId, iStateId, pszText, cchText, dwTextFlags, pRect, pOptions)); end; end; end else {$ENDIF} {$IFDEF HOOK_Button} if SameText(LThemeClass, VSCLASS_BUTTON) then begin case iPartId of BP_COMMANDLINK : begin case iStateId of CMDLS_NORMAL : LDetails := StyleServices.GetElementDetails(tbPushButtonNormal); CMDLS_HOT : LDetails := StyleServices.GetElementDetails(tbPushButtonHot); CMDLS_PRESSED : LDetails := StyleServices.GetElementDetails(tbPushButtonPressed); CMDLS_DISABLED : LDetails := StyleServices.GetElementDetails(tbPushButtonDisabled); CMDLS_DEFAULTED : LDetails := StyleServices.GetElementDetails(tbPushButtonDefaulted); CMDLS_DEFAULTED_ANIMATING : LDetails := StyleServices.GetElementDetails(tbPushButtonDefaultedAnimating); end; if not StyleServices.GetElementColor(LDetails, ecTextColor, ThemeTextColor) then ThemeTextColor := StyleServices.GetSystemColor(clBtnText); LCanvas := TCanvas.Create; SaveIndex := SaveDC(hdc); try LCanvas.Handle := hdc; if pOptions.dwFlags AND DTT_FONTPROP <> 0 then begin //GetThemeSysFont(hTheme, pOptions.iFontPropId, plf); // is not working ZeroMemory(@plf, SizeOf(plf)); plf.lfHeight := 13; plf.lfCharSet := DEFAULT_CHARSET; StrCopy(plf.lfFaceName, 'Tahoma'); LCanvas.Font.Handle := CreateFontIndirect(plf); end; StyleServices.DrawText(LCanvas.Handle, LDetails, string(pszText), pRect^, TTextFormatFlags(dwTextFlags), ThemeTextColor); finally if pOptions.dwFlags AND DTT_FONTPROP <> 0 then DeleteObject(LCanvas.Font.Handle); LCanvas.Handle := 0; LCanvas.Free; RestoreDC(hdc, SaveIndex); end; Result := S_OK; end else Result:=Trampoline_UxTheme_DrawThemeTextEx(hTheme, hdc, iPartId, iStateId, pszText, cchText, dwTextFlags, pRect, pOptions); end; end else {$ENDIF} Result:=Trampoline_UxTheme_DrawThemeTextEx(hTheme, hdc, iPartId, iStateId, pszText, cchText, dwTextFlags, pRect, pOptions); end else Result:=Trampoline_UxTheme_DrawThemeTextEx(hTheme, hdc, iPartId, iStateId, pszText, cchText, dwTextFlags, pRect, pOptions); end; {$IF CompilerVersion >= 30} function InterceptCreateOrdinal(const Module : string; MethodName: integer; const InterceptProc: Pointer; ForceLoadModule: Boolean = True; Options: Byte = v1compatibility): Pointer; var pOrgPointer: Pointer; LModule: THandle; begin Result := nil; LModule := GetModuleHandle(PChar(Module)); if (LModule = 0) and ForceLoadModule then LModule := LoadLibrary(PChar(Module)); if LModule <> 0 then begin pOrgPointer := GetProcAddress(LModule, PChar(MethodName)); if Assigned(pOrgPointer) then Result := DDetours.InterceptCreate(pOrgPointer, InterceptProc, Options); end; end; {$IFEND} const themelib = 'uxtheme.dll'; initialization VCLStylesLock := TCriticalSection.Create; THThemesClasses := TDictionary.Create; THThemesHWND := TDictionary.Create; FuncsDrawThemeBackground:= TDictionary.Create(TIStringComparer.Ordinal); if StyleServices.Available then begin {$IFDEF HOOK_InfoBar} FuncsDrawThemeBackground.Add(VSCLASS_INFOBAR, @UxTheme_InfoBar); {$ENDIF} {$IFDEF HOOK_BREADCRUMBAR} FuncsDrawThemeBackground.Add(VSCLASS_BREADCRUMBAR, @UxTheme_BreadCrumBar); {$ENDIF} {$IFDEF HOOK_TRYHARDER} FuncsDrawThemeBackground.Add(VSCLASS_TRYHARDER, @UxTheme_TryHarder); {$ENDIF} {$IFDEF HOOK_Tab} FuncsDrawThemeBackground.Add(VSCLASS_TAB, @UxTheme_Tab); {$ENDIF} {$IFDEF HOOK_ToolTip} FuncsDrawThemeBackground.Add(VSCLASS_TOOLTIP, @UxTheme_ToolTip); {$ENDIF} {$IFDEF HOOK_TrackBar} FuncsDrawThemeBackground.Add(VSCLASS_TRACKBAR, @UxTheme_TrackBar); {$ENDIF} {$IFDEF HOOK_PreviewPane} FuncsDrawThemeBackground.Add(VSCLASS_PREVIEWPANE, @UxTheme_PreviewPane); {$ENDIF} {$IFDEF HOOK_ToolBar} FuncsDrawThemeBackground.Add(VSCLASS_TOOLBAR, @UxTheme_ToolBar); {$ENDIF} {$IFDEF HOOK_AddressBand} FuncsDrawThemeBackground.Add(VSCLASS_ADDRESSBAND, @UxTheme_AddressBand); {$ENDIF} {$IFDEF HOOK_SearchBox} FuncsDrawThemeBackground.Add(VSCLASS_SEARCHBOX, @UxTheme_SearchBox); FuncsDrawThemeBackground.Add(VSCLASS_CompositedSEARCHBOX, @UxTheme_SearchBox); FuncsDrawThemeBackground.Add(VSCLASS_INACTIVESEARCHBOX, @UxTheme_SearchBox); {$ENDIF} {$IFDEF HOOK_CommandModule} FuncsDrawThemeBackground.Add(VSCLASS_COMMANDMODULE, @UxTheme_CommandModule); {$ENDIF} {$IFDEF HOOK_Menu} FuncsDrawThemeBackground.Add(VSCLASS_MENU, @UxTheme_Menu); {$ENDIF} {$IFDEF HOOK_Rebar} FuncsDrawThemeBackground.Add(VSCLASS_REBAR, @UxTheme_Rebar); {$ENDIF} {$IFDEF HOOK_Edit} FuncsDrawThemeBackground.Add(VSCLASS_EDIT, @UxTheme_Edit); {$ENDIF} {$IFDEF HOOK_ListBox} FuncsDrawThemeBackground.Add(VSCLASS_LISTBOX, @UxTheme_ListBox); {$ENDIF} {$IFDEF HOOK_Spin} FuncsDrawThemeBackground.Add(VSCLASS_SPIN, @UxTheme_Spin); {$ENDIF} {$IFDEF HOOK_ComboBox} FuncsDrawThemeBackground.Add(VSCLASS_COMBOBOX, @UxTheme_ComboBox); {$ENDIF} {$IFDEF HOOK_ListView} FuncsDrawThemeBackground.Add(VSCLASS_LISTVIEWPOPUP, @UxTheme_ListViewPopup); FuncsDrawThemeBackground.Add(VSCLASS_HEADER, @UxTheme_Header); FuncsDrawThemeBackground.Add(VSCLASS_ITEMSVIEW_HEADER, @UxTheme_Header); FuncsDrawThemeBackground.Add(VSCLASS_LISTVIEW, @UxTheme_ListView); FuncsDrawThemeBackground.Add(VSCLASS_ITEMSVIEW, @UxTheme_ListView); FuncsDrawThemeBackground.Add(VSCLASS_ITEMSVIEW_LISTVIEW, @UxTheme_ListView); FuncsDrawThemeBackground.Add(VSCLASS_EXPLORER_LISTVIEW, @UxTheme_ListView); {$ENDIF} {$IFDEF HOOK_DateTimePicker} FuncsDrawThemeBackground.Add(VSCLASS_DATEPICKER, @UxTheme_DatePicker); FuncsDrawThemeBackground.Add(VSCLASS_MONTHCAL, @UxTheme_MonthCal); {$ENDIF} {$IFDEF HOOK_Scrollbar} FuncsDrawThemeBackground.Add(VSCLASS_SCROLLBAR, @UxTheme_ScrollBar); {$ENDIF} {$IFDEF HOOK_Progressbar} FuncsDrawThemeBackground.Add(VSCLASS_PROGRESS, @UxTheme_ProgressBar); FuncsDrawThemeBackground.Add(VSCLASS_PROGRESS_INDERTERMINATE, @UxTheme_ProgressBar); {$ENDIF} {$IFDEF HOOK_TaskDialog} FuncsDrawThemeBackground.Add(VSCLASS_TASKDIALOG, @UxTheme_TaskDialog); {$ENDIF} {$IFDEF HOOK_Button} FuncsDrawThemeBackground.Add(VSCLASS_BUTTON, @UxTheme_Button); FuncsDrawThemeBackground.Add('Button-OK;Button', @UxTheme_Button); FuncsDrawThemeBackground.Add('Button-CANCEL;Button', @UxTheme_Button); {$ENDIF} {$IFDEF HOOK_TreeView} FuncsDrawThemeBackground.Add(VSCLASS_TREEVIEW, @UxTheme_TreeView); {$ENDIF} {$IFDEF HOOK_Navigation} if TOSVersion.Check(6, 2) then //Windows 8 FuncsDrawThemeBackground.Add(VSCLASS_NAVIGATION, @UxTheme_Navigation); {$ENDIF} @Trampoline_UxTheme_OpenThemeData := InterceptCreate(themelib, 'OpenThemeData', @Detour_UxTheme_OpenThemeData); {$IF CompilerVersion >= 30} if TOSVersion.Check(10) then begin @Trampoline_UxTheme_OpenThemeDataForDPI := InterceptCreate(themelib, 'OpenThemeDataForDpi', @Detour_UxTheme_OpenThemeDataForDPI); if (@Trampoline_UxTheme_OpenThemeDataForDPI = nil) and (TOSVersion.Build < 15063) then //W10 Creators Update? @Trampoline_UxTheme_OpenThemeDataForDPI := InterceptCreateOrdinal(themelib, 129, @Detour_UxTheme_OpenThemeDataForDPI); end; {$IFEND} @Trampoline_UxTheme_OpenThemeDataEx := InterceptCreate(themelib, 'OpenThemeDataEx', @Detour_UxTheme_OpenThemeDataEx); @Trampoline_UxTheme_DrawThemeBackground := InterceptCreate(themelib, 'DrawThemeBackground', @Detour_UxTheme_DrawThemeBackground); @Trampoline_UxTheme_DrawThemeBackgroundEx := InterceptCreate(themelib, 'DrawThemeBackgroundEx', @Detour_UxTheme_DrawThemeBackgroundEx); @Trampoline_UxTheme_DrawThemeEdge := InterceptCreate(themelib, 'DrawThemeEdge', @Detour_UxTheme_DrawThemeEdge); @Trampoline_UxTheme_DrawThemeText := InterceptCreate(themelib, 'DrawThemeText', @Detour_UxTheme_DrawThemeText); @Trampoline_UxTheme_DrawThemeTextEx := InterceptCreate(themelib, 'DrawThemeTextEx', @Detour_UxTheme_DrawThemeTextEx); @Trampoline_UxTheme_GetThemeSysColor := InterceptCreate(themelib, 'GetThemeSysColor', @Detour_UxTheme_GetThemeSysColor); @Trampoline_UxTheme_GetThemeSysColorBrush := InterceptCreate(themelib, 'GetThemeSysColorBrush', @Detour_UxTheme_GetThemeSysColorBrush); @Trampoline_UxTheme_GetThemeColor := InterceptCreate(themelib, 'GetThemeColor', @Detour_UxTheme_GetThemeColor); end; finalization InterceptRemove(@Trampoline_UxTheme_GetThemeSysColor); InterceptRemove(@Trampoline_UxTheme_GetThemeSysColorBrush); InterceptRemove(@Trampoline_UxTheme_OpenThemeData); {$IF CompilerVersion >= 30} if TOSVersion.Check(10) then InterceptRemove(@Trampoline_UxTheme_OpenThemeDataForDPI); {$IFEND} InterceptRemove(@Trampoline_UxTheme_OpenThemeDataEx); InterceptRemove(@Trampoline_UxTheme_GetThemeColor); InterceptRemove(@Trampoline_UxTheme_DrawThemeBackground); InterceptRemove(@Trampoline_UxTheme_DrawThemeText); InterceptRemove(@Trampoline_UxTheme_DrawThemeTextEx); InterceptRemove(@Trampoline_UxTheme_DrawThemeBackgroundEx); InterceptRemove(@Trampoline_UxTheme_DrawThemeEdge); THThemesClasses.Free; THThemesHWND.Free; FuncsDrawThemeBackground.Free; VCLStylesLock.Free; VCLStylesLock := nil; end.