From e04ff33417b3552a82d6297c63043f37ae20cdc6 Mon Sep 17 00:00:00 2001 From: Kevin Koltzau Date: Fri, 16 Jan 2004 21:25:25 +0000 Subject: [PATCH] Add INI file processing. Full implementation of GetThemeDocumentationProperty. Define string maps for parsing INI files into useable form. Implemented (undocumented) ApplyTheme to select current theme. --- dlls/uxtheme/Makefile.in | 4 +- dlls/uxtheme/main.c | 2 +- dlls/uxtheme/msstyles.c | 70 ++- dlls/uxtheme/msstyles.h | 25 + dlls/uxtheme/property.c | 12 - dlls/uxtheme/stylemap.c | 1102 +++++++++++++++++++++++++++++++++++++ dlls/uxtheme/system.c | 186 ++++++- dlls/uxtheme/uxini.c | 309 +++++++++++ dlls/uxtheme/uxthemedll.h | 2 +- 9 files changed, 1668 insertions(+), 44 deletions(-) create mode 100644 dlls/uxtheme/stylemap.c create mode 100644 dlls/uxtheme/uxini.c diff --git a/dlls/uxtheme/Makefile.in b/dlls/uxtheme/Makefile.in index f651b3ba17c..c24eb643ff8 100644 --- a/dlls/uxtheme/Makefile.in +++ b/dlls/uxtheme/Makefile.in @@ -12,7 +12,9 @@ C_SRCS = \ metric.c \ msstyles.c \ property.c \ - system.c + stylemap.c \ + system.c \ + uxini.c RC_SRCS = version.rc diff --git a/dlls/uxtheme/main.c b/dlls/uxtheme/main.c index a59391b9384..7553a83dd8d 100644 --- a/dlls/uxtheme/main.c +++ b/dlls/uxtheme/main.c @@ -39,7 +39,7 @@ BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpv) switch(fdwReason) { case DLL_PROCESS_ATTACH: DisableThreadLibraryCalls(hInstDLL); - UXTHEME_InitSystem(); + UXTHEME_InitSystem(hInstDLL); break; case DLL_PROCESS_DETACH: break; diff --git a/dlls/uxtheme/msstyles.c b/dlls/uxtheme/msstyles.c index be6af5f3361..82a8123e7df 100644 --- a/dlls/uxtheme/msstyles.c +++ b/dlls/uxtheme/msstyles.c @@ -35,8 +35,22 @@ WINE_DEFAULT_DEBUG_CHANNEL(uxtheme); +/*********************************************************************** + * Defines and global variables + */ + +extern HINSTANCE hDllInst; + #define MSSTYLES_VERSION 0x0003 +static const WCHAR szThemesIniResource[] = { + 't','h','e','m','e','s','_','i','n','i','\0' +}; + +PTHEME_FILE tfActiveTheme = NULL; + +/***********************************************************************/ + /********************************************************************** * MSSTYLES_OpenThemeFile * @@ -144,12 +158,13 @@ HRESULT MSSTYLES_OpenThemeFile(LPCWSTR lpThemeFile, LPCWSTR pszColorName, LPCWST goto invalid_theme; } - *tf = HeapAlloc(GetProcessHeap(), 0, sizeof(THEME_FILE)); + *tf = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(THEME_FILE)); (*tf)->hTheme = hTheme; (*tf)->pszAvailColors = pszColors; (*tf)->pszAvailSizes = pszSizes; (*tf)->pszSelectedColor = pszSelectedColor; (*tf)->pszSelectedSize = pszSelectedSize; + (*tf)->dwRefCount = 1; return S_OK; invalid_theme: @@ -166,7 +181,56 @@ invalid_theme: void MSSTYLES_CloseThemeFile(PTHEME_FILE tf) { if(tf) { - if(tf->hTheme) FreeLibrary(tf->hTheme); - HeapFree(GetProcessHeap(), 0, tf); + tf->dwRefCount--; + if(!tf->dwRefCount) { + if(tf->hTheme) FreeLibrary(tf->hTheme); + HeapFree(GetProcessHeap(), 0, tf); + } } } + +/*********************************************************************** + * MSSTYLES_SetActiveTheme + * + * Set the current active theme + */ +HRESULT MSSTYLES_SetActiveTheme(PTHEME_FILE tf) +{ + if(tfActiveTheme) + MSSTYLES_CloseThemeFile(tfActiveTheme); + tfActiveTheme = tf; + tfActiveTheme->dwRefCount++; + FIXME("Process theme resources\n"); + return S_OK; +} + +/*********************************************************************** + * MSSTYLES_GetThemeIni + * + * Retrieves themes.ini from a theme + */ +PUXINI_FILE MSSTYLES_GetThemeIni(PTHEME_FILE tf) +{ + return UXINI_LoadINI(tf, szThemesIniResource); +} + +/*********************************************************************** + * MSSTYLES_OpenThemeClass + * + * Open a theme class + * + * PARAMS + * tf Previously opened theme file + * pszClassList List of requested classes, semicolon delimited + */ +PTHEME_CLASS MSSTYLES_OpenThemeClass(LPCWSTR pszClassList) +{ + FIXME("%s\n", debugstr_w(pszClassList)); + return NULL; +} + +HRESULT MSSTYLES_CloseThemeClass(PTHEME_CLASS tc) +{ + FIXME("%p\n", tc); + return S_OK; +} diff --git a/dlls/uxtheme/msstyles.h b/dlls/uxtheme/msstyles.h index 38e611d6a4e..65173b28422 100644 --- a/dlls/uxtheme/msstyles.h +++ b/dlls/uxtheme/msstyles.h @@ -21,7 +21,10 @@ #ifndef __WINE_MSSTYLES_H #define __WINE_MSSTYLES_H +#define TMT_ENUM 200 + typedef struct _THEME_FILE { + DWORD dwRefCount; HMODULE hTheme; LPWSTR pszAvailColors; LPWSTR pszAvailSizes; @@ -30,8 +33,30 @@ typedef struct _THEME_FILE { LPWSTR pszSelectedSize; } THEME_FILE, *PTHEME_FILE; +typedef struct _THEME_CLASS { + /* TODO */ +} THEME_CLASS, *PTHEME_CLASS; + +typedef struct _UXINI_FILE { + LPCWSTR lpIni; + LPCWSTR lpCurLoc; + LPCWSTR lpEnd; +} UXINI_FILE, *PUXINI_FILE; + HRESULT MSSTYLES_OpenThemeFile(LPCWSTR lpThemeFile, LPCWSTR pszColorName, LPCWSTR pszSizeName, PTHEME_FILE *tf); void MSSTYLES_CloseThemeFile(PTHEME_FILE tf); +HRESULT MSSTYLES_SetActiveTheme(PTHEME_FILE tf); +PTHEME_CLASS MSSTYLES_OpenThemeClass(LPCWSTR pszClassList); +HRESULT MSSTYLES_CloseThemeClass(PTHEME_CLASS tc); +BOOL MSSTYLES_LookupProperty(LPCWSTR pszPropertyName, DWORD *dwPrimitive, DWORD *dwId); +PUXINI_FILE MSSTYLES_GetThemeIni(PTHEME_FILE tf); +PUXINI_FILE UXINI_LoadINI(PTHEME_FILE tf, LPCWSTR lpName); +void UXINI_CloseINI(PUXINI_FILE uf); +void UXINI_ResetINI(PUXINI_FILE uf); +LPCWSTR UXINI_GetNextSection(PUXINI_FILE uf, DWORD *dwLen); +BOOL UXINI_FindSection(PUXINI_FILE uf, LPCWSTR lpName); +LPCWSTR UXINI_GetNextValue(PUXINI_FILE uf, DWORD *dwNameLen, LPCWSTR *lpValue, DWORD *dwValueLen); +BOOL UXINI_FindValue(PUXINI_FILE uf, LPCWSTR lpName, LPCWSTR *lpValue, DWORD *dwValueLen); #endif diff --git a/dlls/uxtheme/property.c b/dlls/uxtheme/property.c index 03f75440159..87b41ccd5fe 100644 --- a/dlls/uxtheme/property.c +++ b/dlls/uxtheme/property.c @@ -34,18 +34,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(uxtheme); -/*********************************************************************** - * GetThemeDocumentationProperty (UXTHEME.@) - */ -HRESULT WINAPI GetThemeDocumentationProperty(LPCWSTR pszThemeName, - LPCWSTR pszPropertyName, - LPWSTR pszValueBuff, - int cchMaxValChars) -{ - FIXME("%s %s: stub\n", debugstr_w(pszThemeName), debugstr_w(pszPropertyName)); - return ERROR_CALL_NOT_IMPLEMENTED; -} - /*********************************************************************** * GetThemeBool (UXTHEME.@) */ diff --git a/dlls/uxtheme/stylemap.c b/dlls/uxtheme/stylemap.c new file mode 100644 index 00000000000..4ad29f25b42 --- /dev/null +++ b/dlls/uxtheme/stylemap.c @@ -0,0 +1,1102 @@ +/* + * msstyle data maps + * + * Copyright (C) 2004 Kevin Koltzau + * + * 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 "config.h" + +#include + +#include "windef.h" +#include "winbase.h" +#include "winuser.h" +#include "tmschema.h" + +#include "msstyles.h" + +typedef struct _MSSTYLES_PROPERTY_MAP { + WORD dwPrimitiveType; + WORD dwPropertyID; + WCHAR szPropertyName[24]; +} MSSTYLES_PROPERTY_MAP, *PMSSTYLES_PROPERTY_MAP; + +typedef struct _MSSTYLES_ENUM_MAP { + WORD dwEnum; + WORD dwValue; + WCHAR szValueName[18]; +} MSSTYLES_ENUM_MAP, *PMSSTYLES_ENUM_MAP; + +typedef struct _MSSTYLES_CLASS_MAP { + WORD dwPartID; + WORD dwStateID; + WCHAR szName[31]; +} MSSTYLES_CLASS_MAP, *PMSSTYLES_CLASS_MAP; + +typedef struct _MSSTYLES_CLASS_NAME { + const MSSTYLES_CLASS_MAP *lpMap; + WCHAR pszClass[12]; +} MSSTYLES_CLASS_NAME, *PMSSTYLES_CLASS_NAME; + +/*********************************************************************** + * Map property names to IDs & primitive types + * PrimitiveType,PropertyID,PropertyName + */ +static const MSSTYLES_PROPERTY_MAP mapProperty[] = { + {TMT_STRING,TMT_STRING,{'S','T','R','I','N','G','\0'}}, + {TMT_INT,TMT_INT,{'I','N','T','\0'}}, + {TMT_BOOL,TMT_BOOL,{'B','O','O','L','\0'}}, + {TMT_COLOR,TMT_COLOR,{'C','O','L','O','R','\0'}}, + {TMT_MARGINS,TMT_MARGINS,{'M','A','R','G','I','N','S','\0'}}, + {TMT_FILENAME,TMT_FILENAME,{'F','I','L','E','N','A','M','E','\0'}}, + {TMT_SIZE,TMT_SIZE,{'S','I','Z','E','\0'}}, + {TMT_POSITION,TMT_POSITION,{'P','O','S','I','T','I','O','N','\0'}}, + {TMT_RECT,TMT_RECT,{'R','E','C','T','\0'}}, + {TMT_FONT,TMT_FONT,{'F','O','N','T','\0'}}, + {TMT_INTLIST,TMT_INTLIST,{'I','N','T','L','I','S','T','\0'}}, + {TMT_STRING,TMT_COLORSCHEMES,{'C','O','L','O','R','S','C','H','E','M','E','S','\0'}}, + {TMT_STRING,TMT_SIZES,{'S','I','Z','E','S','\0'}}, + {TMT_INT,TMT_CHARSET,{'C','H','A','R','S','E','T','\0'}}, + {TMT_STRING,TMT_DISPLAYNAME,{'D','I','S','P','L','A','Y','N','A','M','E','\0'}}, + {TMT_STRING,TMT_TOOLTIP,{'T','O','O','L','T','I','P','\0'}}, + {TMT_STRING,TMT_COMPANY,{'C','O','M','P','A','N','Y','\0'}}, + {TMT_STRING,TMT_AUTHOR,{'A','U','T','H','O','R','\0'}}, + {TMT_STRING,TMT_COPYRIGHT,{'C','O','P','Y','R','I','G','H','T','\0'}}, + {TMT_STRING,TMT_URL,{'U','R','L','\0'}}, + {TMT_STRING,TMT_VERSION,{'V','E','R','S','I','O','N','\0'}}, + {TMT_STRING,TMT_DESCRIPTION,{'D','E','S','C','R','I','P','T','I','O','N','\0'}}, + {TMT_FONT,TMT_CAPTIONFONT,{'C','A','P','T','I','O','N','F','O','N','T','\0'}}, + {TMT_FONT,TMT_SMALLCAPTIONFONT,{'S','M','A','L','L','C','A','P','T','I','O','N','F','O','N','T','\0'}}, + {TMT_FONT,TMT_MENUFONT,{'M','E','N','U','F','O','N','T','\0'}}, + {TMT_FONT,TMT_STATUSFONT,{'S','T','A','T','U','S','F','O','N','T','\0'}}, + {TMT_FONT,TMT_MSGBOXFONT,{'M','S','G','B','O','X','F','O','N','T','\0'}}, + {TMT_FONT,TMT_ICONTITLEFONT,{'I','C','O','N','T','I','T','L','E','F','O','N','T','\0'}}, + {TMT_BOOL,TMT_FLATMENUS,{'F','L','A','T','M','E','N','U','S','\0'}}, + {TMT_SIZE,TMT_SIZINGBORDERWIDTH,{'S','I','Z','I','N','G','B','O','R','D','E','R','W','I','D','T','H','\0'}}, + {TMT_SIZE,TMT_SCROLLBARWIDTH,{'S','C','R','O','L','L','B','A','R','W','I','D','T','H','\0'}}, + {TMT_SIZE,TMT_SCROLLBARHEIGHT,{'S','C','R','O','L','L','B','A','R','H','E','I','G','H','T','\0'}}, + {TMT_SIZE,TMT_CAPTIONBARWIDTH,{'C','A','P','T','I','O','N','B','A','R','W','I','D','T','H','\0'}}, + {TMT_SIZE,TMT_CAPTIONBARHEIGHT,{'C','A','P','T','I','O','N','B','A','R','H','E','I','G','H','T','\0'}}, + {TMT_SIZE,TMT_SMCAPTIONBARWIDTH,{'S','M','C','A','P','T','I','O','N','B','A','R','W','I','D','T','H','\0'}}, + {TMT_SIZE,TMT_SMCAPTIONBARHEIGHT,{'S','M','C','A','P','T','I','O','N','B','A','R','H','E','I','G','H','T','\0'}}, + {TMT_SIZE,TMT_MENUBARWIDTH,{'M','E','N','U','B','A','R','W','I','D','T','H','\0'}}, + {TMT_SIZE,TMT_MENUBARHEIGHT,{'M','E','N','U','B','A','R','H','E','I','G','H','T','\0'}}, + {TMT_INT,TMT_MINCOLORDEPTH,{'M','I','N','C','O','L','O','R','D','E','P','T','H','\0'}}, + {TMT_STRING,TMT_CSSNAME,{'C','S','S','N','A','M','E','\0'}}, + {TMT_STRING,TMT_XMLNAME,{'X','M','L','N','A','M','E','\0'}}, + {TMT_COLOR,TMT_SCROLLBAR,{'S','C','R','O','L','L','B','A','R','\0'}}, + {TMT_COLOR,TMT_BACKGROUND,{'B','A','C','K','G','R','O','U','N','D','\0'}}, + {TMT_COLOR,TMT_ACTIVECAPTION,{'A','C','T','I','V','E','C','A','P','T','I','O','N','\0'}}, + {TMT_COLOR,TMT_INACTIVECAPTION,{'I','N','A','C','T','I','V','E','C','A','P','T','I','O','N','\0'}}, + {TMT_COLOR,TMT_MENU,{'M','E','N','U','\0'}}, + {TMT_COLOR,TMT_WINDOW,{'W','I','N','D','O','W','\0'}}, + {TMT_COLOR,TMT_WINDOWFRAME,{'W','I','N','D','O','W','F','R','A','M','E','\0'}}, + {TMT_COLOR,TMT_MENUTEXT,{'M','E','N','U','T','E','X','T','\0'}}, + {TMT_COLOR,TMT_WINDOWTEXT,{'W','I','N','D','O','W','T','E','X','T','\0'}}, + {TMT_COLOR,TMT_CAPTIONTEXT,{'C','A','P','T','I','O','N','T','E','X','T','\0'}}, + {TMT_COLOR,TMT_ACTIVEBORDER,{'A','C','T','I','V','E','B','O','R','D','E','R','\0'}}, + {TMT_COLOR,TMT_INACTIVEBORDER,{'I','N','A','C','T','I','V','E','B','O','R','D','E','R','\0'}}, + {TMT_COLOR,TMT_APPWORKSPACE,{'A','P','P','W','O','R','K','S','P','A','C','E','\0'}}, + {TMT_COLOR,TMT_HIGHLIGHT,{'H','I','G','H','L','I','G','H','T','\0'}}, + {TMT_COLOR,TMT_HIGHLIGHTTEXT,{'H','I','G','H','L','I','G','H','T','T','E','X','T','\0'}}, + {TMT_COLOR,TMT_BTNFACE,{'B','T','N','F','A','C','E','\0'}}, + {TMT_COLOR,TMT_BTNSHADOW,{'B','T','N','S','H','A','D','O','W','\0'}}, + {TMT_COLOR,TMT_GRAYTEXT,{'G','R','A','Y','T','E','X','T','\0'}}, + {TMT_COLOR,TMT_BTNTEXT,{'B','T','N','T','E','X','T','\0'}}, + {TMT_COLOR,TMT_INACTIVECAPTIONTEXT,{'I','N','A','C','T','I','V','E','C','A','P','T','I','O','N','T','E','X','T','\0'}}, + {TMT_COLOR,TMT_BTNHIGHLIGHT,{'B','T','N','H','I','G','H','L','I','G','H','T','\0'}}, + {TMT_COLOR,TMT_DKSHADOW3D,{'D','K','S','H','A','D','O','W','3','D','\0'}}, + {TMT_COLOR,TMT_LIGHT3D,{'L','I','G','H','T','3','D','\0'}}, + {TMT_COLOR,TMT_INFOTEXT,{'I','N','F','O','T','E','X','T','\0'}}, + {TMT_COLOR,TMT_INFOBK,{'I','N','F','O','B','K','\0'}}, + {TMT_COLOR,TMT_BUTTONALTERNATEFACE,{'B','U','T','T','O','N','A','L','T','E','R','N','A','T','E','F','A','C','E','\0'}}, + {TMT_COLOR,TMT_HOTTRACKING,{'H','O','T','T','R','A','C','K','I','N','G','\0'}}, + {TMT_COLOR,TMT_GRADIENTACTIVECAPTION,{'G','R','A','D','I','E','N','T','A','C','T','I','V','E','C','A','P','T','I','O','N','\0'}}, + {TMT_COLOR,TMT_GRADIENTINACTIVECAPTION,{'G','R','A','D','I','E','N','T','I','N','A','C','T','I','V','E','C','A','P','T','I','O','N','\0'}}, + {TMT_COLOR,TMT_MENUHILIGHT,{'M','E','N','U','H','I','L','I','G','H','T','\0'}}, + {TMT_COLOR,TMT_MENUBAR,{'M','E','N','U','B','A','R','\0'}}, + {TMT_INT,TMT_FROMHUE1,{'F','R','O','M','H','U','E','1','\0'}}, + {TMT_INT,TMT_FROMHUE2,{'F','R','O','M','H','U','E','2','\0'}}, + {TMT_INT,TMT_FROMHUE3,{'F','R','O','M','H','U','E','3','\0'}}, + {TMT_INT,TMT_FROMHUE4,{'F','R','O','M','H','U','E','4','\0'}}, + {TMT_INT,TMT_FROMHUE5,{'F','R','O','M','H','U','E','5','\0'}}, + {TMT_INT,TMT_TOHUE1,{'T','O','H','U','E','1','\0'}}, + {TMT_INT,TMT_TOHUE2,{'T','O','H','U','E','2','\0'}}, + {TMT_INT,TMT_TOHUE3,{'T','O','H','U','E','3','\0'}}, + {TMT_INT,TMT_TOHUE4,{'T','O','H','U','E','4','\0'}}, + {TMT_INT,TMT_TOHUE5,{'T','O','H','U','E','5','\0'}}, + {TMT_COLOR,TMT_FROMCOLOR1,{'F','R','O','M','C','O','L','O','R','1','\0'}}, + {TMT_COLOR,TMT_FROMCOLOR2,{'F','R','O','M','C','O','L','O','R','2','\0'}}, + {TMT_COLOR,TMT_FROMCOLOR3,{'F','R','O','M','C','O','L','O','R','3','\0'}}, + {TMT_COLOR,TMT_FROMCOLOR4,{'F','R','O','M','C','O','L','O','R','4','\0'}}, + {TMT_COLOR,TMT_FROMCOLOR5,{'F','R','O','M','C','O','L','O','R','5','\0'}}, + {TMT_COLOR,TMT_TOCOLOR1,{'T','O','C','O','L','O','R','1','\0'}}, + {TMT_COLOR,TMT_TOCOLOR2,{'T','O','C','O','L','O','R','2','\0'}}, + {TMT_COLOR,TMT_TOCOLOR3,{'T','O','C','O','L','O','R','3','\0'}}, + {TMT_COLOR,TMT_TOCOLOR4,{'T','O','C','O','L','O','R','4','\0'}}, + {TMT_COLOR,TMT_TOCOLOR5,{'T','O','C','O','L','O','R','5','\0'}}, + {TMT_BOOL,TMT_TRANSPARENT,{'T','R','A','N','S','P','A','R','E','N','T','\0'}}, + {TMT_BOOL,TMT_AUTOSIZE,{'A','U','T','O','S','I','Z','E','\0'}}, + {TMT_BOOL,TMT_BORDERONLY,{'B','O','R','D','E','R','O','N','L','Y','\0'}}, + {TMT_BOOL,TMT_COMPOSITED,{'C','O','M','P','O','S','I','T','E','D','\0'}}, + {TMT_BOOL,TMT_BGFILL,{'B','G','F','I','L','L','\0'}}, + {TMT_BOOL,TMT_GLYPHTRANSPARENT,{'G','L','Y','P','H','T','R','A','N','S','P','A','R','E','N','T','\0'}}, + {TMT_BOOL,TMT_GLYPHONLY,{'G','L','Y','P','H','O','N','L','Y','\0'}}, + {TMT_BOOL,TMT_ALWAYSSHOWSIZINGBAR,{'A','L','W','A','Y','S','S','H','O','W','S','I','Z','I','N','G','B','A','R','\0'}}, + {TMT_BOOL,TMT_MIRRORIMAGE,{'M','I','R','R','O','R','I','M','A','G','E','\0'}}, + {TMT_BOOL,TMT_UNIFORMSIZING,{'U','N','I','F','O','R','M','S','I','Z','I','N','G','\0'}}, + {TMT_BOOL,TMT_INTEGRALSIZING,{'I','N','T','E','G','R','A','L','S','I','Z','I','N','G','\0'}}, + {TMT_BOOL,TMT_SOURCEGROW,{'S','O','U','R','C','E','G','R','O','W','\0'}}, + {TMT_BOOL,TMT_SOURCESHRINK,{'S','O','U','R','C','E','S','H','R','I','N','K','\0'}}, + {TMT_INT,TMT_IMAGECOUNT,{'I','M','A','G','E','C','O','U','N','T','\0'}}, + {TMT_INT,TMT_ALPHALEVEL,{'A','L','P','H','A','L','E','V','E','L','\0'}}, + {TMT_INT,TMT_BORDERSIZE,{'B','O','R','D','E','R','S','I','Z','E','\0'}}, + {TMT_INT,TMT_ROUNDCORNERWIDTH,{'R','O','U','N','D','C','O','R','N','E','R','W','I','D','T','H','\0'}}, + {TMT_INT,TMT_ROUNDCORNERHEIGHT,{'R','O','U','N','D','C','O','R','N','E','R','H','E','I','G','H','T','\0'}}, + {TMT_INT,TMT_GRADIENTRATIO1,{'G','R','A','D','I','E','N','T','R','A','T','I','O','1','\0'}}, + {TMT_INT,TMT_GRADIENTRATIO2,{'G','R','A','D','I','E','N','T','R','A','T','I','O','2','\0'}}, + {TMT_INT,TMT_GRADIENTRATIO3,{'G','R','A','D','I','E','N','T','R','A','T','I','O','3','\0'}}, + {TMT_INT,TMT_GRADIENTRATIO4,{'G','R','A','D','I','E','N','T','R','A','T','I','O','4','\0'}}, + {TMT_INT,TMT_GRADIENTRATIO5,{'G','R','A','D','I','E','N','T','R','A','T','I','O','5','\0'}}, + {TMT_INT,TMT_PROGRESSCHUNKSIZE,{'P','R','O','G','R','E','S','S','C','H','U','N','K','S','I','Z','E','\0'}}, + {TMT_INT,TMT_PROGRESSSPACESIZE,{'P','R','O','G','R','E','S','S','S','P','A','C','E','S','I','Z','E','\0'}}, + {TMT_INT,TMT_SATURATION,{'S','A','T','U','R','A','T','I','O','N','\0'}}, + {TMT_INT,TMT_TEXTBORDERSIZE,{'T','E','X','T','B','O','R','D','E','R','S','I','Z','E','\0'}}, + {TMT_INT,TMT_ALPHATHRESHOLD,{'A','L','P','H','A','T','H','R','E','S','H','O','L','D','\0'}}, + {TMT_SIZE,TMT_WIDTH,{'W','I','D','T','H','\0'}}, + {TMT_SIZE,TMT_HEIGHT,{'H','E','I','G','H','T','\0'}}, + {TMT_INT,TMT_GLYPHINDEX,{'G','L','Y','P','H','I','N','D','E','X','\0'}}, + {TMT_INT,TMT_TRUESIZESTRETCHMARK,{'T','R','U','E','S','I','Z','E','S','T','R','E','T','C','H','M','A','R','K','\0'}}, + {TMT_INT,TMT_MINDPI1,{'M','I','N','D','P','I','1','\0'}}, + {TMT_INT,TMT_MINDPI2,{'M','I','N','D','P','I','2','\0'}}, + {TMT_INT,TMT_MINDPI3,{'M','I','N','D','P','I','3','\0'}}, + {TMT_INT,TMT_MINDPI4,{'M','I','N','D','P','I','4','\0'}}, + {TMT_INT,TMT_MINDPI5,{'M','I','N','D','P','I','5','\0'}}, + {TMT_FONT,TMT_GLYPHFONT,{'G','L','Y','P','H','F','O','N','T','\0'}}, + {TMT_FILENAME,TMT_IMAGEFILE,{'I','M','A','G','E','F','I','L','E','\0'}}, + {TMT_FILENAME,TMT_IMAGEFILE1,{'I','M','A','G','E','F','I','L','E','1','\0'}}, + {TMT_FILENAME,TMT_IMAGEFILE2,{'I','M','A','G','E','F','I','L','E','2','\0'}}, + {TMT_FILENAME,TMT_IMAGEFILE3,{'I','M','A','G','E','F','I','L','E','3','\0'}}, + {TMT_FILENAME,TMT_IMAGEFILE4,{'I','M','A','G','E','F','I','L','E','4','\0'}}, + {TMT_FILENAME,TMT_IMAGEFILE5,{'I','M','A','G','E','F','I','L','E','5','\0'}}, + {TMT_FILENAME,TMT_STOCKIMAGEFILE,{'S','T','O','C','K','I','M','A','G','E','F','I','L','E','\0'}}, + {TMT_FILENAME,TMT_GLYPHIMAGEFILE,{'G','L','Y','P','H','I','M','A','G','E','F','I','L','E','\0'}}, + {TMT_STRING,TMT_TEXT,{'T','E','X','T','\0'}}, + {TMT_POSITION,TMT_OFFSET,{'O','F','F','S','E','T','\0'}}, + {TMT_POSITION,TMT_TEXTSHADOWOFFSET,{'T','E','X','T','S','H','A','D','O','W','O','F','F','S','E','T','\0'}}, + {TMT_POSITION,TMT_MINSIZE,{'M','I','N','S','I','Z','E','\0'}}, + {TMT_POSITION,TMT_MINSIZE1,{'M','I','N','S','I','Z','E','1','\0'}}, + {TMT_POSITION,TMT_MINSIZE2,{'M','I','N','S','I','Z','E','2','\0'}}, + {TMT_POSITION,TMT_MINSIZE3,{'M','I','N','S','I','Z','E','3','\0'}}, + {TMT_POSITION,TMT_MINSIZE4,{'M','I','N','S','I','Z','E','4','\0'}}, + {TMT_POSITION,TMT_MINSIZE5,{'M','I','N','S','I','Z','E','5','\0'}}, + {TMT_POSITION,TMT_NORMALSIZE,{'N','O','R','M','A','L','S','I','Z','E','\0'}}, + {TMT_MARGINS,TMT_SIZINGMARGINS,{'S','I','Z','I','N','G','M','A','R','G','I','N','S','\0'}}, + {TMT_MARGINS,TMT_CONTENTMARGINS,{'C','O','N','T','E','N','T','M','A','R','G','I','N','S','\0'}}, + {TMT_MARGINS,TMT_CAPTIONMARGINS,{'C','A','P','T','I','O','N','M','A','R','G','I','N','S','\0'}}, + {TMT_COLOR,TMT_BORDERCOLOR,{'B','O','R','D','E','R','C','O','L','O','R','\0'}}, + {TMT_COLOR,TMT_FILLCOLOR,{'F','I','L','L','C','O','L','O','R','\0'}}, + {TMT_COLOR,TMT_TEXTCOLOR,{'T','E','X','T','C','O','L','O','R','\0'}}, + {TMT_COLOR,TMT_EDGELIGHTCOLOR,{'E','D','G','E','L','I','G','H','T','C','O','L','O','R','\0'}}, + {TMT_COLOR,TMT_EDGEHIGHLIGHTCOLOR,{'E','D','G','E','H','I','G','H','L','I','G','H','T','C','O','L','O','R','\0'}}, + {TMT_COLOR,TMT_EDGESHADOWCOLOR,{'E','D','G','E','S','H','A','D','O','W','C','O','L','O','R','\0'}}, + {TMT_COLOR,TMT_EDGEDKSHADOWCOLOR,{'E','D','G','E','D','K','S','H','A','D','O','W','C','O','L','O','R','\0'}}, + {TMT_COLOR,TMT_EDGEFILLCOLOR,{'E','D','G','E','F','I','L','L','C','O','L','O','R','\0'}}, + {TMT_COLOR,TMT_TRANSPARENTCOLOR,{'T','R','A','N','S','P','A','R','E','N','T','C','O','L','O','R','\0'}}, + {TMT_COLOR,TMT_GRADIENTCOLOR1,{'G','R','A','D','I','E','N','T','C','O','L','O','R','1','\0'}}, + {TMT_COLOR,TMT_GRADIENTCOLOR2,{'G','R','A','D','I','E','N','T','C','O','L','O','R','2','\0'}}, + {TMT_COLOR,TMT_GRADIENTCOLOR3,{'G','R','A','D','I','E','N','T','C','O','L','O','R','3','\0'}}, + {TMT_COLOR,TMT_GRADIENTCOLOR4,{'G','R','A','D','I','E','N','T','C','O','L','O','R','4','\0'}}, + {TMT_COLOR,TMT_GRADIENTCOLOR5,{'G','R','A','D','I','E','N','T','C','O','L','O','R','5','\0'}}, + {TMT_COLOR,TMT_SHADOWCOLOR,{'S','H','A','D','O','W','C','O','L','O','R','\0'}}, + {TMT_COLOR,TMT_GLOWCOLOR,{'G','L','O','W','C','O','L','O','R','\0'}}, + {TMT_COLOR,TMT_TEXTBORDERCOLOR,{'T','E','X','T','B','O','R','D','E','R','C','O','L','O','R','\0'}}, + {TMT_COLOR,TMT_TEXTSHADOWCOLOR,{'T','E','X','T','S','H','A','D','O','W','C','O','L','O','R','\0'}}, + {TMT_COLOR,TMT_GLYPHTEXTCOLOR,{'G','L','Y','P','H','T','E','X','T','C','O','L','O','R','\0'}}, + {TMT_COLOR,TMT_GLYPHTRANSPARENTCOLOR,{'G','L','Y','P','H','T','R','A','N','S','P','A','R','E','N','T','C','O','L','O','R','\0'}}, + {TMT_COLOR,TMT_FILLCOLORHINT,{'F','I','L','L','C','O','L','O','R','H','I','N','T','\0'}}, + {TMT_COLOR,TMT_BORDERCOLORHINT,{'B','O','R','D','E','R','C','O','L','O','R','H','I','N','T','\0'}}, + {TMT_COLOR,TMT_ACCENTCOLORHINT,{'A','C','C','E','N','T','C','O','L','O','R','H','I','N','T','\0'}}, + {TMT_ENUM,TMT_BGTYPE,{'B','G','T','Y','P','E','\0'}}, + {TMT_ENUM,TMT_BORDERTYPE,{'B','O','R','D','E','R','T','Y','P','E','\0'}}, + {TMT_ENUM,TMT_FILLTYPE,{'F','I','L','L','T','Y','P','E','\0'}}, + {TMT_ENUM,TMT_SIZINGTYPE,{'S','I','Z','I','N','G','T','Y','P','E','\0'}}, + {TMT_ENUM,TMT_HALIGN,{'H','A','L','I','G','N','\0'}}, + {TMT_ENUM,TMT_CONTENTALIGNMENT,{'C','O','N','T','E','N','T','A','L','I','G','N','M','E','N','T','\0'}}, + {TMT_ENUM,TMT_VALIGN,{'V','A','L','I','G','N','\0'}}, + {TMT_ENUM,TMT_OFFSETTYPE,{'O','F','F','S','E','T','T','Y','P','E','\0'}}, + {TMT_ENUM,TMT_ICONEFFECT,{'I','C','O','N','E','F','F','E','C','T','\0'}}, + {TMT_ENUM,TMT_TEXTSHADOWTYPE,{'T','E','X','T','S','H','A','D','O','W','T','Y','P','E','\0'}}, + {TMT_ENUM,TMT_IMAGELAYOUT,{'I','M','A','G','E','L','A','Y','O','U','T','\0'}}, + {TMT_ENUM,TMT_GLYPHTYPE,{'G','L','Y','P','H','T','Y','P','E','\0'}}, + {TMT_ENUM,TMT_IMAGESELECTTYPE,{'I','M','A','G','E','S','E','L','E','C','T','T','Y','P','E','\0'}}, + {TMT_ENUM,TMT_GLYPHFONTSIZINGTYPE,{'G','L','Y','P','H','F','O','N','T','S','I','Z','I','N','G','T','Y','P','E','\0'}}, + {TMT_ENUM,TMT_TRUESIZESCALINGTYPE,{'T','R','U','E','S','I','Z','E','S','C','A','L','I','N','G','T','Y','P','E','\0'}}, + {TMT_BOOL,TMT_USERPICTURE,{'U','S','E','R','P','I','C','T','U','R','E','\0'}}, + {TMT_RECT,TMT_DEFAULTPANESIZE,{'D','E','F','A','U','L','T','P','A','N','E','S','I','Z','E','\0'}}, + {TMT_COLOR,TMT_BLENDCOLOR,{'B','L','E','N','D','C','O','L','O','R','\0'}}, + {0,0,{'\0'}} +}; + +/*********************************************************************** + * Map strings to enumeration values + * Enum,Value,ValueName + */ +static const MSSTYLES_ENUM_MAP mapEnum[] = { + {TMT_BGTYPE,BT_IMAGEFILE,{'I','M','A','G','E','F','I','L','E','\0'}}, + {TMT_BGTYPE,BT_BORDERFILL,{'B','O','R','D','E','R','F','I','L','L','\0'}}, + {TMT_BGTYPE,BT_NONE,{'N','O','N','E','\0'}}, + {TMT_IMAGELAYOUT,IL_VERTICAL,{'V','E','R','T','I','C','A','L','\0'}}, + {TMT_IMAGELAYOUT,IL_HORIZONTAL,{'H','O','R','I','Z','O','N','T','A','L','\0'}}, + {TMT_BORDERTYPE,BT_RECT,{'R','E','C','T','\0'}}, + {TMT_BORDERTYPE,BT_ROUNDRECT,{'R','O','U','N','D','R','E','C','T','\0'}}, + {TMT_BORDERTYPE,BT_ELLIPSE,{'E','L','L','I','P','S','E','\0'}}, + {TMT_FILLTYPE,FT_SOLID,{'S','O','L','I','D','\0'}}, + {TMT_FILLTYPE,FT_VERTGRADIENT,{'V','E','R','T','G','R','A','D','I','E','N','T','\0'}}, + {TMT_FILLTYPE,FT_HORZGRADIENT,{'H','O','R','Z','G','R','A','D','I','E','N','T','\0'}}, + {TMT_FILLTYPE,FT_RADIALGRADIENT,{'R','A','D','I','A','L','G','R','A','D','I','E','N','T','\0'}}, + {TMT_FILLTYPE,FT_TILEIMAGE,{'T','I','L','E','I','M','A','G','E','\0'}}, + {TMT_SIZINGTYPE,ST_TRUESIZE,{'T','R','U','E','S','I','Z','E','\0'}}, + {TMT_SIZINGTYPE,ST_STRETCH,{'S','T','R','E','T','C','H','\0'}}, + {TMT_SIZINGTYPE,ST_TILE,{'T','I','L','E','\0'}}, + {TMT_HALIGN,HA_LEFT,{'L','E','F','T','\0'}}, + {TMT_HALIGN,HA_CENTER,{'C','E','N','T','E','R','\0'}}, + {TMT_HALIGN,HA_RIGHT,{'R','I','G','H','T','\0'}}, + {TMT_CONTENTALIGNMENT,CA_LEFT,{'L','E','F','T','\0'}}, + {TMT_CONTENTALIGNMENT,CA_CENTER,{'C','E','N','T','E','R','\0'}}, + {TMT_CONTENTALIGNMENT,CA_RIGHT,{'R','I','G','H','T','\0'}}, + {TMT_VALIGN,VA_TOP,{'T','O','P','\0'}}, + {TMT_VALIGN,VA_CENTER,{'C','E','N','T','E','R','\0'}}, + {TMT_VALIGN,VA_BOTTOM,{'B','O','T','T','O','M','\0'}}, + {TMT_OFFSETTYPE,OT_TOPLEFT,{'T','O','P','L','E','F','T','\0'}}, + {TMT_OFFSETTYPE,OT_TOPRIGHT,{'T','O','P','R','I','G','H','T','\0'}}, + {TMT_OFFSETTYPE,OT_TOPMIDDLE,{'T','O','P','M','I','D','D','L','E','\0'}}, + {TMT_OFFSETTYPE,OT_BOTTOMLEFT,{'B','O','T','T','O','M','L','E','F','T','\0'}}, + {TMT_OFFSETTYPE,OT_BOTTOMRIGHT,{'B','O','T','T','O','M','R','I','G','H','T','\0'}}, + {TMT_OFFSETTYPE,OT_BOTTOMMIDDLE,{'B','O','T','T','O','M','M','I','D','D','L','E','\0'}}, + {TMT_OFFSETTYPE,OT_MIDDLELEFT,{'M','I','D','D','L','E','L','E','F','T','\0'}}, + {TMT_OFFSETTYPE,OT_MIDDLERIGHT,{'M','I','D','D','L','E','R','I','G','H','T','\0'}}, + {TMT_OFFSETTYPE,OT_LEFTOFCAPTION,{'L','E','F','T','O','F','C','A','P','T','I','O','N','\0'}}, + {TMT_OFFSETTYPE,OT_RIGHTOFCAPTION,{'R','I','G','H','T','O','F','C','A','P','T','I','O','N','\0'}}, + {TMT_OFFSETTYPE,OT_LEFTOFLASTBUTTON,{'L','E','F','T','O','F','L','A','S','T','B','U','T','T','O','N','\0'}}, + {TMT_OFFSETTYPE,OT_RIGHTOFLASTBUTTON,{'R','I','G','H','T','O','F','L','A','S','T','B','U','T','T','O','N','\0'}}, + {TMT_OFFSETTYPE,OT_ABOVELASTBUTTON,{'A','B','O','V','E','L','A','S','T','B','U','T','T','O','N','\0'}}, + {TMT_OFFSETTYPE,OT_BELOWLASTBUTTON,{'B','E','L','O','W','L','A','S','T','B','U','T','T','O','N','\0'}}, + {TMT_ICONEFFECT,ICE_NONE,{'N','O','N','E','\0'}}, + {TMT_ICONEFFECT,ICE_GLOW,{'G','L','O','W','\0'}}, + {TMT_ICONEFFECT,ICE_SHADOW,{'S','H','A','D','O','W','\0'}}, + {TMT_ICONEFFECT,ICE_PULSE,{'P','U','L','S','E','\0'}}, + {TMT_ICONEFFECT,ICE_ALPHA,{'A','L','P','H','A','\0'}}, + {TMT_TEXTSHADOWTYPE,TST_NONE,{'N','O','N','E','\0'}}, + {TMT_TEXTSHADOWTYPE,TST_SINGLE,{'S','I','N','G','L','E','\0'}}, + {TMT_TEXTSHADOWTYPE,TST_CONTINUOUS,{'C','O','N','T','I','N','U','O','U','S','\0'}}, + {TMT_GLYPHTYPE,GT_NONE,{'N','O','N','E','\0'}}, + {TMT_GLYPHTYPE,GT_IMAGEGLYPH,{'I','M','A','G','E','G','L','Y','P','H','\0'}}, + {TMT_GLYPHTYPE,GT_FONTGLYPH,{'F','O','N','T','G','L','Y','P','H','\0'}}, + {TMT_IMAGESELECTTYPE,IST_NONE,{'N','O','N','E','\0'}}, + {TMT_IMAGESELECTTYPE,IST_SIZE,{'S','I','Z','E','\0'}}, + {TMT_IMAGESELECTTYPE,IST_DPI,{'D','P','I','\0'}}, + {TMT_TRUESIZESCALINGTYPE,TSST_NONE,{'N','O','N','E','\0'}}, + {TMT_TRUESIZESCALINGTYPE,TSST_SIZE,{'S','I','Z','E','\0'}}, + {TMT_TRUESIZESCALINGTYPE,TSST_DPI,{'D','P','I','\0'}}, + {TMT_GLYPHFONTSIZINGTYPE,GFST_NONE,{'N','O','N','E','\0'}}, + {TMT_GLYPHFONTSIZINGTYPE,GFST_SIZE,{'S','I','Z','E','\0'}}, + {TMT_GLYPHFONTSIZINGTYPE,GFST_DPI,{'D','P','I','\0'}}, + {0,0,{'\0'}} +}; + + +/*********************************************************************** + * Classes defined below + * Defined as PartID,StateID,TextName + * If StateID == 0 then its a part being defined + */ + +/* These are globals to all classes, but its treated as a seperate class */ +static const MSSTYLES_CLASS_MAP classGlobals[] = { + {GP_BORDER,0,{'B','O','R','D','E','R','\0'}}, + {GP_BORDER,BSS_FLAT,{'F','L','A','T','\0'}}, + {GP_BORDER,BSS_RAISED,{'R','A','I','S','E','D','\0'}}, + {GP_BORDER,BSS_SUNKEN,{'S','U','N','K','E','N','\0'}}, + {GP_LINEHORZ,0,{'L','I','N','E','H','O','R','Z','\0'}}, + {GP_LINEHORZ,LHS_FLAT,{'F','L','A','T','\0'}}, + {GP_LINEHORZ,LHS_RAISED,{'R','A','I','S','E','D','\0'}}, + {GP_LINEHORZ,LHS_SUNKEN,{'S','U','N','K','E','N','\0'}}, + {GP_LINEVERT,0,{'L','I','N','E','V','E','R','T','\0'}}, + {GP_LINEVERT,LVS_FLAT,{'F','L','A','T','\0'}}, + {GP_LINEVERT,LVS_RAISED,{'R','A','I','S','E','D','\0'}}, + {GP_LINEVERT,LVS_SUNKEN,{'S','U','N','K','E','N','\0'}}, + {0,0,{'\0'}} +}; + +static const MSSTYLES_CLASS_MAP classButton[] = { + {BP_PUSHBUTTON,0,{'P','U','S','H','B','U','T','T','O','N','\0'}}, + {BP_PUSHBUTTON,PBS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {BP_PUSHBUTTON,PBS_HOT,{'H','O','T','\0'}}, + {BP_PUSHBUTTON,PBS_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {BP_PUSHBUTTON,PBS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {BP_PUSHBUTTON,PBS_DEFAULTED,{'D','E','F','A','U','L','T','E','D','\0'}}, + {BP_RADIOBUTTON,0,{'R','A','D','I','O','B','U','T','T','O','N','\0'}}, + {BP_RADIOBUTTON,RBS_UNCHECKEDNORMAL,{'U','N','C','H','E','C','K','E','D','N','O','R','M','A','L','\0'}}, + {BP_RADIOBUTTON,RBS_UNCHECEDHOT,{'U','N','C','H','E','C','E','D','H','O','T','\0'}}, + {BP_RADIOBUTTON,RBS_UNCHECKEDPRESSED,{'U','N','C','H','E','C','K','E','D','P','R','E','S','S','E','D','\0'}}, + {BP_RADIOBUTTON,RBS_UNCHECKEDDISABLED,{'U','N','C','H','E','C','K','E','D','D','I','S','A','B','L','E','D','\0'}}, + {BP_RADIOBUTTON,RBS_CHECKEDNORMAL,{'C','H','E','C','K','E','D','N','O','R','M','A','L','\0'}}, + {BP_RADIOBUTTON,RBS_CHECKEDHOT,{'C','H','E','C','K','E','D','H','O','T','\0'}}, + {BP_RADIOBUTTON,RBS_CHECKEDPRESSED,{'C','H','E','C','K','E','D','P','R','E','S','S','E','D','\0'}}, + {BP_RADIOBUTTON,RBS_CHECKEDDISABLED,{'C','H','E','C','K','E','D','D','I','S','A','B','L','E','D','\0'}}, + {BP_CHECKBOX,0,{'C','H','E','C','K','B','O','X','\0'}}, + {BP_RADIOBUTTON,CBS_UNCHECKEDNORMAL,{'U','N','C','H','E','C','K','E','D','N','O','R','M','A','L','\0'}}, + {BP_RADIOBUTTON,CBS_UNCHECKEDHOT,{'U','N','C','H','E','C','K','E','D','H','O','T','\0'}}, + {BP_RADIOBUTTON,CBS_UNCHECKEDPRESSED,{'U','N','C','H','E','C','K','E','D','P','R','E','S','S','E','D','\0'}}, + {BP_RADIOBUTTON,CBS_UNCHECKEDDISABLED,{'U','N','C','H','E','C','K','E','D','D','I','S','A','B','L','E','D','\0'}}, + {BP_RADIOBUTTON,CBS_CHECKEDNORMAL,{'C','H','E','C','K','E','D','N','O','R','M','A','L','\0'}}, + {BP_RADIOBUTTON,CBS_CHECKEDHOT,{'C','H','E','C','K','E','D','H','O','T','\0'}}, + {BP_RADIOBUTTON,CBS_CHECKEDPRESSED,{'C','H','E','C','K','E','D','P','R','E','S','S','E','D','\0'}}, + {BP_RADIOBUTTON,CBS_CHECKEDDISABLED,{'C','H','E','C','K','E','D','D','I','S','A','B','L','E','D','\0'}}, + {BP_RADIOBUTTON,CBS_MIXEDNORMAL,{'M','I','X','E','D','N','O','R','M','A','L','\0'}}, + {BP_RADIOBUTTON,CBS_MIXEDHOT,{'M','I','X','E','D','H','O','T','\0'}}, + {BP_RADIOBUTTON,CBS_MIXEDPRESSED,{'M','I','X','E','D','P','R','E','S','S','E','D','\0'}}, + {BP_RADIOBUTTON,CBS_MIXEDDISABLED,{'M','I','X','E','D','D','I','S','A','B','L','E','D','\0'}}, + {BP_GROUPBOX,0,{'G','R','O','U','P','B','O','X','\0'}}, + {BP_RADIOBUTTON,GBS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {BP_RADIOBUTTON,GBS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {BP_USERBUTTON,0,{'U','S','E','R','B','U','T','T','O','N','\0'}}, + {0,0,{'\0'}} +}; + +static const MSSTYLES_CLASS_MAP classClock[] = { + {CLP_TIME,0,{'T','I','M','E','\0'}}, + {CLP_TIME,CLS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {0,0,{'\0'}} +}; + +static const MSSTYLES_CLASS_MAP classCombobox[] = { + {CP_DROPDOWNBUTTON,0,{'D','R','O','P','D','O','W','N','B','U','T','T','O','N','\0'}}, + {CP_DROPDOWNBUTTON,CBXS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {CP_DROPDOWNBUTTON,CBXS_HOT,{'H','O','T','\0'}}, + {CP_DROPDOWNBUTTON,CBXS_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {CP_DROPDOWNBUTTON,CBXS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {0,0,{'\0'}} +}; + +static const MSSTYLES_CLASS_MAP classEdit[] = { + {EP_EDITTEXT,0,{'E','D','I','T','T','E','X','T','\0'}}, + {EP_EDITTEXT,ETS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {EP_EDITTEXT,ETS_HOT,{'H','O','T','\0'}}, + {EP_EDITTEXT,ETS_SELECTED,{'S','E','L','E','C','T','E','D','\0'}}, + {EP_EDITTEXT,ETS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {EP_EDITTEXT,ETS_FOCUSED,{'F','O','C','U','S','E','D','\0'}}, + {EP_EDITTEXT,ETS_READONLY,{'R','E','A','D','O','N','L','Y','\0'}}, + {EP_EDITTEXT,ETS_ASSIST,{'A','S','S','I','S','T','\0'}}, + {EP_CARET,0,{'C','A','R','E','T','\0'}}, + {0,0,{'\0'}} +}; + +static const MSSTYLES_CLASS_MAP classExplorerbar[] = { + {EBP_HEADERBACKGROUND,0,{'H','E','A','D','E','R','B','A','C','K','G','R','O','U','N','D','\0'}}, + {EBP_HEADERCLOSE,0,{'H','E','A','D','E','R','C','L','O','S','E','\0'}}, + {EBP_HEADERCLOSE,EBHC_NORMAL,{'N','O','R','M','A','L','\0'}}, + {EBP_HEADERCLOSE,EBHC_HOT,{'H','O','T','\0'}}, + {EBP_HEADERCLOSE,EBHC_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {EBP_HEADERPIN,0,{'H','E','A','D','E','R','P','I','N','\0'}}, + {EBP_HEADERPIN,EBHP_NORMAL,{'N','O','R','M','A','L','\0'}}, + {EBP_HEADERPIN,EBHP_HOT,{'H','O','T','\0'}}, + {EBP_HEADERPIN,EBHP_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {EBP_HEADERPIN,EBHP_SELECTEDNORMAL,{'S','E','L','E','C','T','E','D','N','O','R','M','A','L','\0'}}, + {EBP_HEADERPIN,EBHP_SELECTEDHOT,{'S','E','L','E','C','T','E','D','H','O','T','\0'}}, + {EBP_HEADERPIN,EBHP_SELECTEDPRESSED,{'S','E','L','E','C','T','E','D','P','R','E','S','S','E','D','\0'}}, + {EBP_IEBARMENU,0,{'I','E','B','A','R','M','E','N','U','\0'}}, + {EBP_IEBARMENU,EBM_NORMAL,{'N','O','R','M','A','L','\0'}}, + {EBP_IEBARMENU,EBM_HOT,{'H','O','T','\0'}}, + {EBP_IEBARMENU,EBM_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {EBP_NORMALGROUPBACKGROUND,0,{'N','O','R','M','A','L','G','R','O','U','P','B','A','C','K','G','R','O','U','N','D','\0'}}, + {EBP_NORMALGROUPCOLLAPSE,0,{'N','O','R','M','A','L','G','R','O','U','P','C','O','L','L','A','P','S','E','\0'}}, + {EBP_NORMALGROUPCOLLAPSE,EBNGC_NORMAL,{'N','O','R','M','A','L','\0'}}, + {EBP_NORMALGROUPCOLLAPSE,EBNGC_HOT,{'H','O','T','\0'}}, + {EBP_NORMALGROUPCOLLAPSE,EBNGC_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {EBP_NORMALGROUPEXPAND,0,{'N','O','R','M','A','L','G','R','O','U','P','E','X','P','A','N','D','\0'}}, + {EBP_NORMALGROUPEXPAND,EBNGE_NORMAL,{'N','O','R','M','A','L','\0'}}, + {EBP_NORMALGROUPEXPAND,EBNGE_HOT,{'H','O','T','\0'}}, + {EBP_NORMALGROUPEXPAND,EBNGE_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {EBP_NORMALGROUPHEAD,0,{'N','O','R','M','A','L','G','R','O','U','P','H','E','A','D','\0'}}, + {EBP_SPECIALGROUPBACKGROUND,0,{'S','P','E','C','I','A','L','G','R','O','U','P','B','A','C','K','G','R','O','U','N','D','\0'}}, + {EBP_SPECIALGROUPCOLLAPSE,0,{'S','P','E','C','I','A','L','G','R','O','U','P','C','O','L','L','A','P','S','E','\0'}}, + {EBP_SPECIALGROUPCOLLAPSE,EBSGC_NORMAL,{'N','O','R','M','A','L','\0'}}, + {EBP_SPECIALGROUPCOLLAPSE,EBSGC_HOT,{'H','O','T','\0'}}, + {EBP_SPECIALGROUPCOLLAPSE,EBSGC_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {EBP_SPECIALGROUPEXPAND,0,{'S','P','E','C','I','A','L','G','R','O','U','P','E','X','P','A','N','D','\0'}}, + {EBP_SPECIALGROUPEXPAND,EBSGE_NORMAL,{'N','O','R','M','A','L','\0'}}, + {EBP_SPECIALGROUPEXPAND,EBSGE_HOT,{'H','O','T','\0'}}, + {EBP_SPECIALGROUPEXPAND,EBSGE_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {EBP_SPECIALGROUPHEAD,0,{'S','P','E','C','I','A','L','G','R','O','U','P','H','E','A','D','\0'}}, + {0,0,{'\0'}} +}; + +static const MSSTYLES_CLASS_MAP classHeader[] = { + {HP_HEADERITEM,0,{'H','E','A','D','E','R','I','T','E','M','\0'}}, + {HP_HEADERITEM,HIS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {HP_HEADERITEM,HIS_HOT,{'H','O','T','\0'}}, + {HP_HEADERITEM,HIS_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {HP_HEADERITEMLEFT,0,{'H','E','A','D','E','R','I','T','E','M','L','E','F','T','\0'}}, + {HP_HEADERITEMLEFT,HILS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {HP_HEADERITEMLEFT,HILS_HOT,{'H','O','T','\0'}}, + {HP_HEADERITEMLEFT,HILS_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {HP_HEADERITEMRIGHT,0,{'H','E','A','D','E','R','I','T','E','M','R','I','G','H','T','\0'}}, + {HP_HEADERITEMRIGHT,HIRS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {HP_HEADERITEMRIGHT,HIRS_HOT,{'H','O','T','\0'}}, + {HP_HEADERITEMRIGHT,HIRS_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {HP_HEADERSORTARROW,0,{'H','E','A','D','E','R','S','O','R','T','A','R','R','O','W','\0'}}, + {HP_HEADERSORTARROW,HSAS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {HP_HEADERSORTARROW,HSAS_HOT,{'H','O','T','\0'}}, + {HP_HEADERSORTARROW,HSAS_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {0,0,{'\0'}} +}; + +static const MSSTYLES_CLASS_MAP classListview[] = { + {LVP_LISTITEM,0,{'L','I','S','T','I','T','E','M','\0'}}, + {LVP_LISTITEM,LIS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {LVP_LISTITEM,LIS_HOT,{'H','O','T','\0'}}, + {LVP_LISTITEM,LIS_SELECTED,{'S','E','L','E','C','T','E','D','\0'}}, + {LVP_LISTITEM,LIS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {LVP_LISTITEM,LIS_SELECTEDNOTFOCUS,{'S','E','L','E','C','T','E','D','N','O','T','F','O','C','U','S','\0'}}, + {LVP_LISTGROUP,0,{'L','I','S','T','G','R','O','U','P','\0'}}, + {LVP_LISTDETAIL,0,{'L','I','S','T','D','E','T','A','I','L','\0'}}, + {LVP_LISTSORTEDDETAIL,0,{'L','I','S','T','S','O','R','T','E','D','D','E','T','A','I','L','\0'}}, + {LVP_EMPTYTEXT,0,{'E','M','P','T','Y','T','E','X','T','\0'}}, + {0,0,{'\0'}} +}; + +static const MSSTYLES_CLASS_MAP classMenu[] = { + {MP_MENUITEM,0,{'M','E','N','U','I','T','E','M','\0'}}, + {MP_MENUITEM,MS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {MP_MENUITEM,MS_SELECTED,{'S','E','L','E','C','T','E','D','\0'}}, + {MP_MENUITEM,MS_DEMOTED,{'D','E','M','O','T','E','D','\0'}}, + {MP_MENUDROPDOWN,0,{'M','E','N','U','D','R','O','P','D','O','W','N','\0'}}, + {MP_MENUDROPDOWN,MS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {MP_MENUDROPDOWN,MS_SELECTED,{'S','E','L','E','C','T','E','D','\0'}}, + {MP_MENUDROPDOWN,MS_DEMOTED,{'D','E','M','O','T','E','D','\0'}}, + {MP_MENUBARITEM,0,{'M','E','N','U','B','A','R','I','T','E','M','\0'}}, + {MP_MENUBARITEM,MS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {MP_MENUBARITEM,MS_SELECTED,{'S','E','L','E','C','T','E','D','\0'}}, + {MP_MENUBARITEM,MS_DEMOTED,{'D','E','M','O','T','E','D','\0'}}, + {MP_MENUBARDROPDOWN,0,{'M','E','N','U','B','A','R','D','R','O','P','D','O','W','N','\0'}}, + {MP_MENUBARDROPDOWN,MS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {MP_MENUBARDROPDOWN,MS_SELECTED,{'S','E','L','E','C','T','E','D','\0'}}, + {MP_MENUBARDROPDOWN,MS_DEMOTED,{'D','E','M','O','T','E','D','\0'}}, + {MP_CHEVRON,0,{'C','H','E','V','R','O','N','\0'}}, + {MP_CHEVRON,MS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {MP_CHEVRON,MS_SELECTED,{'S','E','L','E','C','T','E','D','\0'}}, + {MP_CHEVRON,MS_DEMOTED,{'D','E','M','O','T','E','D','\0'}}, + {MP_SEPARATOR,0,{'S','E','P','A','R','A','T','O','R','\0'}}, + {MP_SEPARATOR,MS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {MP_SEPARATOR,MS_SELECTED,{'S','E','L','E','C','T','E','D','\0'}}, + {MP_SEPARATOR,MS_DEMOTED,{'D','E','M','O','T','E','D','\0'}}, + {0,0,{'\0'}} +}; + +static const MSSTYLES_CLASS_MAP classMenuband[] = { + {MDP_NEWAPPBUTTON,0,{'N','E','W','A','P','P','B','U','T','T','O','N','\0'}}, + {MDP_NEWAPPBUTTON,MDS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {MDP_NEWAPPBUTTON,MDS_HOT,{'H','O','T','\0'}}, + {MDP_NEWAPPBUTTON,MDS_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {MDP_NEWAPPBUTTON,MDS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {MDP_NEWAPPBUTTON,MDS_CHECKED,{'C','H','E','C','K','E','D','\0'}}, + {MDP_NEWAPPBUTTON,MDS_HOTCHECKED,{'H','O','T','C','H','E','C','K','E','D','\0'}}, + {MDP_SEPERATOR,0,{'S','E','P','E','R','A','T','O','R','\0'}}, + {0,0,{'\0'}} +}; + +static const MSSTYLES_CLASS_MAP classPage[] = { + {PGRP_UP,0,{'U','P','\0'}}, + {PGRP_UP,UPS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {PGRP_UP,UPS_HOT,{'H','O','T','\0'}}, + {PGRP_UP,UPS_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {PGRP_UP,UPS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {PGRP_DOWN,0,{'D','O','W','N','\0'}}, + {PGRP_DOWN,DNS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {PGRP_DOWN,DNS_HOT,{'H','O','T','\0'}}, + {PGRP_DOWN,DNS_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {PGRP_DOWN,DNS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {PGRP_UPHORZ,0,{'U','P','H','O','R','Z','\0'}}, + {PGRP_UPHORZ,UPHZS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {PGRP_UPHORZ,UPHZS_HOT,{'H','O','T','\0'}}, + {PGRP_UPHORZ,UPHZS_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {PGRP_UPHORZ,UPHZS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {PGRP_DOWNHORZ,0,{'D','O','W','N','H','O','R','Z','\0'}}, + {PGRP_DOWNHORZ,DNHZS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {PGRP_DOWNHORZ,DNHZS_HOT,{'H','O','T','\0'}}, + {PGRP_DOWNHORZ,DNHZS_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {PGRP_DOWNHORZ,DNHZS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {0,0,{'\0'}} +}; + +static const MSSTYLES_CLASS_MAP classProgress[] = { + {PP_BAR,0,{'B','A','R','\0'}}, + {PP_BARVERT,0,{'B','A','R','V','E','R','T','\0'}}, + {PP_CHUNK,0,{'C','H','U','N','K','\0'}}, + {PP_CHUNKVERT,0,{'C','H','U','N','K','V','E','R','T','\0'}}, + {0,0,{'\0'}} +}; + +static const MSSTYLES_CLASS_MAP classRebar[] = { + {RP_GRIPPER,0,{'G','R','I','P','P','E','R','\0'}}, + {RP_GRIPPERVERT,0,{'G','R','I','P','P','E','R','V','E','R','T','\0'}}, + {RP_BAND,0,{'B','A','N','D','\0'}}, + {RP_CHEVRON,0,{'C','H','E','V','R','O','N','\0'}}, + {RP_CHEVRON,CHEVS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {RP_CHEVRON,CHEVS_HOT,{'H','O','T','\0'}}, + {RP_CHEVRON,CHEVS_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {RP_CHEVRONVERT,0,{'C','H','E','V','R','O','N','V','E','R','T','\0'}}, + {0,0,{'\0'}} +}; + +static const MSSTYLES_CLASS_MAP classScrollbar[] = { + {SBP_ARROWBTN,0,{'A','R','R','O','W','B','T','N','\0'}}, + {SBP_ARROWBTN,ABS_UPNORMAL,{'U','P','N','O','R','M','A','L','\0'}}, + {SBP_ARROWBTN,ABS_UPHOT,{'U','P','H','O','T','\0'}}, + {SBP_ARROWBTN,ABS_UPPRESSED,{'U','P','P','R','E','S','S','E','D','\0'}}, + {SBP_ARROWBTN,ABS_UPDISABLED,{'U','P','D','I','S','A','B','L','E','D','\0'}}, + {SBP_ARROWBTN,ABS_DOWNNORMAL,{'D','O','W','N','N','O','R','M','A','L','\0'}}, + {SBP_ARROWBTN,ABS_DOWNHOT,{'D','O','W','N','H','O','T','\0'}}, + {SBP_ARROWBTN,ABS_DOWNPRESSED,{'D','O','W','N','P','R','E','S','S','E','D','\0'}}, + {SBP_ARROWBTN,ABS_DOWNDISABLED,{'D','O','W','N','D','I','S','A','B','L','E','D','\0'}}, + {SBP_ARROWBTN,ABS_LEFTNORMAL,{'L','E','F','T','N','O','R','M','A','L','\0'}}, + {SBP_ARROWBTN,ABS_LEFTHOT,{'L','E','F','T','H','O','T','\0'}}, + {SBP_ARROWBTN,ABS_LEFTPRESSED,{'L','E','F','T','P','R','E','S','S','E','D','\0'}}, + {SBP_ARROWBTN,ABS_LEFTDISABLED,{'L','E','F','T','D','I','S','A','B','L','E','D','\0'}}, + {SBP_ARROWBTN,ABS_RIGHTNORMAL,{'R','I','G','H','T','N','O','R','M','A','L','\0'}}, + {SBP_ARROWBTN,ABS_RIGHTHOT,{'R','I','G','H','T','H','O','T','\0'}}, + {SBP_ARROWBTN,ABS_RIGHTPRESSED,{'R','I','G','H','T','P','R','E','S','S','E','D','\0'}}, + {SBP_ARROWBTN,ABS_RIGHTDISABLED,{'R','I','G','H','T','D','I','S','A','B','L','E','D','\0'}}, + {SBP_THUMBBTNHORZ,0,{'T','H','U','M','B','B','T','N','H','O','R','Z','\0'}}, + {SBP_THUMBBTNHORZ,SCRBS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {SBP_THUMBBTNHORZ,SCRBS_HOT,{'H','O','T','\0'}}, + {SBP_THUMBBTNHORZ,SCRBS_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {SBP_THUMBBTNHORZ,SCRBS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {SBP_THUMBBTNVERT,0,{'T','H','U','M','B','B','T','N','V','E','R','T','\0'}}, + {SBP_THUMBBTNVERT,SCRBS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {SBP_THUMBBTNVERT,SCRBS_HOT,{'H','O','T','\0'}}, + {SBP_THUMBBTNVERT,SCRBS_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {SBP_THUMBBTNVERT,SCRBS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {SBP_LOWERTRACKHORZ,0,{'L','O','W','E','R','T','R','A','C','K','H','O','R','Z','\0'}}, + {SBP_LOWERTRACKHORZ,SCRBS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {SBP_LOWERTRACKHORZ,SCRBS_HOT,{'H','O','T','\0'}}, + {SBP_LOWERTRACKHORZ,SCRBS_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {SBP_LOWERTRACKHORZ,SCRBS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {SBP_UPPERTRACKHORZ,0,{'U','P','P','E','R','T','R','A','C','K','H','O','R','Z','\0'}}, + {SBP_UPPERTRACKHORZ,SCRBS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {SBP_UPPERTRACKHORZ,SCRBS_HOT,{'H','O','T','\0'}}, + {SBP_UPPERTRACKHORZ,SCRBS_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {SBP_UPPERTRACKHORZ,SCRBS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {SBP_LOWERTRACKVERT,0,{'L','O','W','E','R','T','R','A','C','K','V','E','R','T','\0'}}, + {SBP_LOWERTRACKVERT,SCRBS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {SBP_LOWERTRACKVERT,SCRBS_HOT,{'H','O','T','\0'}}, + {SBP_LOWERTRACKVERT,SCRBS_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {SBP_LOWERTRACKVERT,SCRBS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {SBP_UPPERTRACKVERT,0,{'U','P','P','E','R','T','R','A','C','K','V','E','R','T','\0'}}, + {SBP_UPPERTRACKVERT,SCRBS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {SBP_UPPERTRACKVERT,SCRBS_HOT,{'H','O','T','\0'}}, + {SBP_UPPERTRACKVERT,SCRBS_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {SBP_UPPERTRACKVERT,SCRBS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {SBP_GRIPPERHORZ,0,{'G','R','I','P','P','E','R','H','O','R','Z','\0'}}, + {SBP_GRIPPERVERT,0,{'G','R','I','P','P','E','R','V','E','R','T','\0'}}, + {SBP_SIZEBOX,0,{'S','I','Z','E','B','O','X','\0'}}, + {SBP_SIZEBOX,SZB_RIGHTALIGN,{'R','I','G','H','T','A','L','I','G','N','\0'}}, + {SBP_SIZEBOX,SZB_LEFTALIGN,{'L','E','F','T','A','L','I','G','N','\0'}}, + {0,0,{'\0'}} +}; + +static const MSSTYLES_CLASS_MAP classSpin[] = { + {SPNP_UP,0,{'U','P','\0'}}, + {SPNP_UP,UPS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {SPNP_UP,UPS_HOT,{'H','O','T','\0'}}, + {SPNP_UP,UPS_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {SPNP_UP,UPS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {SPNP_DOWN,0,{'D','O','W','N','\0'}}, + {SPNP_DOWN,DNS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {SPNP_DOWN,DNS_HOT,{'H','O','T','\0'}}, + {SPNP_DOWN,DNS_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {SPNP_DOWN,DNS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {SPNP_UPHORZ,0,{'U','P','H','O','R','Z','\0'}}, + {SPNP_UPHORZ,UPHZS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {SPNP_UPHORZ,UPHZS_HOT,{'H','O','T','\0'}}, + {SPNP_UPHORZ,UPHZS_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {SPNP_UPHORZ,UPHZS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {SPNP_DOWNHORZ,0,{'D','O','W','N','H','O','R','Z','\0'}}, + {SPNP_DOWNHORZ,DNHZS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {SPNP_DOWNHORZ,DNHZS_HOT,{'H','O','T','\0'}}, + {SPNP_DOWNHORZ,DNHZS_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {SPNP_DOWNHORZ,DNHZS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {0,0,{'\0'}} +}; + +static const MSSTYLES_CLASS_MAP classStartpanel[] = { + {SPP_USERPANE,0,{'U','S','E','R','P','A','N','E','\0'}}, + {SPP_MOREPROGRAMS,0,{'M','O','R','E','P','R','O','G','R','A','M','S','\0'}}, + {SPP_MOREPROGRAMSARROW,0,{'M','O','R','E','P','R','O','G','R','A','M','S','A','R','R','O','W','\0'}}, + {SPP_MOREPROGRAMSARROW,SPS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {SPP_MOREPROGRAMSARROW,SPS_HOT,{'H','O','T','\0'}}, + {SPP_MOREPROGRAMSARROW,SPS_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {SPP_PROGLIST,0,{'P','R','O','G','L','I','S','T','\0'}}, + {SPP_PROGLISTSEPARATOR,0,{'P','R','O','G','L','I','S','T','S','E','P','A','R','A','T','O','R','\0'}}, + {SPP_PLACESLIST,0,{'P','L','A','C','E','S','L','I','S','T','\0'}}, + {SPP_PLACESLISTSEPARATOR,0,{'P','L','A','C','E','S','L','I','S','T','S','E','P','A','R','A','T','O','R','\0'}}, + {SPP_LOGOFF,0,{'L','O','G','O','F','F','\0'}}, + {SPP_LOGOFFBUTTONS,0,{'L','O','G','O','F','F','B','U','T','T','O','N','S','\0'}}, + {SPP_LOGOFFBUTTONS,SPLS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {SPP_LOGOFFBUTTONS,SPLS_HOT,{'H','O','T','\0'}}, + {SPP_LOGOFFBUTTONS,SPLS_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {SPP_USERPICTURE,0,{'U','S','E','R','P','I','C','T','U','R','E','\0'}}, + {SPP_PREVIEW,0,{'P','R','E','V','I','E','W','\0'}}, + {0,0,{'\0'}} +}; + +static const MSSTYLES_CLASS_MAP classStatus[] = { + {SP_PANE,0,{'P','A','N','E','\0'}}, + {SP_GRIPPERPANE,0,{'G','R','I','P','P','E','R','P','A','N','E','\0'}}, + {SP_GRIPPER,0,{'G','R','I','P','P','E','R','\0'}}, + {0,0,{'\0'}} +}; + +static const MSSTYLES_CLASS_MAP classTab[] = { + {TABP_TABITEM,0,{'T','A','B','I','T','E','M','\0'}}, + {TABP_TABITEM,TIS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {TABP_TABITEM,TIS_HOT,{'H','O','T','\0'}}, + {TABP_TABITEM,TIS_SELECTED,{'S','E','L','E','C','T','E','D','\0'}}, + {TABP_TABITEM,TIS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {TABP_TABITEM,TIS_FOCUSED,{'F','O','C','U','S','E','D','\0'}}, + {TABP_TABITEMLEFTEDGE,0,{'T','A','B','I','T','E','M','L','E','F','T','E','D','G','E','\0'}}, + {TABP_TABITEMLEFTEDGE,TILES_NORMAL,{'N','O','R','M','A','L','\0'}}, + {TABP_TABITEMLEFTEDGE,TILES_HOT,{'H','O','T','\0'}}, + {TABP_TABITEMLEFTEDGE,TILES_SELECTED,{'S','E','L','E','C','T','E','D','\0'}}, + {TABP_TABITEMLEFTEDGE,TILES_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {TABP_TABITEMLEFTEDGE,TILES_FOCUSED,{'F','O','C','U','S','E','D','\0'}}, + {TABP_TABITEMRIGHTEDGE,0,{'T','A','B','I','T','E','M','R','I','G','H','T','E','D','G','E','\0'}}, + {TABP_TABITEMRIGHTEDGE,TIRES_NORMAL,{'N','O','R','M','A','L','\0'}}, + {TABP_TABITEMRIGHTEDGE,TIRES_HOT,{'H','O','T','\0'}}, + {TABP_TABITEMRIGHTEDGE,TIRES_SELECTED,{'S','E','L','E','C','T','E','D','\0'}}, + {TABP_TABITEMRIGHTEDGE,TIRES_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {TABP_TABITEMRIGHTEDGE,TIRES_FOCUSED,{'F','O','C','U','S','E','D','\0'}}, + {TABP_TABITEMBOTHEDGE,0,{'T','A','B','I','T','E','M','B','O','T','H','E','D','G','E','\0'}}, + {TABP_TABITEMBOTHEDGE,TIBES_NORMAL,{'N','O','R','M','A','L','\0'}}, + {TABP_TABITEMBOTHEDGE,TIBES_HOT,{'H','O','T','\0'}}, + {TABP_TABITEMBOTHEDGE,TIBES_SELECTED,{'S','E','L','E','C','T','E','D','\0'}}, + {TABP_TABITEMBOTHEDGE,TIBES_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {TABP_TABITEMBOTHEDGE,TIBES_FOCUSED,{'F','O','C','U','S','E','D','\0'}}, + {TABP_TOPTABITEM,0,{'T','O','P','T','A','B','I','T','E','M','\0'}}, + {TABP_TOPTABITEM,TTIS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {TABP_TOPTABITEM,TTIS_HOT,{'H','O','T','\0'}}, + {TABP_TOPTABITEM,TTIS_SELECTED,{'S','E','L','E','C','T','E','D','\0'}}, + {TABP_TOPTABITEM,TTIS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {TABP_TOPTABITEM,TTIS_FOCUSED,{'F','O','C','U','S','E','D','\0'}}, + {TABP_TOPTABITEMLEFTEDGE,0,{'T','O','P','T','A','B','I','T','E','M','L','E','F','T','E','D','G','E','\0'}}, + {TABP_TOPTABITEMLEFTEDGE,TTILES_NORMAL,{'N','O','R','M','A','L','\0'}}, + {TABP_TOPTABITEMLEFTEDGE,TTILES_HOT,{'H','O','T','\0'}}, + {TABP_TOPTABITEMLEFTEDGE,TTILES_SELECTED,{'S','E','L','E','C','T','E','D','\0'}}, + {TABP_TOPTABITEMLEFTEDGE,TTILES_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {TABP_TOPTABITEMLEFTEDGE,TTILES_FOCUSED,{'F','O','C','U','S','E','D','\0'}}, + {TABP_TOPTABITEMRIGHTEDGE,0,{'T','O','P','T','A','B','I','T','E','M','R','I','G','H','T','E','D','G','E','\0'}}, + {TABP_TOPTABITEMRIGHTEDGE,TTIRES_NORMAL,{'N','O','R','M','A','L','\0'}}, + {TABP_TOPTABITEMRIGHTEDGE,TTIRES_HOT,{'H','O','T','\0'}}, + {TABP_TOPTABITEMRIGHTEDGE,TTIRES_SELECTED,{'S','E','L','E','C','T','E','D','\0'}}, + {TABP_TOPTABITEMRIGHTEDGE,TTIRES_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {TABP_TOPTABITEMRIGHTEDGE,TTIRES_FOCUSED,{'F','O','C','U','S','E','D','\0'}}, + {TABP_TOPTABITEMBOTHEDGE,0,{'T','O','P','T','A','B','I','T','E','M','B','O','T','H','E','D','G','E','\0'}}, + {TABP_TOPTABITEMBOTHEDGE,TTIBES_NORMAL,{'N','O','R','M','A','L','\0'}}, + {TABP_TOPTABITEMBOTHEDGE,TTIBES_HOT,{'H','O','T','\0'}}, + {TABP_TOPTABITEMBOTHEDGE,TTIBES_SELECTED,{'S','E','L','E','C','T','E','D','\0'}}, + {TABP_TOPTABITEMBOTHEDGE,TTIBES_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {TABP_TOPTABITEMBOTHEDGE,TTIBES_FOCUSED,{'F','O','C','U','S','E','D','\0'}}, + {TABP_PANE,0,{'P','A','N','E','\0'}}, + {TABP_BODY,0,{'B','O','D','Y','\0'}}, + {0,0,{'\0'}} +}; + +static const MSSTYLES_CLASS_MAP classTaskband[] = { + {TDP_GROUPCOUNT,0,{'G','R','O','U','P','C','O','U','N','T','\0'}}, + {TDP_FLASHBUTTON,0,{'F','L','A','S','H','B','U','T','T','O','N','\0'}}, + {TDP_FLASHBUTTONGROUPMENU,0,{'F','L','A','S','H','B','U','T','T','O','N','G','R','O','U','P','M','E','N','U','\0'}}, + {0,0,{'\0'}} +}; + +static const MSSTYLES_CLASS_MAP classTaskbar[] = { + {TBP_BACKGROUNDBOTTOM,0,{'B','A','C','K','G','R','O','U','N','D','B','O','T','T','O','M','\0'}}, + {TBP_BACKGROUNDRIGHT,0,{'B','A','C','K','G','R','O','U','N','D','R','I','G','H','T','\0'}}, + {TBP_BACKGROUNDTOP,0,{'B','A','C','K','G','R','O','U','N','D','T','O','P','\0'}}, + {TBP_BACKGROUNDLEFT,0,{'B','A','C','K','G','R','O','U','N','D','L','E','F','T','\0'}}, + {TBP_SIZINGBARBOTTOM,0,{'S','I','Z','I','N','G','B','A','R','B','O','T','T','O','M','\0'}}, + {TBP_SIZINGBARRIGHT,0,{'S','I','Z','I','N','G','B','A','R','R','I','G','H','T','\0'}}, + {TBP_SIZINGBARTOP,0,{'S','I','Z','I','N','G','B','A','R','T','O','P','\0'}}, + {TBP_SIZINGBARLEFT,0,{'S','I','Z','I','N','G','B','A','R','L','E','F','T','\0'}}, + {0,0,{'\0'}} +}; + +static const MSSTYLES_CLASS_MAP classToolbar[] = { + {TP_BUTTON,0,{'B','U','T','T','O','N','\0'}}, + {TP_BUTTON,TS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {TP_BUTTON,TS_HOT,{'H','O','T','\0'}}, + {TP_BUTTON,TS_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {TP_BUTTON,TS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {TP_BUTTON,TS_CHECKED,{'C','H','E','C','K','E','D','\0'}}, + {TP_BUTTON,TS_HOTCHECKED,{'H','O','T','C','H','E','C','K','E','D','\0'}}, + {TP_DROPDOWNBUTTON,0,{'D','R','O','P','D','O','W','N','B','U','T','T','O','N','\0'}}, + {TP_DROPDOWNBUTTON,TS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {TP_DROPDOWNBUTTON,TS_HOT,{'H','O','T','\0'}}, + {TP_DROPDOWNBUTTON,TS_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {TP_DROPDOWNBUTTON,TS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {TP_DROPDOWNBUTTON,TS_CHECKED,{'C','H','E','C','K','E','D','\0'}}, + {TP_DROPDOWNBUTTON,TS_HOTCHECKED,{'H','O','T','C','H','E','C','K','E','D','\0'}}, + {TP_SPLITBUTTON,0,{'S','P','L','I','T','B','U','T','T','O','N','\0'}}, + {TP_SPLITBUTTON,TS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {TP_SPLITBUTTON,TS_HOT,{'H','O','T','\0'}}, + {TP_SPLITBUTTON,TS_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {TP_SPLITBUTTON,TS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {TP_SPLITBUTTON,TS_CHECKED,{'C','H','E','C','K','E','D','\0'}}, + {TP_SPLITBUTTON,TS_HOTCHECKED,{'H','O','T','C','H','E','C','K','E','D','\0'}}, + {TP_SPLITBUTTONDROPDOWN,0,{'S','P','L','I','T','B','U','T','T','O','N','D','R','O','P','D','O','W','N','\0'}}, + {TP_SPLITBUTTONDROPDOWN,TS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {TP_SPLITBUTTONDROPDOWN,TS_HOT,{'H','O','T','\0'}}, + {TP_SPLITBUTTONDROPDOWN,TS_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {TP_SPLITBUTTONDROPDOWN,TS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {TP_SPLITBUTTONDROPDOWN,TS_CHECKED,{'C','H','E','C','K','E','D','\0'}}, + {TP_SPLITBUTTONDROPDOWN,TS_HOTCHECKED,{'H','O','T','C','H','E','C','K','E','D','\0'}}, + {TP_SEPARATOR,0,{'S','E','P','A','R','A','T','O','R','\0'}}, + {TP_SEPARATOR,TS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {TP_SEPARATOR,TS_HOT,{'H','O','T','\0'}}, + {TP_SEPARATOR,TS_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {TP_SEPARATOR,TS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {TP_SEPARATOR,TS_CHECKED,{'C','H','E','C','K','E','D','\0'}}, + {TP_SEPARATOR,TS_HOTCHECKED,{'H','O','T','C','H','E','C','K','E','D','\0'}}, + {TP_SEPARATORVERT,0,{'S','E','P','A','R','A','T','O','R','V','E','R','T','\0'}}, + {TP_SEPARATORVERT,TS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {TP_SEPARATORVERT,TS_HOT,{'H','O','T','\0'}}, + {TP_SEPARATORVERT,TS_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {TP_SEPARATORVERT,TS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {TP_SEPARATORVERT,TS_CHECKED,{'C','H','E','C','K','E','D','\0'}}, + {TP_SEPARATORVERT,TS_HOTCHECKED,{'H','O','T','C','H','E','C','K','E','D','\0'}}, + {0,0,{'\0'}} +}; + +static const MSSTYLES_CLASS_MAP classTooltip[] = { + {TTP_STANDARD,0,{'S','T','A','N','D','A','R','D','\0'}}, + {TTP_STANDARD,TTSS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {TTP_STANDARD,TTSS_LINK,{'L','I','N','K','\0'}}, + {TTP_STANDARDTITLE,0,{'S','T','A','N','D','A','R','D','T','I','T','L','E','\0'}}, + {TTP_STANDARDTITLE,TTSS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {TTP_STANDARDTITLE,TTSS_LINK,{'L','I','N','K','\0'}}, + {TTP_BALLOON,0,{'B','A','L','L','O','O','N','\0'}}, + {TTP_BALLOON,TTBS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {TTP_BALLOON,TTBS_LINK,{'L','I','N','K','\0'}}, + {TTP_BALLOONTITLE,0,{'B','A','L','L','O','O','N','T','I','T','L','E','\0'}}, + {TTP_BALLOONTITLE,TTBS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {TTP_BALLOONTITLE,TTBS_LINK,{'L','I','N','K','\0'}}, + {TTP_CLOSE,0,{'C','L','O','S','E','\0'}}, + {TTP_CLOSE,TTCS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {TTP_CLOSE,TTCS_HOT,{'H','O','T','\0'}}, + {TTP_CLOSE,TTCS_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {0,0,{'\0'}} +}; + +static const MSSTYLES_CLASS_MAP classTrackbar[] = { + {TKP_TRACK,0,{'T','R','A','C','K','\0'}}, + {TKP_TRACK,TRS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {TKP_TRACKVERT,0,{'T','R','A','C','K','V','E','R','T','\0'}}, + {TKP_TRACKVERT,TRVS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {TKP_THUMB,0,{'T','H','U','M','B','\0'}}, + {TKP_THUMB,TUS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {TKP_THUMB,TUS_HOT,{'H','O','T','\0'}}, + {TKP_THUMB,TUS_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {TKP_THUMB,TUS_FOCUSED,{'F','O','C','U','S','E','D','\0'}}, + {TKP_THUMB,TUS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {TKP_THUMBBOTTOM,0,{'T','H','U','M','B','B','O','T','T','O','M','\0'}}, + {TKP_THUMBBOTTOM,TUBS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {TKP_THUMBBOTTOM,TUBS_HOT,{'H','O','T','\0'}}, + {TKP_THUMBBOTTOM,TUBS_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {TKP_THUMBBOTTOM,TUBS_FOCUSED,{'F','O','C','U','S','E','D','\0'}}, + {TKP_THUMBBOTTOM,TUBS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {TKP_THUMBTOP,0,{'T','H','U','M','B','T','O','P','\0'}}, + {TKP_THUMBTOP,TUTS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {TKP_THUMBTOP,TUTS_HOT,{'H','O','T','\0'}}, + {TKP_THUMBTOP,TUTS_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {TKP_THUMBTOP,TUTS_FOCUSED,{'F','O','C','U','S','E','D','\0'}}, + {TKP_THUMBTOP,TUTS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {TKP_THUMBVERT,0,{'T','H','U','M','B','V','E','R','T','\0'}}, + {TKP_THUMBVERT,TUVS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {TKP_THUMBVERT,TUVS_HOT,{'H','O','T','\0'}}, + {TKP_THUMBVERT,TUVS_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {TKP_THUMBVERT,TUVS_FOCUSED,{'F','O','C','U','S','E','D','\0'}}, + {TKP_THUMBVERT,TUVS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {TKP_THUMBLEFT,0,{'T','H','U','M','B','L','E','F','T','\0'}}, + {TKP_THUMBLEFT,TUVLS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {TKP_THUMBLEFT,TUVLS_HOT,{'H','O','T','\0'}}, + {TKP_THUMBLEFT,TUVLS_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {TKP_THUMBLEFT,TUVLS_FOCUSED,{'F','O','C','U','S','E','D','\0'}}, + {TKP_THUMBLEFT,TUVLS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {TKP_THUMBRIGHT,0,{'T','H','U','M','B','R','I','G','H','T','\0'}}, + {TKP_THUMBRIGHT,TUVRS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {TKP_THUMBRIGHT,TUVRS_HOT,{'H','O','T','\0'}}, + {TKP_THUMBRIGHT,TUVRS_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {TKP_THUMBRIGHT,TUVRS_FOCUSED,{'F','O','C','U','S','E','D','\0'}}, + {TKP_THUMBRIGHT,TUVRS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {TKP_TICS,0,{'T','I','C','S','\0'}}, + {TKP_TICS,TSS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {TKP_TICSVERT,0,{'T','I','C','S','V','E','R','T','\0'}}, + {TKP_TICSVERT,TSVS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {0,0,{'\0'}} +}; + +static const MSSTYLES_CLASS_MAP classTraynotify[] = { + {TNP_BACKGROUND,0,{'B','A','C','K','G','R','O','U','N','D','\0'}}, + {TNP_ANIMBACKGROUND,0,{'A','N','I','M','B','A','C','K','G','R','O','U','N','D','\0'}}, + {0,0,{'\0'}} +}; + +static const MSSTYLES_CLASS_MAP classTreeview[] = { + {TVP_TREEITEM,0,{'T','R','E','E','I','T','E','M','\0'}}, + {TVP_TREEITEM,TREIS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {TVP_TREEITEM,TREIS_HOT,{'H','O','T','\0'}}, + {TVP_TREEITEM,TREIS_SELECTED,{'S','E','L','E','C','T','E','D','\0'}}, + {TVP_TREEITEM,TREIS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {TVP_TREEITEM,TREIS_SELECTEDNOTFOCUS,{'S','E','L','E','C','T','E','D','N','O','T','F','O','C','U','S','\0'}}, + {TVP_GLYPH,0,{'G','L','Y','P','H','\0'}}, + {TVP_GLYPH,GLPS_CLOSED,{'C','L','O','S','E','D','\0'}}, + {TVP_GLYPH,GLPS_OPENED,{'O','P','E','N','E','D','\0'}}, + {TVP_BRANCH,0,{'B','R','A','N','C','H','\0'}}, + {0,0,{'\0'}} +}; + +static const MSSTYLES_CLASS_MAP classWindow[] = { + {WP_CAPTION,0,{'C','A','P','T','I','O','N','\0'}}, + {WP_CAPTION,CS_ACTIVE,{'A','C','T','I','V','E','\0'}}, + {WP_CAPTION,CS_INACTIVE,{'I','N','A','C','T','I','V','E','\0'}}, + {WP_CAPTION,CS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {WP_SMALLCAPTION,0,{'S','M','A','L','L','C','A','P','T','I','O','N','\0'}}, + {WP_SMALLCAPTION,CS_ACTIVE,{'A','C','T','I','V','E','\0'}}, + {WP_SMALLCAPTION,CS_INACTIVE,{'I','N','A','C','T','I','V','E','\0'}}, + {WP_SMALLCAPTION,CS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {WP_MINCAPTION,0,{'M','I','N','C','A','P','T','I','O','N','\0'}}, + {WP_MINCAPTION,MNCS_ACTIVE,{'A','C','T','I','V','E','\0'}}, + {WP_MINCAPTION,MNCS_INACTIVE,{'I','N','A','C','T','I','V','E','\0'}}, + {WP_MINCAPTION,MNCS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {WP_SMALLMINCAPTION,0,{'S','M','A','L','L','M','I','N','C','A','P','T','I','O','N','\0'}}, + {WP_SMALLMINCAPTION,MNCS_ACTIVE,{'A','C','T','I','V','E','\0'}}, + {WP_SMALLMINCAPTION,MNCS_INACTIVE,{'I','N','A','C','T','I','V','E','\0'}}, + {WP_SMALLMINCAPTION,MNCS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {WP_MAXCAPTION,0,{'M','A','X','C','A','P','T','I','O','N','\0'}}, + {WP_MAXCAPTION,MXCS_ACTIVE,{'A','C','T','I','V','E','\0'}}, + {WP_MAXCAPTION,MXCS_INACTIVE,{'I','N','A','C','T','I','V','E','\0'}}, + {WP_MAXCAPTION,MXCS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {WP_SMALLMAXCAPTION,0,{'S','M','A','L','L','M','A','X','C','A','P','T','I','O','N','\0'}}, + {WP_SMALLMAXCAPTION,MXCS_ACTIVE,{'A','C','T','I','V','E','\0'}}, + {WP_SMALLMAXCAPTION,MXCS_INACTIVE,{'I','N','A','C','T','I','V','E','\0'}}, + {WP_SMALLMAXCAPTION,MXCS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {WP_FRAMELEFT,0,{'F','R','A','M','E','L','E','F','T','\0'}}, + {WP_FRAMELEFT,FS_ACTIVE,{'A','C','T','I','V','E','\0'}}, + {WP_FRAMELEFT,FS_INACTIVE,{'I','N','A','C','T','I','V','E','\0'}}, + {WP_FRAMERIGHT,0,{'F','R','A','M','E','R','I','G','H','T','\0'}}, + {WP_FRAMERIGHT,FS_ACTIVE,{'A','C','T','I','V','E','\0'}}, + {WP_FRAMERIGHT,FS_INACTIVE,{'I','N','A','C','T','I','V','E','\0'}}, + {WP_FRAMEBOTTOM,0,{'F','R','A','M','E','B','O','T','T','O','M','\0'}}, + {WP_FRAMEBOTTOM,FS_ACTIVE,{'A','C','T','I','V','E','\0'}}, + {WP_FRAMEBOTTOM,FS_INACTIVE,{'I','N','A','C','T','I','V','E','\0'}}, + {WP_SMALLFRAMELEFT,0,{'S','M','A','L','L','F','R','A','M','E','L','E','F','T','\0'}}, + {WP_SMALLFRAMELEFT,FS_ACTIVE,{'A','C','T','I','V','E','\0'}}, + {WP_SMALLFRAMELEFT,FS_INACTIVE,{'I','N','A','C','T','I','V','E','\0'}}, + {WP_SMALLFRAMERIGHT,0,{'S','M','A','L','L','F','R','A','M','E','R','I','G','H','T','\0'}}, + {WP_SMALLFRAMERIGHT,FS_ACTIVE,{'A','C','T','I','V','E','\0'}}, + {WP_SMALLFRAMERIGHT,FS_INACTIVE,{'I','N','A','C','T','I','V','E','\0'}}, + {WP_SMALLFRAMEBOTTOM,0,{'S','M','A','L','L','F','R','A','M','E','B','O','T','T','O','M','\0'}}, + {WP_SMALLFRAMEBOTTOM,FS_ACTIVE,{'A','C','T','I','V','E','\0'}}, + {WP_SMALLFRAMEBOTTOM,FS_INACTIVE,{'I','N','A','C','T','I','V','E','\0'}}, + {WP_SYSBUTTON,0,{'S','Y','S','B','U','T','T','O','N','\0'}}, + {WP_SYSBUTTON,SBS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {WP_SYSBUTTON,SBS_HOT,{'H','O','T','\0'}}, + {WP_SYSBUTTON,SBS_PUSHED,{'P','U','S','H','E','D','\0'}}, + {WP_SYSBUTTON,SBS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {WP_MDISYSBUTTON,0,{'M','D','I','S','Y','S','B','U','T','T','O','N','\0'}}, + {WP_MDISYSBUTTON,SBS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {WP_MDISYSBUTTON,SBS_HOT,{'H','O','T','\0'}}, + {WP_MDISYSBUTTON,SBS_PUSHED,{'P','U','S','H','E','D','\0'}}, + {WP_MDISYSBUTTON,SBS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {WP_MINBUTTON,0,{'M','I','N','B','U','T','T','O','N','\0'}}, + {WP_MINBUTTON,MINBS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {WP_MINBUTTON,MINBS_HOT,{'H','O','T','\0'}}, + {WP_MINBUTTON,MINBS_PUSHED,{'P','U','S','H','E','D','\0'}}, + {WP_MINBUTTON,MINBS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {WP_MDIMINBUTTON,0,{'M','D','I','M','I','N','B','U','T','T','O','N','\0'}}, + {WP_MDIMINBUTTON,MINBS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {WP_MDIMINBUTTON,MINBS_HOT,{'H','O','T','\0'}}, + {WP_MDIMINBUTTON,MINBS_PUSHED,{'P','U','S','H','E','D','\0'}}, + {WP_MDIMINBUTTON,MINBS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {WP_MAXBUTTON,0,{'M','A','X','B','U','T','T','O','N','\0'}}, + {WP_MAXBUTTON,MAXBS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {WP_MAXBUTTON,MAXBS_HOT,{'H','O','T','\0'}}, + {WP_MAXBUTTON,MAXBS_PUSHED,{'P','U','S','H','E','D','\0'}}, + {WP_MAXBUTTON,MAXBS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {WP_CLOSEBUTTON,0,{'C','L','O','S','E','B','U','T','T','O','N','\0'}}, + {WP_CLOSEBUTTON,CBS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {WP_CLOSEBUTTON,CBS_HOT,{'H','O','T','\0'}}, + {WP_CLOSEBUTTON,CBS_PUSHED,{'P','U','S','H','E','D','\0'}}, + {WP_CLOSEBUTTON,CBS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {WP_SMALLCLOSEBUTTON,0,{'S','M','A','L','L','C','L','O','S','E','B','U','T','T','O','N','\0'}}, + {WP_SMALLCLOSEBUTTON,CBS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {WP_SMALLCLOSEBUTTON,CBS_HOT,{'H','O','T','\0'}}, + {WP_SMALLCLOSEBUTTON,CBS_PUSHED,{'P','U','S','H','E','D','\0'}}, + {WP_SMALLCLOSEBUTTON,CBS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {WP_MDICLOSEBUTTON,0,{'M','D','I','C','L','O','S','E','B','U','T','T','O','N','\0'}}, + {WP_MDICLOSEBUTTON,CBS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {WP_MDICLOSEBUTTON,CBS_HOT,{'H','O','T','\0'}}, + {WP_MDICLOSEBUTTON,CBS_PUSHED,{'P','U','S','H','E','D','\0'}}, + {WP_MDICLOSEBUTTON,CBS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {WP_RESTOREBUTTON,0,{'R','E','S','T','O','R','E','B','U','T','T','O','N','\0'}}, + {WP_RESTOREBUTTON,RBS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {WP_RESTOREBUTTON,RBS_HOT,{'H','O','T','\0'}}, + {WP_RESTOREBUTTON,RBS_PUSHED,{'P','U','S','H','E','D','\0'}}, + {WP_RESTOREBUTTON,RBS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {WP_MDIRESTOREBUTTON,0,{'M','D','I','R','E','S','T','O','R','E','B','U','T','T','O','N','\0'}}, + {WP_MDIRESTOREBUTTON,RBS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {WP_MDIRESTOREBUTTON,RBS_HOT,{'H','O','T','\0'}}, + {WP_MDIRESTOREBUTTON,RBS_PUSHED,{'P','U','S','H','E','D','\0'}}, + {WP_MDIRESTOREBUTTON,RBS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {WP_HELPBUTTON,0,{'H','E','L','P','B','U','T','T','O','N','\0'}}, + {WP_HELPBUTTON,HBS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {WP_HELPBUTTON,HBS_HOT,{'H','O','T','\0'}}, + {WP_HELPBUTTON,HBS_PUSHED,{'P','U','S','H','E','D','\0'}}, + {WP_HELPBUTTON,HBS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {WP_MDIHELPBUTTON,0,{'M','D','I','H','E','L','P','B','U','T','T','O','N','\0'}}, + {WP_MDIHELPBUTTON,HBS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {WP_MDIHELPBUTTON,HBS_HOT,{'H','O','T','\0'}}, + {WP_MDIHELPBUTTON,HBS_PUSHED,{'P','U','S','H','E','D','\0'}}, + {WP_MDIHELPBUTTON,HBS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {WP_HORZSCROLL,0,{'H','O','R','Z','S','C','R','O','L','L','\0'}}, + {WP_HORZSCROLL,HSS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {WP_HORZSCROLL,HSS_HOT,{'H','O','T','\0'}}, + {WP_HORZSCROLL,HSS_PUSHED,{'P','U','S','H','E','D','\0'}}, + {WP_HORZSCROLL,HSS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {WP_HORZTHUMB,0,{'H','O','R','Z','T','H','U','M','B','\0'}}, + {WP_HORZTHUMB,HTS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {WP_HORZTHUMB,HTS_HOT,{'H','O','T','\0'}}, + {WP_HORZTHUMB,HTS_PUSHED,{'P','U','S','H','E','D','\0'}}, + {WP_HORZTHUMB,HTS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {WP_VERTSCROLL,0,{'V','E','R','T','S','C','R','O','L','L','\0'}}, + {WP_VERTSCROLL,VSS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {WP_VERTSCROLL,VSS_HOT,{'H','O','T','\0'}}, + {WP_VERTSCROLL,VSS_PUSHED,{'P','U','S','H','E','D','\0'}}, + {WP_VERTSCROLL,VSS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {WP_VERTTHUMB,0,{'V','E','R','T','T','H','U','M','B','\0'}}, + {WP_VERTTHUMB,VTS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {WP_VERTTHUMB,VTS_HOT,{'H','O','T','\0'}}, + {WP_VERTTHUMB,VTS_PUSHED,{'P','U','S','H','E','D','\0'}}, + {WP_VERTTHUMB,VTS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {WP_DIALOG,0,{'D','I','A','L','O','G','\0'}}, + {WP_CAPTIONSIZINGTEMPLATE,0,{'C','A','P','T','I','O','N','S','I','Z','I','N','G','T','E','M','P','L','A','T','E','\0'}}, + {WP_SMALLCAPTIONSIZINGTEMPLATE,0,{'S','M','A','L','L','C','A','P','T','I','O','N','S','I','Z','I','N','G','T','E','M','P','L','A','T','E','\0'}}, + {WP_FRAMELEFTSIZINGTEMPLATE,0,{'F','R','A','M','E','L','E','F','T','S','I','Z','I','N','G','T','E','M','P','L','A','T','E','\0'}}, + {WP_SMALLFRAMELEFTSIZINGTEMPLATE,0,{'S','M','A','L','L','F','R','A','M','E','L','E','F','T','S','I','Z','I','N','G','T','E','M','P','L','A','T','E','\0'}}, + {WP_FRAMERIGHTSIZINGTEMPLATE,0,{'F','R','A','M','E','R','I','G','H','T','S','I','Z','I','N','G','T','E','M','P','L','A','T','E','\0'}}, + {WP_SMALLFRAMERIGHTSIZINGTEMPLATE,0,{'S','M','A','L','L','F','R','A','M','E','R','I','G','H','T','S','I','Z','I','N','G','T','E','M','P','L','A','T','E','\0'}}, + {WP_FRAMEBOTTOMSIZINGTEMPLATE,0,{'F','R','A','M','E','B','O','T','T','O','M','S','I','Z','I','N','G','T','E','M','P','L','A','T','E','\0'}}, + {WP_SMALLFRAMEBOTTOMSIZINGTEMPLATE,0,{'S','M','A','L','L','F','R','A','M','E','B','O','T','T','O','M','S','I','Z','I','N','G','T','E','M','P','L','A','T','E','\0'}}, + {0,0,{'\0'}} +}; + +/* Map class names to part/state maps */ +static const MSSTYLES_CLASS_NAME mapClass[] = { + {classGlobals, {'G','L','O','B','A','L','S','\0'}}, + {classButton, {'B','U','T','T','O','N','\0'}}, + {classClock, {'C','L','O','C','K','\0'}}, + {classCombobox, {'C','O','M','B','O','B','O','X','\0'}}, + {classEdit, {'E','D','I','T','\0'}}, + {classExplorerbar, {'E','X','P','L','O','R','E','R','B','A','R','\0'}}, + {classHeader, {'H','E','A','D','E','R','\0'}}, + {classListview, {'L','I','S','T','V','I','E','W','\0'}}, + {classMenu, {'M','E','N','U','\0'}}, + {classMenuband, {'M','E','N','U','B','A','N','D','\0'}}, + {classPage, {'P','A','G','E','\0'}}, + {classProgress, {'P','R','O','G','R','E','S','S','\0'}}, + {classRebar, {'R','E','B','A','R','\0'}}, + {classScrollbar, {'S','C','R','O','L','L','B','A','R','\0'}}, + {classSpin, {'S','P','I','N','\0'}}, + {classStartpanel, {'S','T','A','R','T','P','A','N','E','L','\0'}}, + {classStatus, {'S','T','A','T','U','S','\0'}}, + {classTab, {'T','A','B','\0'}}, + {classTaskband, {'T','A','S','K','B','A','N','D','\0'}}, + {classTaskbar, {'T','A','S','K','B','A','R','\0'}}, + {classToolbar, {'T','O','O','L','B','A','R','\0'}}, + {classTooltip, {'T','O','O','L','T','I','P','\0'}}, + {classTrackbar, {'T','R','A','C','K','B','A','R','\0'}}, + {classTraynotify, {'T','R','A','Y','N','O','T','I','F','Y','\0'}}, + {classTreeview, {'T','R','E','E','V','I','E','W','\0'}}, + {classWindow, {'W','I','N','D','O','W','\0'}} +}; + + +/********************************************************************** + * MSSTYLES_LookupProperty + * + * Find a property ID from name + * + * PARAMS + * pszPropertyName Name of property to lookup + * dwPrimitive Location to store primitive type of property + * dwId Location to store ID of property + * + * RETURNS + * FALSE if value is not found, TRUE otherwise + */ +BOOL MSSTYLES_LookupProperty(LPCWSTR pszPropertyName, DWORD *dwPrimitive, DWORD *dwId) +{ + DWORD item = 0; + do { + if(!lstrcmpiW(mapProperty[item].szPropertyName, pszPropertyName)) { + if(dwPrimitive) *dwPrimitive = mapProperty[item].dwPrimitiveType; + if(dwId) *dwId = mapProperty[item].dwPropertyID; + return TRUE; + } + } while(*mapProperty[++item].szPropertyName); + return FALSE; +} + +/********************************************************************** + * MSSTYLES_LookupEnum + * + * Lookup the value for an enumeration + * + * PARAMS + * pszValueName Value name to lookup + * dwEnum Enumeration property ID to search + * dwValue Location to store value + * + * RETURNS + * FALSE if value is not found, TRUE otherwise + */ +BOOL MSSTYLES_LookupEnum(LPCWSTR pszValueName, DWORD dwEnum, DWORD *dwValue) +{ + DWORD item = 0; + /* Locate the enum block */ + while(*mapEnum[item].szValueName && mapEnum[item].dwEnum != dwEnum) item++; + /* Now find the value in that block */ + while(*mapEnum[item].szValueName && mapEnum[item].dwEnum == dwEnum) { + if(!lstrcmpiW(mapEnum[item].szValueName, pszValueName)) { + if(dwValue) *dwValue = mapEnum[item].dwValue; + return TRUE; + } + item++; + } + return FALSE; +} diff --git a/dlls/uxtheme/system.c b/dlls/uxtheme/system.c index bdb5dd151e2..8496d78b3ca 100644 --- a/dlls/uxtheme/system.c +++ b/dlls/uxtheme/system.c @@ -29,6 +29,7 @@ #include "winreg.h" #include "shlwapi.h" #include "uxtheme.h" +#include "tmschema.h" #include "uxthemedll.h" #include "msstyles.h" @@ -53,6 +54,10 @@ static const WCHAR szSizeName[] = {'S','i','z','e','N','a','m','e','\0'}; static const WCHAR szColorName[] = {'C','o','l','o','r','N','a','m','e','\0'}; static const WCHAR szDllName[] = {'D','l','l','N','a','m','e','\0'}; +static const WCHAR szIniDocumentation[] = {'d','o','c','u','m','e','n','t','a','t','i','o','n','\0'}; + +HINSTANCE hDllInst; + DWORD dwThemeAppProperties = STAP_ALLOW_NONCLIENT | STAP_ALLOW_CONTROLS; ATOM atWindowTheme; ATOM atSubAppName; @@ -66,29 +71,18 @@ WCHAR szCurrentSize[64]; /***********************************************************************/ /*********************************************************************** - * UXTHEME_InitSystem + * UXTHEME_LoadTheme + * + * Set the current active theme from the registry */ -void UXTHEME_InitSystem() +void UXTHEME_LoadTheme() { - const WCHAR szWindowTheme[] = { - 'u','x','_','t','h','e','m','e','\0' - }; - const WCHAR szSubAppName[] = { - 'u','x','_','s','u','b','a','p','p','\0' - }; - const WCHAR szSubIdList[] = { - 'u','x','_','s','u','b','i','d','l','s','t','\0' - }; HKEY hKey; LONG buffsize; HRESULT hr; WCHAR tmp[10]; PTHEME_FILE pt; - atWindowTheme = GlobalAddAtomW(szWindowTheme); - atSubAppName = GlobalAddAtomW(szSubAppName); - atSubIdList = GlobalAddAtomW(szSubIdList); - /* Get current theme configuration */ if(!RegOpenKeyW(HKEY_CURRENT_USER, szThemeManager, &hKey)) { TRACE("Loading theme config\n"); @@ -129,15 +123,84 @@ void UXTHEME_InitSystem() /* Make sure the global color & size match the theme */ lstrcpynW(szCurrentColor, pt->pszSelectedColor, sizeof(szCurrentColor)/sizeof(szCurrentColor[0])); lstrcpynW(szCurrentSize, pt->pszSelectedSize, sizeof(szCurrentSize)/sizeof(szCurrentSize[0])); + + MSSTYLES_SetActiveTheme(pt); + TRACE("Theme active: %s %s %s\n", debugstr_w(szCurrentTheme), + debugstr_w(szCurrentColor), debugstr_w(szCurrentSize)); MSSTYLES_CloseThemeFile(pt); } } - - if(!bThemeActive) + if(!bThemeActive) { + MSSTYLES_SetActiveTheme(NULL); TRACE("Themeing not active\n"); + } +} + +/*********************************************************************** + * UXTHEME_SetActiveTheme + * + * Change the current active theme + */ +HRESULT UXTHEME_SetActiveTheme(PTHEME_FILE tf) +{ + HKEY hKey; + WCHAR tmp[2]; + HRESULT hr; + + hr = MSSTYLES_SetActiveTheme(tf); + if(FAILED(hr)) + return hr; + if(tf) { + bThemeActive = TRUE; + GetModuleFileNameW(tf->hTheme, szCurrentTheme, sizeof(szCurrentTheme)/sizeof(szCurrentTheme[0])); + lstrcpynW(szCurrentColor, tf->pszSelectedColor, sizeof(szCurrentColor)/sizeof(szCurrentColor[0])); + lstrcpynW(szCurrentSize, tf->pszSelectedSize, sizeof(szCurrentSize)/sizeof(szCurrentSize[0])); + } + else { + bThemeActive = FALSE; + szCurrentTheme[0] = '\0'; + szCurrentColor[0] = '\0'; + szCurrentSize[0] = '\0'; + return MSSTYLES_SetActiveTheme(NULL); + } + + TRACE("Writing theme config to registry\n"); + if(!RegCreateKeyW(HKEY_CURRENT_USER, szThemeManager, &hKey)) { + tmp[0] = bThemeActive?'1':'0'; + tmp[1] = '\0'; + RegSetValueExW(hKey, szThemeActive, 0, REG_SZ, (const BYTE*)tmp, sizeof(WCHAR)*2); + RegSetValueExW(hKey, szColorName, 0, REG_SZ, (const BYTE*)szCurrentColor, lstrlenW(szCurrentColor)+1); + RegSetValueExW(hKey, szSizeName, 0, REG_SZ, (const BYTE*)szCurrentSize, lstrlenW(szCurrentSize)+1); + RegSetValueExW(hKey, szDllName, 0, REG_SZ, (const BYTE*)szCurrentTheme, lstrlenW(szCurrentTheme)+1); + RegCloseKey(hKey); + } else - TRACE("Theme active: %s %s %s\n", debugstr_w(szCurrentTheme), - debugstr_w(szCurrentColor), debugstr_w(szCurrentSize)); + TRACE("Failed to open theme registry key\n"); + return hr; +} + +/*********************************************************************** + * UXTHEME_InitSystem + */ +void UXTHEME_InitSystem(HINSTANCE hInst) +{ + const WCHAR szWindowTheme[] = { + 'u','x','_','t','h','e','m','e','\0' + }; + const WCHAR szSubAppName[] = { + 'u','x','_','s','u','b','a','p','p','\0' + }; + const WCHAR szSubIdList[] = { + 'u','x','_','s','u','b','i','d','l','s','t','\0' + }; + + hDllInst = hInst; + + atWindowTheme = GlobalAddAtomW(szWindowTheme); + atSubAppName = GlobalAddAtomW(szSubAppName); + atSubIdList = GlobalAddAtomW(szSubIdList); + + UXTHEME_LoadTheme(); } /*********************************************************************** @@ -180,15 +243,21 @@ HRESULT WINAPI EnableTheming(BOOL fEnable) PostMessageW(HWND_BROADCAST, WM_THEMECHANGED, 0, 0); } return S_OK; - } +} /*********************************************************************** * OpenThemeData (UXTHEME.@) */ HTHEME WINAPI OpenThemeData(HWND hwnd, LPCWSTR pszClassList) { - FIXME("%p %s: stub\n", hwnd, debugstr_w(pszClassList)); - return NULL; + HTHEME hTheme; + TRACE("(%p,%s)\n", hwnd, debugstr_w(pszClassList)); + if(!bThemeActive) + return NULL; + hTheme = MSSTYLES_OpenThemeClass(pszClassList); + if(IsWindow(hwnd)) + SetPropW(hwnd, MAKEINTATOMW(atWindowTheme), hTheme); + return hTheme; } /*********************************************************************** @@ -281,10 +350,10 @@ void WINAPI SetThemeAppProperties(DWORD dwFlags) */ HRESULT WINAPI CloseThemeData(HTHEME hTheme) { - FIXME("stub\n"); + TRACE("(%p)\n", hTheme); if(!hTheme) return E_HANDLE; - return S_OK; + return MSSTYLES_CloseThemeClass(hTheme); } /*********************************************************************** @@ -310,6 +379,68 @@ BOOL WINAPI IsThemePartDefined(HTHEME hTheme, int iPartId, int iStateId) return FALSE; } +/*********************************************************************** + * GetThemeDocumentationProperty (UXTHEME.@) + * + * Try and retrieve the documentation property from string resources + * if that fails, get it from the [documentation] section of themes.ini + */ +HRESULT WINAPI GetThemeDocumentationProperty(LPCWSTR pszThemeName, + LPCWSTR pszPropertyName, + LPWSTR pszValueBuff, + int cchMaxValChars) +{ + const WORD wDocToRes[] = { + TMT_DISPLAYNAME,5000, + TMT_TOOLTIP,5001, + TMT_COMPANY,5002, + TMT_AUTHOR,5003, + TMT_COPYRIGHT,5004, + TMT_URL,5005, + TMT_VERSION,5006, + TMT_DESCRIPTION,5007 + }; + + PTHEME_FILE pt; + HRESULT hr; + int i; + DWORD dwDocId; + TRACE("(%s,%s,%p,%d)\n", debugstr_w(pszThemeName), debugstr_w(pszPropertyName), + pszValueBuff, cchMaxValChars); + + hr = MSSTYLES_OpenThemeFile(pszThemeName, NULL, NULL, &pt); + if(FAILED(hr)) return hr; + + /* Try to load from string resources */ + hr = E_PROP_ID_UNSUPPORTED; + if(MSSTYLES_LookupProperty(pszPropertyName, NULL, &dwDocId)) { + for(i=0; ihTheme, wDocToRes[i+1], pszValueBuff, cchMaxValChars)) { + hr = S_OK; + break; + } + } + } + } + /* If loading from string resource failed, try getting it from the theme.ini */ + if(FAILED(hr)) { + PUXINI_FILE uf = MSSTYLES_GetThemeIni(pt); + if(UXINI_FindSection(uf, szIniDocumentation)) { + LPCWSTR lpValue; + DWORD dwLen; + if(UXINI_FindValue(uf, pszPropertyName, &lpValue, &dwLen)) { + lstrcpynW(pszValueBuff, lpValue, min(dwLen+1,cchMaxValChars)); + hr = S_OK; + } + } + UXINI_CloseINI(uf); + } + + MSSTYLES_CloseThemeFile(pt); + return hr; +} + /********************************************************************** * Undocumented functions */ @@ -385,8 +516,11 @@ HRESULT WINAPI CloseThemeFile(HTHEMEFILE hThemeFile) */ HRESULT WINAPI ApplyTheme(HTHEMEFILE hThemeFile, char *unknown, HWND hWnd) { - FIXME("%s: stub\n", unknown); - return ERROR_CALL_NOT_IMPLEMENTED; + HRESULT hr; + TRACE("(%p,%s,%p)\n", hThemeFile, unknown, hWnd); + hr = UXTHEME_SetActiveTheme(hThemeFile); + PostMessageW(HWND_BROADCAST, WM_THEMECHANGED, 0, 0); + return hr; } /********************************************************************** diff --git a/dlls/uxtheme/uxini.c b/dlls/uxtheme/uxini.c new file mode 100644 index 00000000000..7416801a877 --- /dev/null +++ b/dlls/uxtheme/uxini.c @@ -0,0 +1,309 @@ +/* + * Win32 5.1 uxtheme ini file processing + * + * Copyright (C) 2004 Kevin Koltzau + * + * 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 "config.h" + +#include + +#include "windef.h" +#include "winbase.h" +#include "winnls.h" + +#include "msstyles.h" + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(uxtheme); + +/*********************************************************************** + * Defines and global variables + */ + +static const WCHAR szTextFileResource[] = { + 'T','E','X','T','F','I','L','E','\0' +}; + +/***********************************************************************/ + +/********************************************************************** + * UXINI_LoadINI + * + * Load a theme INI file out of resources from the specified + * theme + * + * PARAMS + * tf Theme to load INI file out of resources + * lpName Resource name of the INI file + * + * RETURNS + * INI file, or NULL if not found + */ +PUXINI_FILE UXINI_LoadINI(PTHEME_FILE tf, LPCWSTR lpName) { + HRSRC hrsc; + LPCWSTR lpThemesIni = NULL; + PUXINI_FILE uf; + DWORD dwIniSize; + + if((hrsc = FindResourceW(tf->hTheme, lpName, szTextFileResource))) { + if(!(lpThemesIni = (LPCWSTR)LoadResource(tf->hTheme, hrsc))) { + TRACE("%s resource not found\n", debugstr_w(lpName)); + return NULL; + } + } + + dwIniSize = SizeofResource(tf->hTheme, hrsc) / sizeof(WCHAR); + uf = HeapAlloc(GetProcessHeap(), 0, sizeof(UXINI_FILE)); + uf->lpIni = lpThemesIni; + uf->lpCurLoc = lpThemesIni; + uf->lpEnd = lpThemesIni + dwIniSize; + return uf; +} + +/********************************************************************** + * UXINI_CloseINI + * + * Close an open theme INI file + * + * PARAMS + * uf Theme INI file to close + */ +void UXINI_CloseINI(PUXINI_FILE uf) +{ + HeapFree(GetProcessHeap(), 0, uf); +} + +/********************************************************************** + * UXINI_ResetINI + * + * Reset the current pointer into INI file to the beginning of the file + * + * PARAMS + * uf Theme INI file to reset + */ +void UXINI_ResetINI(PUXINI_FILE uf) +{ + uf->lpCurLoc = uf->lpIni; +} + +/********************************************************************** + * UXINI_eof + * + * Determines if we are at the end of the INI file + * + * PARAMS + * uf Theme INI file to test + */ +static inline BOOL UXINI_eof(PUXINI_FILE uf) +{ + return uf->lpCurLoc >= uf->lpEnd; +} + +/********************************************************************** + * UXINI_isspace + * + * Check if a character is a space character + * + * PARAMS + * c Character to test + */ +static inline BOOL UXINI_isspace(WCHAR c) +{ + if (isspace(c)) return TRUE; + if (c=='\r') return TRUE; + return FALSE; +} + +/********************************************************************** + * UXINI_GetNextLine + * + * Get the next line in the INI file, non NULL terminated + * removes whitespace at beginning and end of line, and removes comments + * + * PARAMS + * uf INI file to retrieve next line + * dwLen Location to store pointer to line length + * + * RETURNS + * The section name, non NULL terminated + */ +LPCWSTR UXINI_GetNextLine(PUXINI_FILE uf, DWORD *dwLen) +{ + LPCWSTR lpLineEnd; + LPCWSTR lpLineStart; + DWORD len; + do { + if(UXINI_eof(uf)) return NULL; + /* Skip whitespace and empty lines */ + while(!UXINI_eof(uf) && (UXINI_isspace(*uf->lpCurLoc) || *uf->lpCurLoc == '\n')) uf->lpCurLoc++; + lpLineStart = uf->lpCurLoc; + lpLineEnd = uf->lpCurLoc; + while(!UXINI_eof(uf) && *uf->lpCurLoc != '\n' && *uf->lpCurLoc != ';') lpLineEnd = uf->lpCurLoc++; + /* If comment was found, skip the rest of the line */ + if(*uf->lpCurLoc == ';') + while(!UXINI_eof(uf) && *uf->lpCurLoc != '\n') uf->lpCurLoc++; + len = (lpLineEnd - lpLineStart); + if(len == 0) + return NULL; + } while(*lpLineStart == ';'); + /* Remove whitespace from end of line */ + while(UXINI_isspace(lpLineStart[len-1])) len--; + *dwLen = len; + + return lpLineStart; +} + +void UXINI_UnGetToLine(PUXINI_FILE uf, LPCWSTR lpLine) +{ + uf->lpCurLoc = lpLine; +} + +/********************************************************************** + * UXINI_GetNextSection + * + * Locate the next section in the ini file, and return pointer to + * section name, non NULL terminated. Use dwLen to determine length + * + * PARAMS + * uf INI file to search, search starts at current location + * dwLen Location to store pointer to section name length + * + * RETURNS + * The section name, non NULL terminated + */ +LPCWSTR UXINI_GetNextSection(PUXINI_FILE uf, DWORD *dwLen) +{ + LPCWSTR lpLine; + while((lpLine = UXINI_GetNextLine(uf, dwLen))) { + /* Assuming a ']' ending to the section name */ + if(lpLine[0] == '[') { + lpLine++; + *dwLen -= 2; + break; + } + } + return lpLine; +} + +/********************************************************************** + * UXINI_FindSection + * + * Locate a section with the specified name, search starts + * at current location in ini file + * to start search from start, call UXINI_ResetINI + * + * PARAMS + * uf INI file to search, search starts at current location + * lpName Name of the section to locate + * + * RETURNS + * TRUE if section was found, FALSE otherwise + */ +BOOL UXINI_FindSection(PUXINI_FILE uf, LPCWSTR lpName) +{ + LPCWSTR lpSection; + DWORD dwLen; + while((lpSection = UXINI_GetNextSection(uf, &dwLen))) { + if(CompareStringW(LOCALE_SYSTEM_DEFAULT, NORM_IGNORECASE, lpSection, dwLen, lpName, -1) == CSTR_EQUAL) { + return TRUE; + } + } + return FALSE; +} + +/********************************************************************** + * UXINI_GetNextValue + * + * Locate the next value in the current section + * + * PARAMS + * uf INI file to search, search starts at current location + * dwNameLen Location to store pointer to value name length + * lpValue Location to store pointer to the value + * dwValueLen Location to store pointer to value length + * + * RETURNS + * The value name, non NULL terminated + */ +LPCWSTR UXINI_GetNextValue(PUXINI_FILE uf, DWORD *dwNameLen, LPCWSTR *lpValue, DWORD *dwValueLen) +{ + LPCWSTR lpLine; + LPCWSTR lpLineEnd; + LPCWSTR name = NULL; + LPCWSTR value = NULL; + DWORD vallen = 0; + DWORD namelen = 0; + DWORD dwLen; + lpLine = UXINI_GetNextLine(uf, &dwLen); + if(!lpLine) + return NULL; + if(lpLine[0] == '[') { + UXINI_UnGetToLine(uf, lpLine); + return NULL; + } + lpLineEnd = lpLine + dwLen; + + name = lpLine; + while(namelen < dwLen && *lpLine != '=') { + lpLine++; + namelen++; + } + if(*lpLine != '=') return NULL; + lpLine++; + + /* Remove whitespace from end of name */ + while(UXINI_isspace(name[namelen-1])) namelen--; + /* Remove whitespace from beginning of value */ + while(UXINI_isspace(*lpLine) && lpLine < lpLineEnd) lpLine++; + value = lpLine; + vallen = dwLen-(value-name); + + *dwNameLen = namelen; + *dwValueLen = vallen; + *lpValue = value; + + return name; +} + +/********************************************************************** + * UXINI_FindValue + * + * Locate a value by name + * + * PARAMS + * uf INI file to search, search starts at current location + * lpName Value name to locate + * lpValue Location to store pointer to the value + * dwValueLen Location to store pointer to value length + * + * RETURNS + * The value name, non NULL terminated + */ +BOOL UXINI_FindValue(PUXINI_FILE uf, LPCWSTR lpName, LPCWSTR *lpValue, DWORD *dwValueLen) +{ + LPCWSTR name; + DWORD namelen; + + while((name = UXINI_GetNextValue(uf, &namelen, lpValue, dwValueLen))) { + if(CompareStringW(LOCALE_SYSTEM_DEFAULT, NORM_IGNORECASE, name, namelen, lpName, -1) == CSTR_EQUAL) { + return TRUE; + } + } + return FALSE; +} diff --git a/dlls/uxtheme/uxthemedll.h b/dlls/uxtheme/uxthemedll.h index 3c0940d2384..4ac851d6314 100644 --- a/dlls/uxtheme/uxthemedll.h +++ b/dlls/uxtheme/uxthemedll.h @@ -85,6 +85,6 @@ HRESULT WINAPI EnumThemeSizes(LPWSTR pszThemeFileName, LPWSTR pszColorName, HRESULT WINAPI ParseThemeIniFile(LPCWSTR pszIniFileName, LPWSTR pszUnknown, ParseThemeIniFileProc callback, LPVOID lpData); -extern void UXTHEME_InitSystem(void); +extern void UXTHEME_InitSystem(HINSTANCE hInst); #endif