source: trunk/Packages/Graphics32/GR32_XPThemes.pas

Last change on this file was 2, checked in by chronos, 5 years ago
File size: 8.5 KB
Line 
1unit GR32_XPThemes;
2
3(* ***** BEGIN LICENSE BLOCK *****
4 * Version: MPL 1.1 or LGPL 2.1 with linking exception
5 *
6 * The contents of this file are subject to the Mozilla Public License Version
7 * 1.1 (the "License"); you may not use this file except in compliance with
8 * the License. You may obtain a copy of the License at
9 * http://www.mozilla.org/MPL/
10 *
11 * Software distributed under the License is distributed on an "AS IS" basis,
12 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
13 * for the specific language governing rights and limitations under the
14 * License.
15 *
16 * Alternatively, the contents of this file may be used under the terms of the
17 * Free Pascal modified version of the GNU Lesser General Public License
18 * Version 2.1 (the "FPC modified LGPL License"), in which case the provisions
19 * of this license are applicable instead of those above.
20 * Please see the file LICENSE.txt for additional information concerning this
21 * license.
22 *
23 * The Original Code is Graphics32
24 *
25 * The Initial Developer of the Original Code is
26 * Alex A. Denisov
27 *
28 * Portions created by the Initial Developer are Copyright (C) 2000-2009
29 * the Initial Developer. All Rights Reserved.
30 *
31 * Contributor(s):
32 * Andre Beckedorf
33 *
34 * ***** END LICENSE BLOCK ***** *)
35
36interface
37
38{$I GR32.inc}
39
40uses
41{$IFDEF FPC}
42 LCLIntf, LCLType,
43 {$IFDEF Windows}
44 Windows,
45 {$ENDIF}
46 {$IFDEF UNIX}
47 Unix, BaseUnix,
48 {$ENDIF}
49{$ELSE}
50 Windows,
51{$ENDIF}
52 SysUtils;
53
54
55{$IFDEF Windows}
56
57{ Internal support for Windows XP themes }
58var
59 USE_THEMES: Boolean = False;
60 SCROLLBAR_THEME: THandle = 0;
61 GLOBALS_THEME: THandle = 0;
62
63const
64 THEMEMGR_VERSION = 1;
65 WM_THEMECHANGED = $031A;
66
67{ "Scrollbar" Parts & States }
68 { SCROLLBARPARTS }
69 SBP_ARROWBTN = 1;
70 SBP_THUMBBTNHORZ = 2;
71 SBP_THUMBBTNVERT = 3;
72 SBP_LOWERTRACKHORZ = 4;
73 SBP_UPPERTRACKHORZ = 5;
74 SBP_LOWERTRACKVERT = 6;
75 SBP_UPPERTRACKVERT = 7;
76 SBP_GRIPPERHORZ = 8;
77 SBP_GRIPPERVERT = 9;
78 SBP_SIZEBOX = 10;
79
80 { ARROWBTNSTATES }
81 ABS_UPNORMAL = 1;
82 ABS_UPHOT = 2;
83 ABS_UPPRESSED = 3;
84 ABS_UPDISABLED = 4;
85 ABS_DOWNNORMAL = 5;
86 ABS_DOWNHOT = 6;
87 ABS_DOWNPRESSED = 7;
88 ABS_DOWNDISABLED = 8;
89 ABS_LEFTNORMAL = 9;
90 ABS_LEFTHOT = 10;
91 ABS_LEFTPRESSED = 11;
92 ABS_LEFTDISABLED = 12;
93 ABS_RIGHTNORMAL = 13;
94 ABS_RIGHTHOT = 14;
95 ABS_RIGHTPRESSED = 15;
96 ABS_RIGHTDISABLED = 16;
97
98 { SCROLLBARSTATES }
99 SCRBS_NORMAL = 1;
100 SCRBS_HOT = 2;
101 SCRBS_PRESSED = 3;
102 SCRBS_DISABLED = 4;
103
104 { SIZEBOXSTATES }
105 SZB_RIGHTALIGN = 1;
106 SZB_LEFTALIGN = 2;
107
108{ Access to uxtheme.dll }
109
110type
111 HIMAGELIST = THandle;
112 HTHEME = THandle;
113 _MARGINS = record
114 cxLeftWidth: Integer; // width of left border that retains its size
115 cxRightWidth: Integer; // width of right border that retains its size
116 cyTopHeight: Integer; // height of top border that retains its size
117 cyBottomHeight: Integer; // height of bottom border that retains its size
118 end;
119 MARGINS = _MARGINS;
120 PMARGINS = ^MARGINS;
121 TMargins = MARGINS;
122
123var
124 OpenThemeData: function(hwnd: HWND; pszClassList: LPCWSTR): HTHEME; stdcall;
125 CloseThemeData: function(hTheme: HTHEME): HRESULT; stdcall;
126 DrawThemeBackground: function(hTheme: HTHEME; hdc: HDC; iPartId, iStateId: Integer;
127 const Rect: TRect; pClipRect: PRect): HRESULT; stdcall;
128 DrawThemeEdge: function(hTheme: HTHEME; hdc: HDC; iPartId, iStateId: Integer; const pDestRect: TRect; uEdge,
129 uFlags: UINT; pContentRect: PRECT): HRESULT; stdcall;
130 GetThemeColor: function(hTheme: HTHEME; iPartId, iStateId, iPropId: Integer; var pColor: COLORREF): HRESULT; stdcall;
131 GetThemeMetric: function(hTheme: HTHEME; hdc: HDC; iPartId, iStateId, iPropId: Integer;
132 var piVal: Integer): HRESULT; stdcall;
133 GetThemeMargins: function(hTheme: HTHEME; hdc: HDC; iPartId, iStateId, iPropId: Integer; prc: PRECT;
134 var pMargins: MARGINS): HRESULT; stdcall;
135 SetWindowTheme: function(hwnd: HWND; pszSubAppName: LPCWSTR; pszSubIdList: LPCWSTR): HRESULT; stdcall;
136 IsThemeActive: function: BOOL; stdcall;
137 IsAppThemed: function: BOOL; stdcall;
138 EnableTheming: function(fEnable: BOOL): HRESULT; stdcall;
139
140{$ENDIF}
141
142implementation
143
144{$IFDEF Windows}
145
146uses
147 Messages, Forms, Classes;
148
149const
150 UXTHEME_DLL = 'uxtheme.dll';
151
152var
153 DllHandle: THandle;
154
155procedure FreeXPThemes;
156begin
157 if DllHandle <> 0 then
158 begin
159 if not IsLibrary then
160 FreeLibrary(DllHandle);
161
162 DllHandle := 0;
163 OpenThemeData := nil;
164 CloseThemeData := nil;
165 DrawThemeBackground := nil;
166 DrawThemeEdge := nil;
167 GetThemeColor := nil;
168 GetThemeMetric := nil;
169 GetThemeMargins := nil;
170 SetWindowTheme := nil;
171 IsThemeActive := nil;
172 IsAppThemed := nil;
173 EnableTheming := nil;
174 end;
175end;
176
177function InitXPThemes: Boolean;
178begin
179 if DllHandle = 0 then
180 begin
181 DllHandle := LoadLibrary(UXTHEME_DLL);
182 if DllHandle > 0 then
183 begin
184 OpenThemeData := GetProcAddress(DllHandle, 'OpenThemeData');
185 CloseThemeData := GetProcAddress(DllHandle, 'CloseThemeData');
186 DrawThemeBackground := GetProcAddress(DllHandle, 'DrawThemeBackground');
187 DrawThemeEdge := GetProcAddress(DllHandle, 'DrawThemeEdge');
188 GetThemeColor := GetProcAddress(DllHandle, 'GetThemeColor');
189 GetThemeMetric := GetProcAddress(DllHandle, 'GetThemeMetric');
190 GetThemeMargins := GetProcAddress(DllHandle, 'GetThemeMargins');
191 SetWindowTheme := GetProcAddress(DllHandle, 'SetWindowTheme');
192 IsThemeActive := GetProcAddress(DllHandle, 'IsThemeActive');
193 IsAppThemed := GetProcAddress(DllHandle, 'IsAppThemed');
194 EnableTheming := GetProcAddress(DllHandle, 'EnableTheming');
195 if (@OpenThemeData = nil) or (@CloseThemeData = nil) or (@IsThemeActive = nil) or
196 (@IsAppThemed = nil) or (@EnableTheming = nil) then FreeXPThemes;
197 end;
198 end;
199 Result := DllHandle > 0;
200end;
201
202function UseXPThemes: Boolean;
203begin
204 Result := (DllHandle > 0) and IsAppThemed and IsThemeActive;
205end;
206
207type
208 TThemeNexus = class
209 private
210 FWindowHandle: HWND;
211 protected
212 procedure WndProc(var Message: TMessage);
213 procedure OpenVisualStyles;
214 procedure CloseVisualStyles;
215 public
216 constructor Create;
217 destructor Destroy; override;
218 end;
219
220{$IFDEF SUPPORT_XPTHEMES}
221{$IFDEF XPTHEMES}
222var
223 ThemeNexus: TThemeNexus;
224{$ENDIF}
225{$ENDIF}
226
227{ TThemeNexus }
228
229constructor TThemeNexus.Create;
230begin
231 FWindowHandle := {$IFDEF FPC}Classes.{$ENDIF}AllocateHWnd(WndProc);
232 OpenVisualStyles;
233end;
234
235destructor TThemeNexus.Destroy;
236begin
237 CloseVisualStyles;
238 {$IFDEF FPC}Classes.{$ENDIF}DeallocateHWnd(FWindowHandle);
239 inherited;
240end;
241
242procedure TThemeNexus.OpenVisualStyles;
243begin
244 USE_THEMES := False;
245 if InitXPThemes then
246 begin
247 USE_THEMES := UseXPThemes;
248 if USE_THEMES then
249 begin
250 SCROLLBAR_THEME := OpenThemeData(FWindowHandle, 'SCROLLBAR');
251 GLOBALS_THEME := OpenThemeData(FWindowHandle, 'GLOBALS');
252 end;
253 end;
254end;
255
256procedure TThemeNexus.CloseVisualStyles;
257begin
258 if not IsLibrary and UseXPThemes then
259 begin
260 if SCROLLBAR_THEME <> 0 then
261 begin
262 CloseThemeData(SCROLLBAR_THEME);
263 SCROLLBAR_THEME := 0;
264 end;
265 if GLOBALS_THEME <> 0 then
266 begin
267 CloseThemeData(GLOBALS_THEME);
268 GLOBALS_THEME := 0;
269 end;
270 end;
271 FreeXPThemes;
272end;
273
274procedure TThemeNexus.WndProc(var Message: TMessage);
275begin
276 case Message.Msg of
277 WM_THEMECHANGED:
278 begin
279 CloseVisualStyles;
280 OpenVisualStyles;
281 end;
282 end;
283 with Message do Result := DefWindowProc(FWindowHandle, Msg, wParam, lParam);
284end;
285
286{$IFDEF SUPPORT_XPTHEMES}
287{$IFDEF XPTHEMES}
288initialization
289 ThemeNexus := TThemeNexus.Create;
290
291finalization
292 ThemeNexus.Free;
293{$ENDIF}
294{$ENDIF}
295
296{$ENDIF}
297
298end.
Note: See TracBrowser for help on using the repository browser.