Files
HeidiSQL/source/vcl-styles-utils/Vcl.Styles.UxTheme.pas

4788 lines
170 KiB
ObjectPascal

// **************************************************************************************************
//
// 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-2020 Rodrigo Ruz V.
// All Rights Reserved.
//
// **************************************************************************************************
unit Vcl.Styles.UxTheme;
{$I VCL.Styles.Utils.inc}
interface
uses
System.Types;
var
Trampoline_user32_GetSysColor: function(nIndex: Integer): DWORD; stdcall;
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
}
uses
DDetours,
System.SyncObjs,
System.SysUtils,
System.Classes,
System.Generics.Collections,
System.Generics.Defaults,
WinApi.Windows,
WinApi.UxTheme,
Vcl.Controls,
Vcl.Graphics,
Vcl.GraphUtil,
Vcl.Themes,
Vcl.Imaging.pngimage,
Vcl.Styles.Utils.Graphics,
{$IF Defined(HOOK_DateTimePicker) or Defined(HOOK_Menu) or Defined(HOOK_SearchBox) or Defined(HOOK_Navigation)}
Vcl.Styles.FontAwesome,
{$ENDIF}
Vcl.Styles.Utils.SysControls,
Vcl.Styles.Utils.Misc;
{$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_SearchBoxComposited = 'SearchBoxComposited::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';
VSCLASS_COMMONITEMSDIALOG = 'CommonItemsDialog';
{$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
TDrawThemeBackground = function(hTheme: hTheme; hdc: hdc; iPartId, iStateId: Integer; const pRect: TRect; Foo: Pointer): HRESULT; stdcall;
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<HTHEME, string>;
THThemesHWND : TDictionary<HTHEME, HWND>;
FuncsDrawThemeBackground : TDictionary<string, TFuncDrawThemeBackground>;
VCLStylesLock : TCriticalSection = nil;
{ Helper methods }
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 := '';
{$IFDEF HOOK_Scrollbar}
hThemeNew := Trampoline_UxTheme_OpenThemeData(0, VSCLASS_SCROLLBAR);
if hThemeNew = hTheme then
exit(VSCLASS_SCROLLBAR)
else
CloseThemeData(hThemeNew);
{$ENDIF}
{$IFDEF HOOK_ListView}
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);
{$ENDIF}
{$IFDEF HOOK_Navigation}
hThemeNew := Trampoline_UxTheme_OpenThemeData(0, VSCLASS_NAVIGATION);
if hThemeNew = hTheme then
exit(VSCLASS_NAVIGATION)
else
CloseThemeData(hThemeNew);
{$ENDIF}
{$IFDEF HOOK_CommandModule}
hThemeNew := Trampoline_UxTheme_OpenThemeData(0, VSCLASS_COMMANDMODULE);
if hThemeNew = hTheme then
exit(VSCLASS_COMMANDMODULE)
else
CloseThemeData(hThemeNew);
{$ENDIF}
{$IFDEF HOOK_Edit}
hThemeNew := Trampoline_UxTheme_OpenThemeData(0, VSCLASS_EDIT);
if hThemeNew = hTheme then
exit(VSCLASS_EDIT)
else
CloseThemeData(hThemeNew);
{$ENDIF}
{$IFDEF HOOK_ListBox}
hThemeNew := Trampoline_UxTheme_OpenThemeData(0, VSCLASS_LISTBOX);
if hThemeNew = hTheme then
exit(VSCLASS_LISTBOX)
else
CloseThemeData(hThemeNew);
{$ENDIF}
{$IF Defined(HOOK_Button) or Defined(HOOK_AllButtons)}
hThemeNew := Trampoline_UxTheme_OpenThemeData(0, VSCLASS_BUTTON);
if hThemeNew = hTheme then
exit(VSCLASS_BUTTON)
else
CloseThemeData(hThemeNew);
{$ENDIF}
{$IFDEF HOOK_Menu}
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);
{$ENDIF}
end;
{$IF CompilerVersion >= 30}
function InterceptCreateOrdinal(const Module: string; MethodName: Integer; const InterceptProc: Pointer;
ForceLoadModule: Boolean = True; const Options: TInterceptOptions = DefaultInterceptOptions): 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
DDetours.InterceptCreate(pOrgPointer, InterceptProc, Result, nil, Options);
end;
end;
{$IFEND}
{$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;
{$ENDIF}
{ General hooks }
function Detour_UxTheme_OpenThemeData(hwnd: hwnd; pszClassList: LPCWSTR): hTheme; stdcall;
begin
if not(ExecutingInMainThread) then
begin
Result := Trampoline_UxTheme_OpenThemeData(hwnd, pszClassList);
exit;
end;
// 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
if not(ExecutingInMainThread) then
begin
Result := Trampoline_UxTheme_OpenThemeDataForDPI(hwnd, pszClassList, dpi);
exit;
end;
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
if not(ExecutingInMainThread) then
begin
Result := Trampoline_UxTheme_OpenThemeDataEx(hwnd, pszClassList, dwFlags);
exit;
end;
// 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 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
begin
Result := Trampoline(hTheme, hdc, iPartId, iStateId, pRect, Foo);
exit;
end;
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
Result := Trampoline(hTheme, hdc, iPartId, iStateId, pRect, Foo);
exit;
end;
end
else
LThemeClass := THThemesClasses.Items[hTheme];
LHWND := THThemesHWND.Items[hTheme];
if FuncsDrawThemeBackground.ContainsKey(LThemeClass) then
begin
LFuncDrawThemeBackground := FuncsDrawThemeBackground.Items[LThemeClass];
Result := LFuncDrawThemeBackground(hTheme, hdc, iPartId, iStateId, pRect, Foo, Trampoline, LThemeClass, LHWND);
end
else
begin
Result := Trampoline(hTheme, hdc, iPartId, iStateId, pRect, Foo);
end;
finally
VCLStylesLock.Leave;
end;
// OutputDebugString(PChar(Format('Detour_UxTheme_DrawThemeMain hTheme %d iPartId %d iStateId %d text %s', [hTheme, iPartId, iStateId, LThemeClass])));
end;
function Detour_UxTheme_DrawThemeBackgroundEx(hTheme: hTheme; hdc: hdc; iPartId, iStateId: Integer; const pRect: TRect;
pOptions: Pointer): HRESULT; stdcall;
begin
if not(ExecutingInMainThread) or 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 not(ExecutingInMainThread) or 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 not(ExecutingInMainThread) or 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;
begin
if not(ExecutingInMainThread) then
exit(Trampoline_UxTheme_GetThemeColor(hTheme, iPartId, iStateId, iPropId, pColor));
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));
// OutputDebugString(PChar(Format('Detour_GetThemeColor Class %s hTheme %d iPartId %d iStateId %d iPropId %d Color %8.x', [LThemeClass, hTheme, iPartId, iStateId, iPropId, pColor])));
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)
if LThemeClass <> '' then
begin
{$IFDEF HOOK_EDIT}
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
{$ENDIF}
{$IFDEF HOOK_TRYHARDER}
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
{$ENDIF}
{$IFDEF HOOK_SearchBox}
if SameText(VSCLASS_SEARCHEDITBOX, LThemeClass) then
begin
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
{$ENDIF}
{$IFDEF HOOK_ToolTip}
if SameText(LThemeClass, VSCLASS_TOOLTIP) then
begin
pColor := clNone;
case iPartId of
TTP_STANDARD:
case iStateId of
0:
pColor := ColorToRGB(StyleServices.GetSystemColor(clBtnText));
end;
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
{$ENDIF}
{$IFDEF HOOK_ComboBox}
if SameText(LThemeClass, 'CFD::ComboBox') then
begin
pColor := clNone;
case iPartId of
9:
case iStateId of
1 : pColor := ColorToRGB(StyleServices.GetSystemColor(clWindow));
2 : 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
{$ENDIF}
{$IFDEF HOOK_Menu}
if SameText(LThemeClass, 'MenuStyle') then
begin
pColor := clNone;
case iPartId of
13:
case iStateId of
0 : pColor := ColorToRGB(StyleServices.GetSystemColor(clBtnFace));
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_VirtualShell}
if SameText(LThemeClass, VSCLASS_SCROLLBAR) then
begin
// Fix a theme issue in Mustangpeak Virtual Shell
pColor := clNone;
case iPartId of
11:
case iStateId of
0 : pColor := ColorToRGB(StyleServices.GetStyleColor(scPanel));
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}
if SameText(LThemeClass, VSCLASS_TEXTSTYLE) then
begin
pColor := clNone;
case iPartId of
TEXT_MAININSTRUCTION:
case iStateId of
0:
pColor := ColorToRGB(StyleServices.GetSystemColor(clHighlightText));
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;
else
pColor := ColorToRGB(clBtnText);
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) or
SameText(LThemeClass, 'ExplorerNavPane') 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;
// 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;
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;
{$IFDEF HOOK_DateTimePicker}p: Integer;{$ENDIF}
SaveIndex: Integer;
LCanvas: TCanvas;
plf: LOGFONTW;
{$IF Defined(HOOK_Menu) or Defined(HOOK_DateTimePicker)}LText: string;{$ENDIF}
LRect: TRect;
begin
if not(ExecutingInMainThread) then
exit(Trampoline_UxTheme_DrawThemeText(hTheme, hdc, iPartId, iStateId, pszText, iCharCount, dwTextFlags,
dwTextFlags2, pRect));
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
Exit(Trampoline_UxTheme_DrawThemeText(hTheme, hdc, iPartId, iStateId, pszText, iCharCount, dwTextFlags, dwTextFlags2, pRect));
{$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_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}
{$IF Defined(HOOK_Button) or Defined(HOOK_AllButtons)}
if {$IFDEF HOOK_AllButtons}(LThemeClasses.IndexOf(VSCLASS_BUTTON) >= 0){$ELSE}False{$ENDIF} or
{$IFDEF HOOK_Button} (SameText(LThemeClass, VSCLASS_BUTTON)) {$ELSE}False{$ENDIF} 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;
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
if not(ExecutingInMainThread) then
Exit(Trampoline_UxTheme_DrawThemeTextEx(hTheme, hdc, iPartId, iStateId, pszText, cchText, dwTextFlags, pRect, pOptions));
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
Exit(Trampoline_UxTheme_DrawThemeTextEx(hTheme, hdc, iPartId, iStateId, pszText, cchText, dwTextFlags, pRect, pOptions));
{$IFDEF HOOK_TreeView}
if SameText(LThemeClass, VSCLASS_TREEVIEW) then
begin
case iPartId of
1 :
begin
if iStateId in [1,2] then
begin
SaveIndex := SaveDC(hdc);
try
LDetails := StyleServices.GetElementDetails(tlListItemNormal);
ThemeTextColor := StyleServices.GetStyleFontColor(sfListItemTextNormal);
if pOptions.dwFlags AND DTT_FONTPROP <> 0 then
begin
LCanvas := TCanvas.Create;
try
LCanvas.Handle := hdc;
ZeroMemory(@plf, SizeOf(plf));
plf.lfHeight := 13;
plf.lfCharSet := DEFAULT_CHARSET;
StrCopy(plf.lfFaceName, 'Tahoma');
LCanvas.Font.Handle := CreateFontIndirect(plf);
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;
end;
end
else
StyleServices.DrawText(hdc, LDetails, string(pszText), pRect^, TTextFormatFlags(dwTextFlags), ThemeTextColor);
finally
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_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}
{$IF Defined(HOOK_Button) or Defined(HOOK_AllButtons)}
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;
{ Element specific handlers }
{$IFDEF HOOK_InfoBar}
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;
{$ENDIF}
{$IFDEF HOOK_BREADCRUMBAR}
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;
{$ENDIF}
{$IFDEF HOOK_TRYHARDER}
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;
{$ENDIF}
{$IFDEF HOOK_Tab}
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;
{$ENDIF}
{$IFDEF HOOK_ListView}
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: 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);
DrawStyleElement(hdc, LDetails, pRect);
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);
DrawStyleElement(hdc, LDetails, pRect);
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_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_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);
DrawStyleElement(hdc, LDetails, pRect);
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;
{$ENDIF}
{$IFDEF HOOK_ToolTip}
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;
{$ENDIF}
{$IFDEF HOOK_TrackBar}
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;
{$ENDIF}
{$IFDEF HOOK_PreviewPane}
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;
{$ENDIF}
{$IFDEF HOOK_ToolBar}
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;
{$ENDIF}
{$IFDEF HOOK_Rebar}
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;
{$ENDIF}
{$IFDEF HOOK_AddressBand}
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;
{$ENDIF}
{$IFDEF HOOK_SearchBox}
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;
{$ENDIF}
{$IFDEF HOOK_DateTimePicker}
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;
{$ENDIF}
{$IFDEF HOOK_ComboBox}
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;
{$ENDIF}
{$IFDEF HOOK_Spin}
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;
{$ENDIF}
{$IFDEF HOOK_ListBox}
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;
{$ENDIF}
{$IFDEF HOOK_Navigation}
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_CommonItemsDialog(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
// background
0:
begin
DrawStyleElement(hdc, StyleServices.GetElementDetails(twWindowRoot), pRect);
exit(S_OK);
end;
end;
end;
end;
// OutputDebugString(PChar(Format('UxTheme_CommonItemsDialog class %s hTheme %d iPartId %d iStateId %d', [LThemeClass, hTheme, iPartId, iStateId])));
exit(Trampoline(hTheme, hdc, iPartId, iStateId, pRect, Foo));
end;
{$ENDIF}
{$IFDEF HOOK_TreeView}
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;
{$ENDIF}
{$IF Defined(HOOK_Button) or Defined(HOOK_AllButtons)}
function UxTheme_Button(hTheme: hTheme; hndc: hdc; iPartId, iStateId: Integer;
const pRect: TRect; Foo: Pointer; Trampoline: TDrawThemeBackground;
LThemeClass: string; hwnd: hwnd): HRESULT; stdcall;
var
LDetails: TThemedElementDetails;
SaveIndex: Integer;
LBtnBmp: TBitmap;
LDC: HDC;
LColor: TColor;
LCanvas: TCanvas;
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(hndc);
try
LBtnBmp := TBitmap.Create;
LCanvas := TCanvas.Create;
try
LCanvas.Handle := hndc;
LBtnBmp.PixelFormat := pf24bit;
LBtnBmp.Transparent := True;
LBtnBmp.SetSize(pRect.Width, pRect.Height);
LDC := LBtnBmp.Canvas.Handle;
LColor := StyleServices.GetSystemColor(clBtnFace);
DrawStyleFillRect(LDC, pRect, LColor);
if hwnd <> 0 then
DrawStyleParentBackground(hwnd, hndc, pRect);
DrawStyleElement(LDC, LDetails, pRect);
LCanvas.Draw(0, 0, LBtnBmp);
finally
LCanvas.Free;
LBtnBmp.Free;
end;
finally
RestoreDC(hndc, 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(hndc);
try
LBtnBmp := TBitmap.Create;
LCanvas := TCanvas.Create;
try
LCanvas.Handle := hndc;
LBtnBmp.PixelFormat := pf24bit;
LBtnBmp.Transparent := True;
LBtnBmp.SetSize(pRect.Width, pRect.Height);
LDC := LBtnBmp.Canvas.Handle;
LColor := StyleServices.GetSystemColor(clBtnFace);
DrawStyleFillRect(LDC, pRect, LColor);
if hwnd <> 0 then
DrawStyleParentBackground(hwnd, hndc, pRect);
DrawStyleElement(LDC, LDetails, pRect);
LCanvas.Draw(0, 0, LBtnBmp);
finally
LCanvas.Free;
LBtnBmp.Free;
end;
finally
RestoreDC(hndc, 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(hndc);
try
if hwnd <> 0 then
DrawStyleParentBackground(hwnd, hndc, pRect);
DrawStyleElement(hndc, LDetails, pRect);
finally
RestoreDC(hndc, 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(hndc, 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(hndc, 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, hndc, iPartId, iStateId, pRect, Foo));
end;
{$ENDIF}
{$IFDEF HOOK_TaskDialog}
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);
DrawStyleElement(hdc, LDetails, pRect);
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;
{$ENDIF}
{$IFDEF HOOK_Progressbar}
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);
DrawStyleElement(hdc, LDetails, pRect);
finally
RestoreDC(hdc, SaveIndex);
end;
Result := S_OK;
end;
{$ENDIF}
{$IFDEF HOOK_Scrollbar}
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
DrawStyleElement(hdc, StyleServices.GetElementDetails(tsUpperTrackHorzNormal), pRect)
else if (iPartId = SBP_THUMBBTNVERT) then
DrawStyleElement(hdc, StyleServices.GetElementDetails(tsUpperTrackVertNormal), pRect);
// 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])));
DrawStyleElement(hdc, LDetails, pRect);
exit(S_OK);
end;
{$ENDIF}
{$IFDEF HOOK_Edit}
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;
{$ENDIF}
{$IFDEF HOOK_Menu}
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}
{$IFDEF HOOK_CommandModule}
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;
{$ENDIF}
const
themelib = 'uxtheme.dll';
initialization
VCLStylesLock := TCriticalSection.Create;
THThemesClasses := TDictionary<hTheme, string>.Create;
THThemesHWND := TDictionary<hTheme, hwnd>.Create;
FuncsDrawThemeBackground := TDictionary<string, TFuncDrawThemeBackground>.Create(TIStringComparer.Ordinal);
if StyleServices.Available then
begin
// Element specific handlers
{$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_SearchBoxComposited, @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);
{$ENDIF}
{$IFDEF HOOK_AllButtons}
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, 10...
begin
FuncsDrawThemeBackground.Add(VSCLASS_NAVIGATION, @UxTheme_Navigation);
FuncsDrawThemeBackground.Add(VSCLASS_COMMONITEMSDIALOG, @UxTheme_CommonItemsDialog);
end;
{$ENDIF}
// General hooks
@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.