| /* | |
| * 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA | |
| * | |
| */ | |
| #include <stdarg.h> | |
| #include <string.h> | |
| #include <stdlib.h> | |
| #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" | |
| /********************************************************************** | |
| * 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; | |
| WNDPROC dlgp = (WNDPROC)GetWindowLongPtrW (hWnd, DWLP_DLGPROC); | |
| if (!CallWindowProcW(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; | |
| } | |
| case WM_CTLCOLORSTATIC: | |
| if (!doTheming) return THEMING_CallOriginalClass (hWnd, msg, wParam, lParam); | |
| { | |
| WNDPROC dlgp = (WNDPROC)GetWindowLongPtrW (hWnd, DWLP_DLGPROC); | |
| LRESULT result = CallWindowProcW(dlgp, hWnd, msg, wParam, lParam); | |
| if (!result) | |
| { | |
| /* Override defaults with more suitable values when themed */ | |
| HDC controlDC = (HDC)wParam; | |
| HWND controlWnd = (HWND)lParam; | |
| WCHAR controlClass[32]; | |
| RECT rc; | |
| GetClassNameW (controlWnd, controlClass, | |
| sizeof(controlClass) / sizeof(controlClass[0])); | |
| if (lstrcmpiW (controlClass, WC_STATICW) == 0) | |
| { | |
| /* Static control - draw parent background and set text to | |
| * transparent, so it looks right on tab pages. */ | |
| GetClientRect (controlWnd, &rc); | |
| DrawThemeParentBackground (controlWnd, controlDC, &rc); | |
| SetBkMode (controlDC, TRANSPARENT); | |
| /* Return NULL brush since we painted the BG already */ | |
| return (LRESULT)GetStockObject (NULL_BRUSH); | |
| } | |
| else | |
| return THEMING_CallOriginalClass (hWnd, msg, wParam, lParam); | |
| } | |
| return result; | |
| } | |
| default: | |
| /* Call old proc */ | |
| return THEMING_CallOriginalClass (hWnd, msg, wParam, lParam); | |
| } | |
| return 0; | |
| } |