diff --git a/dlls/comctl32/Makefile.in b/dlls/comctl32/Makefile.in index 5d8264586b1..3557b95913e 100644 --- a/dlls/comctl32/Makefile.in +++ b/dlls/comctl32/Makefile.in @@ -36,6 +36,7 @@ C_SRCS = \ syslink.c \ tab.c \ theme_combo.c \ + theme_dialog.c \ theme_edit.c \ theme_listbox.c \ theming.c \ diff --git a/dlls/comctl32/theme_dialog.c b/dlls/comctl32/theme_dialog.c new file mode 100644 index 00000000000..6987c0f5b42 --- /dev/null +++ b/dlls/comctl32/theme_dialog.c @@ -0,0 +1,109 @@ +/* + * Theming - Dialogs + * + * Copyright (c) 2005 by Frank Richter + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include +#include +#include + +#include "windef.h" +#include "winbase.h" +#include "wingdi.h" +#include "winuser.h" +#include "uxtheme.h" +#include "tmschema.h" +#include "comctl32.h" +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(themingdialog); + +/********************************************************************** + * The dialog subclass window proc. + */ +LRESULT CALLBACK THEMING_DialogSubclassProc (HWND hWnd, UINT msg, + WPARAM wParam, LPARAM lParam, + ULONG_PTR dwRefData) +{ + HTHEME theme = GetWindowTheme ( hWnd ); + static const WCHAR themeClass[] = { 'W','i','n','d','o','w',0 }; + BOOL themingActive = IsThemeDialogTextureEnabled (hWnd); + BOOL doTheming = themingActive && (theme != NULL); + LRESULT result; + + switch (msg) + { + case WM_CREATE: + result = THEMING_CallOriginalClass (hWnd, msg, wParam, lParam); + theme = OpenThemeData( hWnd, themeClass ); + return result; + + case WM_DESTROY: + CloseThemeData ( theme ); + return THEMING_CallOriginalClass (hWnd, msg, wParam, lParam); + + case WM_THEMECHANGED: + CloseThemeData ( theme ); + OpenThemeData( hWnd, themeClass ); + InvalidateRect( hWnd, NULL, TRUE ); + return 0; + + case WM_SYSCOLORCHANGE: + if (!doTheming) return THEMING_CallOriginalClass (hWnd, msg, wParam, lParam); + /* Do nothing. When themed, a WM_THEMECHANGED will be received, too, + * which will do the repaint. */ + break; + + case WM_ERASEBKGND: + if (!doTheming) return THEMING_CallOriginalClass (hWnd, msg, wParam, lParam); + { + RECT rc; + DLGPROC dlgp = (DLGPROC)GetWindowLongPtrW (hWnd, DWLP_DLGPROC); + if (!dlgp (hWnd, msg, wParam, lParam)) + { + /* Draw background*/ + GetClientRect (hWnd, &rc); + if (IsThemePartDefined (theme, WP_DIALOG, 0)) + /* Although there is a theme for the WINDOW class/DIALOG part, + * but I[res] haven't seen Windows using it yet... Even when + * dialog theming is activated, the good ol' BTNFACE + * background seems to be used. */ +#if 0 + DrawThemeBackground (theme, (HDC)wParam, WP_DIALOG, 0, &rc, + NULL); +#endif + return THEMING_CallOriginalClass (hWnd, msg, wParam, lParam); + else + /* We might have gotten a TAB theme class, so check if we can + * draw as a tab page. */ + if (IsThemePartDefined (theme, TABP_BODY, 0)) + DrawThemeBackground (theme, (HDC)wParam, TABP_BODY, 0, &rc, + NULL); + else + return THEMING_CallOriginalClass (hWnd, msg, wParam, lParam); + } + return 1; + } + + default: + /* Call old proc */ + return THEMING_CallOriginalClass (hWnd, msg, wParam, lParam); + } + return 0; +} diff --git a/dlls/comctl32/theming.c b/dlls/comctl32/theming.c index 01e226d40c9..810ab4c8d08 100644 --- a/dlls/comctl32/theming.c +++ b/dlls/comctl32/theming.c @@ -35,11 +35,14 @@ typedef LRESULT (CALLBACK* THEMING_SUBCLASSPROC)(HWND, UINT, WPARAM, LPARAM, extern LRESULT CALLBACK THEMING_ComboSubclassProc (HWND, UINT, WPARAM, LPARAM, ULONG_PTR); +extern LRESULT CALLBACK THEMING_DialogSubclassProc (HWND, UINT, WPARAM, LPARAM, + ULONG_PTR); extern LRESULT CALLBACK THEMING_EditSubclassProc (HWND, UINT, WPARAM, LPARAM, ULONG_PTR); extern LRESULT CALLBACK THEMING_ListBoxSubclassProc (HWND, UINT, WPARAM, LPARAM, ULONG_PTR); +static const WCHAR dialogClass[] = {'#','3','2','7','7','0',0}; static const WCHAR comboLboxClass[] = {'C','o','m','b','o','L','b','o','x',0}; static const struct ThemingSubclass @@ -48,6 +51,7 @@ static const struct ThemingSubclass THEMING_SUBCLASSPROC subclassProc; } subclasses[] = { /* Note: list must be sorted by class name */ + {dialogClass, THEMING_DialogSubclassProc}, {WC_COMBOBOXW, THEMING_ComboSubclassProc}, {comboLboxClass, THEMING_ListBoxSubclassProc}, {WC_EDITW, THEMING_EditSubclassProc}, @@ -100,12 +104,14 @@ MAKE_SUBCLASS_STUB(0) MAKE_SUBCLASS_STUB(1) MAKE_SUBCLASS_STUB(2) MAKE_SUBCLASS_STUB(3) +MAKE_SUBCLASS_STUB(4) const static WNDPROC subclassStubs[NUM_SUBCLASSES] = { subclass_stub0, subclass_stub1, subclass_stub2, - subclass_stub3 + subclass_stub3, + subclass_stub4 }; /***********************************************************************