OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 // | 4 // |
5 // A wrapper class for working with custom XP/Vista themes provided in | 5 // A wrapper class for working with custom XP/Vista themes provided in |
6 // uxtheme.dll. This is a singleton class that can be grabbed using | 6 // uxtheme.dll. This is a singleton class that can be grabbed using |
7 // NativeTheme::instance(). | 7 // NativeTheme::instance(). |
8 // For more information on visual style parts and states, see: | 8 // For more information on visual style parts and states, see: |
9 // http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/plat
form/commctls/userex/topics/partsandstates.asp | 9 // http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/plat
form/commctls/userex/topics/partsandstates.asp |
10 | 10 |
11 #ifndef APP_GFX_NATIVE_THEME_WIN_H_ | 11 #ifndef APP_GFX_NATIVE_THEME_WIN_H_ |
12 #define APP_GFX_NATIVE_THEME_WIN_H_ | 12 #define APP_GFX_NATIVE_THEME_WIN_H_ |
13 #pragma once | 13 #pragma once |
14 | 14 |
15 #include <windows.h> | 15 #include "ui/gfx/native_theme_win.h" |
16 #include <uxtheme.h> | 16 // TODO(sail): remove this file once all includes have been updated. |
17 #include "base/basictypes.h" | |
18 #include "gfx/size.h" | |
19 #include "third_party/skia/include/core/SkColor.h" | |
20 | |
21 namespace skia { | |
22 class PlatformCanvas; | |
23 } // namespace skia | |
24 | |
25 namespace gfx { | |
26 | |
27 // TODO: Define class member enums to replace part_id and state_id parameters | |
28 // that are currently defined in <vssym32.h>. Afterward, classic_state should | |
29 // be removed and class users wouldn't need to include <vssym32.h> anymore. | |
30 // This would enable HOT state on non-themed UI (like when RDP'ing) and would | |
31 // simplify usage. | |
32 // TODO: This class should probably be changed to be platform independent at | |
33 // the same time. | |
34 class NativeTheme { | |
35 public: | |
36 enum ThemeName { | |
37 BUTTON, | |
38 LIST, | |
39 MENU, | |
40 MENULIST, | |
41 SCROLLBAR, | |
42 STATUS, | |
43 TAB, | |
44 TEXTFIELD, | |
45 TRACKBAR, | |
46 WINDOW, | |
47 PROGRESS, | |
48 SPIN, | |
49 LAST | |
50 }; | |
51 | |
52 // This enumeration is used within PaintMenuArrow in order to indicate the | |
53 // direction the menu arrow should point to. | |
54 enum MenuArrowDirection { | |
55 LEFT_POINTING_ARROW, | |
56 RIGHT_POINTING_ARROW | |
57 }; | |
58 | |
59 enum ControlState { | |
60 CONTROL_NORMAL, | |
61 CONTROL_HIGHLIGHTED, | |
62 CONTROL_DISABLED | |
63 }; | |
64 | |
65 typedef HRESULT (WINAPI* DrawThemeBackgroundPtr)(HANDLE theme, | |
66 HDC hdc, | |
67 int part_id, | |
68 int state_id, | |
69 const RECT* rect, | |
70 const RECT* clip_rect); | |
71 typedef HRESULT (WINAPI* DrawThemeBackgroundExPtr)(HANDLE theme, | |
72 HDC hdc, | |
73 int part_id, | |
74 int state_id, | |
75 const RECT* rect, | |
76 const DTBGOPTS* opts); | |
77 typedef HRESULT (WINAPI* GetThemeColorPtr)(HANDLE hTheme, | |
78 int part_id, | |
79 int state_id, | |
80 int prop_id, | |
81 COLORREF* color); | |
82 typedef HRESULT (WINAPI* GetThemeContentRectPtr)(HANDLE hTheme, | |
83 HDC hdc, | |
84 int part_id, | |
85 int state_id, | |
86 const RECT* rect, | |
87 RECT* content_rect); | |
88 typedef HRESULT (WINAPI* GetThemePartSizePtr)(HANDLE hTheme, | |
89 HDC hdc, | |
90 int part_id, | |
91 int state_id, | |
92 RECT* rect, | |
93 int ts, | |
94 SIZE* size); | |
95 typedef HANDLE (WINAPI* OpenThemeDataPtr)(HWND window, | |
96 LPCWSTR class_list); | |
97 typedef HRESULT (WINAPI* CloseThemeDataPtr)(HANDLE theme); | |
98 | |
99 typedef void (WINAPI* SetThemeAppPropertiesPtr) (DWORD flags); | |
100 typedef BOOL (WINAPI* IsThemeActivePtr)(); | |
101 typedef HRESULT (WINAPI* GetThemeIntPtr)(HANDLE hTheme, | |
102 int part_id, | |
103 int state_id, | |
104 int prop_id, | |
105 int *value); | |
106 | |
107 HRESULT PaintButton(HDC hdc, | |
108 int part_id, | |
109 int state_id, | |
110 int classic_state, | |
111 RECT* rect) const; | |
112 | |
113 HRESULT PaintDialogBackground(HDC dc, bool active, RECT* rect) const; | |
114 | |
115 HRESULT PaintListBackground(HDC dc, bool enabled, RECT* rect) const; | |
116 | |
117 // |arrow_direction| determines whether the arrow is pointing to the left or | |
118 // to the right. In RTL locales, sub-menus open from right to left and | |
119 // therefore the menu arrow should point to the left and not to the right. | |
120 HRESULT PaintMenuArrow(ThemeName theme, | |
121 HDC hdc, | |
122 int part_id, | |
123 int state_id, | |
124 RECT* rect, | |
125 MenuArrowDirection arrow_direction, | |
126 ControlState state) const; | |
127 | |
128 HRESULT PaintMenuBackground(ThemeName theme, | |
129 HDC hdc, | |
130 int part_id, | |
131 int state_id, | |
132 RECT* rect) const; | |
133 | |
134 HRESULT PaintMenuCheck(ThemeName theme, | |
135 HDC hdc, | |
136 int part_id, | |
137 int state_id, | |
138 RECT* rect, | |
139 ControlState state) const; | |
140 | |
141 HRESULT PaintMenuCheckBackground(ThemeName theme, | |
142 HDC hdc, | |
143 int part_id, | |
144 int state_id, | |
145 RECT* rect) const; | |
146 | |
147 HRESULT PaintMenuGutter(HDC hdc, | |
148 int part_id, | |
149 int state_id, | |
150 RECT* rect) const; | |
151 | |
152 HRESULT PaintMenuItemBackground(ThemeName theme, | |
153 HDC hdc, | |
154 int part_id, | |
155 int state_id, | |
156 bool selected, | |
157 RECT* rect) const; | |
158 | |
159 HRESULT PaintMenuList(HDC hdc, | |
160 int part_id, | |
161 int state_id, | |
162 int classic_state, | |
163 RECT* rect) const; | |
164 | |
165 HRESULT PaintMenuSeparator(HDC hdc, | |
166 int part_id, | |
167 int state_id, | |
168 RECT* rect) const; | |
169 | |
170 // Paints a scrollbar arrow. |classic_state| should have the appropriate | |
171 // classic part number ORed in already. | |
172 HRESULT PaintScrollbarArrow(HDC hdc, | |
173 int state_id, | |
174 int classic_state, | |
175 RECT* rect) const; | |
176 | |
177 // Paints a scrollbar track section. |align_rect| is only used in classic | |
178 // mode, and makes sure the checkerboard pattern in |target_rect| is aligned | |
179 // with one presumed to be in |align_rect|. | |
180 HRESULT PaintScrollbarTrack(HDC hdc, | |
181 int part_id, | |
182 int state_id, | |
183 int classic_state, | |
184 RECT* target_rect, | |
185 RECT* align_rect, | |
186 skia::PlatformCanvas* canvas) const; | |
187 | |
188 // Paints a scrollbar thumb or gripper. | |
189 HRESULT PaintScrollbarThumb(HDC hdc, | |
190 int part_id, | |
191 int state_id, | |
192 int classic_state, | |
193 RECT* rect) const; | |
194 | |
195 HRESULT PaintSpinButton(HDC hdc, | |
196 int part_id, | |
197 int state_id, | |
198 int classic_state, | |
199 RECT* rect) const; | |
200 | |
201 HRESULT PaintStatusGripper(HDC hdc, | |
202 int part_id, | |
203 int state_id, | |
204 int classic_state, | |
205 RECT* rect) const; | |
206 | |
207 HRESULT PaintTabPanelBackground(HDC dc, RECT* rect) const; | |
208 | |
209 HRESULT PaintTextField(HDC hdc, | |
210 int part_id, | |
211 int state_id, | |
212 int classic_state, | |
213 RECT* rect, | |
214 COLORREF color, | |
215 bool fill_content_area, | |
216 bool draw_edges) const; | |
217 | |
218 HRESULT PaintTrackbar(HDC hdc, | |
219 int part_id, | |
220 int state_id, | |
221 int classic_state, | |
222 RECT* rect, | |
223 skia::PlatformCanvas* canvas) const; | |
224 | |
225 HRESULT PaintProgressBar(HDC hdc, | |
226 RECT* bar_rect, | |
227 RECT* value_rect, | |
228 bool determinate, | |
229 double animated_seconds, | |
230 skia::PlatformCanvas* canvas) const; | |
231 | |
232 bool IsThemingActive() const; | |
233 | |
234 HRESULT GetThemePartSize(ThemeName themeName, | |
235 HDC hdc, | |
236 int part_id, | |
237 int state_id, | |
238 RECT* rect, | |
239 int ts, | |
240 SIZE* size) const; | |
241 | |
242 HRESULT GetThemeColor(ThemeName theme, | |
243 int part_id, | |
244 int state_id, | |
245 int prop_id, | |
246 SkColor* color) const; | |
247 | |
248 // Get the theme color if theming is enabled. If theming is unsupported | |
249 // for this part, use Win32's GetSysColor to find the color specified | |
250 // by default_sys_color. | |
251 SkColor GetThemeColorWithDefault(ThemeName theme, | |
252 int part_id, | |
253 int state_id, | |
254 int prop_id, | |
255 int default_sys_color) const; | |
256 | |
257 HRESULT GetThemeInt(ThemeName theme, | |
258 int part_id, | |
259 int state_id, | |
260 int prop_id, | |
261 int *result) const; | |
262 | |
263 // Get the thickness of the border associated with the specified theme, | |
264 // defaulting to GetSystemMetrics edge size if themes are disabled. | |
265 // In Classic Windows, borders are typically 2px; on XP+, they are 1px. | |
266 Size GetThemeBorderSize(ThemeName theme) const; | |
267 | |
268 // Disables all theming for top-level windows in the entire process, from | |
269 // when this method is called until the process exits. All the other | |
270 // methods in this class will continue to work, but their output will ignore | |
271 // the user's theme. This is meant for use when running tests that require | |
272 // consistent visual results. | |
273 void DisableTheming() const; | |
274 | |
275 // Closes cached theme handles so we can unload the DLL or update our UI | |
276 // for a theme change. | |
277 void CloseHandles() const; | |
278 | |
279 // Returns true if classic theme is in use. | |
280 bool IsClassicTheme(ThemeName name) const; | |
281 | |
282 // Gets our singleton instance. | |
283 static const NativeTheme* instance(); | |
284 | |
285 private: | |
286 NativeTheme(); | |
287 ~NativeTheme(); | |
288 | |
289 HRESULT PaintFrameControl(HDC hdc, | |
290 RECT* rect, | |
291 UINT type, | |
292 UINT state, | |
293 ControlState control_state) const; | |
294 | |
295 // Returns a handle to the theme data. | |
296 HANDLE GetThemeHandle(ThemeName theme_name) const; | |
297 | |
298 // Function pointers into uxtheme.dll. | |
299 DrawThemeBackgroundPtr draw_theme_; | |
300 DrawThemeBackgroundExPtr draw_theme_ex_; | |
301 GetThemeColorPtr get_theme_color_; | |
302 GetThemeContentRectPtr get_theme_content_rect_; | |
303 GetThemePartSizePtr get_theme_part_size_; | |
304 OpenThemeDataPtr open_theme_; | |
305 CloseThemeDataPtr close_theme_; | |
306 SetThemeAppPropertiesPtr set_theme_properties_; | |
307 IsThemeActivePtr is_theme_active_; | |
308 GetThemeIntPtr get_theme_int_; | |
309 | |
310 // Handle to uxtheme.dll. | |
311 HMODULE theme_dll_; | |
312 | |
313 // A cache of open theme handles. | |
314 mutable HANDLE theme_handles_[LAST]; | |
315 | |
316 DISALLOW_COPY_AND_ASSIGN(NativeTheme); | |
317 }; | |
318 | |
319 } // namespace gfx | |
320 | 17 |
321 #endif // APP_GFX_NATIVE_THEME_WIN_H_ | 18 #endif // APP_GFX_NATIVE_THEME_WIN_H_ |
OLD | NEW |