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