4 * Copyright (c) 2005 by Frank Richter
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.
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.
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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
33 #include "wine/debug.h"
35 /**********************************************************************
36 * The dialog subclass window proc.
38 LRESULT CALLBACK THEMING_DialogSubclassProc (HWND hWnd, UINT msg,
39 WPARAM wParam, LPARAM lParam,
42 HTHEME theme = GetWindowTheme ( hWnd );
43 static const WCHAR themeClass[] = { 'W','i','n','d','o','w',0 };
44 BOOL themingActive = IsThemeDialogTextureEnabled (hWnd);
45 BOOL doTheming = themingActive && (theme != NULL);
51 result = THEMING_CallOriginalClass (hWnd, msg, wParam, lParam);
52 theme = OpenThemeData( hWnd, themeClass );
56 CloseThemeData ( theme );
57 return THEMING_CallOriginalClass (hWnd, msg, wParam, lParam);
60 CloseThemeData ( theme );
61 OpenThemeData( hWnd, themeClass );
62 InvalidateRect( hWnd, NULL, TRUE );
65 case WM_SYSCOLORCHANGE:
66 if (!doTheming) return THEMING_CallOriginalClass (hWnd, msg, wParam, lParam);
67 /* Do nothing. When themed, a WM_THEMECHANGED will be received, too,
68 * which will do the repaint. */
72 if (!doTheming) return THEMING_CallOriginalClass (hWnd, msg, wParam, lParam);
75 WNDPROC dlgp = (WNDPROC)GetWindowLongPtrW (hWnd, DWLP_DLGPROC);
76 if (!CallWindowProcW(dlgp, hWnd, msg, wParam, lParam))
79 GetClientRect (hWnd, &rc);
80 if (IsThemePartDefined (theme, WP_DIALOG, 0))
81 /* Although there is a theme for the WINDOW class/DIALOG part,
82 * but I[res] haven't seen Windows using it yet... Even when
83 * dialog theming is activated, the good ol' BTNFACE
84 * background seems to be used. */
86 DrawThemeBackground (theme, (HDC)wParam, WP_DIALOG, 0, &rc,
89 return THEMING_CallOriginalClass (hWnd, msg, wParam, lParam);
91 /* We might have gotten a TAB theme class, so check if we can
92 * draw as a tab page. */
93 if (IsThemePartDefined (theme, TABP_BODY, 0))
94 DrawThemeBackground (theme, (HDC)wParam, TABP_BODY, 0, &rc,
97 return THEMING_CallOriginalClass (hWnd, msg, wParam, lParam);
102 case WM_CTLCOLORSTATIC:
103 if (!doTheming) return THEMING_CallOriginalClass (hWnd, msg, wParam, lParam);
105 WNDPROC dlgp = (WNDPROC)GetWindowLongPtrW (hWnd, DWLP_DLGPROC);
106 LRESULT result = CallWindowProcW(dlgp, hWnd, msg, wParam, lParam);
109 /* Override defaults with more suitable values when themed */
110 HDC controlDC = (HDC)wParam;
111 HWND controlWnd = (HWND)lParam;
112 WCHAR controlClass[32];
115 GetClassNameW (controlWnd, controlClass,
116 sizeof(controlClass) / sizeof(controlClass[0]));
117 if (lstrcmpiW (controlClass, WC_STATICW) == 0)
119 /* Static control - draw parent background and set text to
120 * transparent, so it looks right on tab pages. */
121 GetClientRect (controlWnd, &rc);
122 DrawThemeParentBackground (controlWnd, controlDC, &rc);
123 SetBkMode (controlDC, TRANSPARENT);
125 /* Return NULL brush since we painted the BG already */
126 return (LRESULT)GetStockObject (NULL_BRUSH);
129 return THEMING_CallOriginalClass (hWnd, msg, wParam, lParam);
137 return THEMING_CallOriginalClass (hWnd, msg, wParam, lParam);