text: /*
   * 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 "vssym32.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 );
          SetWindowTheme( hWnd, NULL, NULL );
          OpenThemeData( hWnd, NULL );
          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;
  }
  