reshuffling of dlls
[reactos.git] / reactos / dll / comctl32 / theme_dialog.c
1 /*
2 * Theming - Dialogs
3 *
4 * Copyright (c) 2005 by Frank Richter
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 *
20 */
21
22 #include <stdarg.h>
23 #include <string.h>
24 #include <stdlib.h>
25
26 #include "windef.h"
27 #include "winbase.h"
28 #include "wingdi.h"
29 #include "winuser.h"
30 #include "uxtheme.h"
31 #include "tmschema.h"
32 #include "comctl32.h"
33 #include "wine/debug.h"
34
35 WINE_DEFAULT_DEBUG_CHANNEL(themingdialog);
36
37 /**********************************************************************
38 * The dialog subclass window proc.
39 */
40 LRESULT CALLBACK THEMING_DialogSubclassProc (HWND hWnd, UINT msg,
41 WPARAM wParam, LPARAM lParam,
42 ULONG_PTR dwRefData)
43 {
44 HTHEME theme = GetWindowTheme ( hWnd );
45 static const WCHAR themeClass[] = { 'W','i','n','d','o','w',0 };
46 BOOL themingActive = IsThemeDialogTextureEnabled (hWnd);
47 BOOL doTheming = themingActive && (theme != NULL);
48 LRESULT result;
49
50 switch (msg)
51 {
52 case WM_CREATE:
53 result = THEMING_CallOriginalClass (hWnd, msg, wParam, lParam);
54 theme = OpenThemeData( hWnd, themeClass );
55 return result;
56
57 case WM_DESTROY:
58 CloseThemeData ( theme );
59 return THEMING_CallOriginalClass (hWnd, msg, wParam, lParam);
60
61 case WM_THEMECHANGED:
62 CloseThemeData ( theme );
63 OpenThemeData( hWnd, themeClass );
64 InvalidateRect( hWnd, NULL, TRUE );
65 return 0;
66
67 case WM_SYSCOLORCHANGE:
68 if (!doTheming) return THEMING_CallOriginalClass (hWnd, msg, wParam, lParam);
69 /* Do nothing. When themed, a WM_THEMECHANGED will be received, too,
70 * which will do the repaint. */
71 break;
72
73 case WM_ERASEBKGND:
74 if (!doTheming) return THEMING_CallOriginalClass (hWnd, msg, wParam, lParam);
75 {
76 RECT rc;
77 DLGPROC dlgp = (DLGPROC)GetWindowLongPtrW (hWnd, DWLP_DLGPROC);
78 if (!dlgp (hWnd, msg, wParam, lParam))
79 {
80 /* Draw background*/
81 GetClientRect (hWnd, &rc);
82 if (IsThemePartDefined (theme, WP_DIALOG, 0))
83 /* Although there is a theme for the WINDOW class/DIALOG part,
84 * but I[res] haven't seen Windows using it yet... Even when
85 * dialog theming is activated, the good ol' BTNFACE
86 * background seems to be used. */
87 #if 0
88 DrawThemeBackground (theme, (HDC)wParam, WP_DIALOG, 0, &rc,
89 NULL);
90 #endif
91 return THEMING_CallOriginalClass (hWnd, msg, wParam, lParam);
92 else
93 /* We might have gotten a TAB theme class, so check if we can
94 * draw as a tab page. */
95 if (IsThemePartDefined (theme, TABP_BODY, 0))
96 DrawThemeBackground (theme, (HDC)wParam, TABP_BODY, 0, &rc,
97 NULL);
98 else
99 return THEMING_CallOriginalClass (hWnd, msg, wParam, lParam);
100 }
101 return 1;
102 }
103
104 case WM_CTLCOLORSTATIC:
105 if (!doTheming) return THEMING_CallOriginalClass (hWnd, msg, wParam, lParam);
106 {
107 DLGPROC dlgp = (DLGPROC)GetWindowLongPtrW (hWnd, DWLP_DLGPROC);
108 LRESULT result = (LRESULT)dlgp (hWnd, msg, wParam, lParam);
109 if (!result)
110 {
111 /* Override defaults with more suitable values when themed */
112 HDC controlDC = (HDC)wParam;
113 HWND controlWnd = (HWND)lParam;
114 WCHAR controlClass[32];
115 RECT rc;
116
117 GetClassNameW (controlWnd, controlClass,
118 sizeof(controlClass) / sizeof(controlClass[0]));
119 if (lstrcmpiW (controlClass, WC_STATICW) == 0)
120 {
121 /* Static control - draw parent background and set text to
122 * transparent, so it looks right on tab pages. */
123 GetClientRect (controlWnd, &rc);
124 DrawThemeParentBackground (controlWnd, controlDC, &rc);
125 SetBkMode (controlDC, TRANSPARENT);
126
127 /* Return NULL brush since we painted the BG already */
128 return (LRESULT)GetStockObject (NULL_BRUSH);
129 }
130 else
131 return THEMING_CallOriginalClass (hWnd, msg, wParam, lParam);
132
133 }
134 return result;
135 }
136
137 default:
138 /* Call old proc */
139 return THEMING_CallOriginalClass (hWnd, msg, wParam, lParam);
140 }
141 return 0;
142 }