EnumThemeColors() and EnumThemeSizes() actually do not return a single

string with the color/size name, but rather a struct containing three
strings - name, display name and tooltip.
This commit is contained in:
Frank Richter 2005-08-30 08:54:45 +00:00 committed by Alexandre Julliard
parent 9a88d25ba4
commit 28022e8022
3 changed files with 37 additions and 14 deletions

View File

@ -898,7 +898,7 @@ HRESULT WINAPI EnumThemes(LPCWSTR pszThemePath, EnumThemeProc callback,
* pszSizeName Theme size to enumerate available colors * pszSizeName Theme size to enumerate available colors
* If NULL the default theme size is used * If NULL the default theme size is used
* dwColorNum Color index to retrieve, increment from 0 * dwColorNum Color index to retrieve, increment from 0
* pszColorName Output color name * pszColorNames Output color names
* *
* RETURNS * RETURNS
* S_OK on success * S_OK on success
@ -906,19 +906,20 @@ HRESULT WINAPI EnumThemes(LPCWSTR pszThemePath, EnumThemeProc callback,
* or when pszSizeName does not refer to a valid size * or when pszSizeName does not refer to a valid size
* *
* NOTES * NOTES
* XP fails with E_POINTER when pszColorName points to a buffer smaller then 605 * XP fails with E_POINTER when pszColorNames points to a buffer smaller than
* characters * sizeof(THEMENAMES).
* *
* Not very efficient that I'm opening & validating the theme every call, but * Not very efficient that I'm opening & validating the theme every call, but
* this is undocumented and almost never called.. * this is undocumented and almost never called..
* (and this is how windows works too) * (and this is how windows works too)
*/ */
HRESULT WINAPI EnumThemeColors(LPWSTR pszThemeFileName, LPWSTR pszSizeName, HRESULT WINAPI EnumThemeColors(LPWSTR pszThemeFileName, LPWSTR pszSizeName,
DWORD dwColorNum, LPWSTR pszColorName) DWORD dwColorNum, PTHEMENAMES pszColorNames)
{ {
PTHEME_FILE pt; PTHEME_FILE pt;
HRESULT hr; HRESULT hr;
LPWSTR tmp; LPWSTR tmp;
UINT resourceId = dwColorNum + 1000;
TRACE("(%s,%s,%ld)\n", debugstr_w(pszThemeFileName), TRACE("(%s,%s,%ld)\n", debugstr_w(pszThemeFileName),
debugstr_w(pszSizeName), dwColorNum); debugstr_w(pszSizeName), dwColorNum);
@ -932,7 +933,13 @@ HRESULT WINAPI EnumThemeColors(LPWSTR pszThemeFileName, LPWSTR pszSizeName,
} }
if(!dwColorNum && *tmp) { if(!dwColorNum && *tmp) {
TRACE("%s\n", debugstr_w(tmp)); TRACE("%s\n", debugstr_w(tmp));
lstrcpyW(pszColorName, tmp); lstrcpyW(pszColorNames->szName, tmp);
LoadStringW (pt->hTheme, resourceId,
pszColorNames->szDisplayName,
sizeof (pszColorNames->szDisplayName) / sizeof (WCHAR));
LoadStringW (pt->hTheme, resourceId+1000,
pszColorNames->szTooltip,
sizeof (pszColorNames->szTooltip) / sizeof (WCHAR));
} }
else else
hr = E_PROP_ID_UNSUPPORTED; hr = E_PROP_ID_UNSUPPORTED;
@ -951,7 +958,7 @@ HRESULT WINAPI EnumThemeColors(LPWSTR pszThemeFileName, LPWSTR pszSizeName,
* pszColorName Theme color to enumerate available sizes * pszColorName Theme color to enumerate available sizes
* If NULL the default theme color is used * If NULL the default theme color is used
* dwSizeNum Size index to retrieve, increment from 0 * dwSizeNum Size index to retrieve, increment from 0
* pszSizeName Output size name * pszSizeNames Output size names
* *
* RETURNS * RETURNS
* S_OK on success * S_OK on success
@ -959,19 +966,20 @@ HRESULT WINAPI EnumThemeColors(LPWSTR pszThemeFileName, LPWSTR pszSizeName,
* or when pszColorName does not refer to a valid color * or when pszColorName does not refer to a valid color
* *
* NOTES * NOTES
* XP fails with E_POINTER when pszSizeName points to a buffer smaller then 605 * XP fails with E_POINTER when pszSizeNames points to a buffer smaller than
* characters * sizeof(THEMENAMES).
* *
* Not very efficient that I'm opening & validating the theme every call, but * Not very efficient that I'm opening & validating the theme every call, but
* this is undocumented and almost never called.. * this is undocumented and almost never called..
* (and this is how windows works too) * (and this is how windows works too)
*/ */
HRESULT WINAPI EnumThemeSizes(LPWSTR pszThemeFileName, LPWSTR pszColorName, HRESULT WINAPI EnumThemeSizes(LPWSTR pszThemeFileName, LPWSTR pszColorName,
DWORD dwSizeNum, LPWSTR pszSizeName) DWORD dwSizeNum, PTHEMENAMES pszSizeNames)
{ {
PTHEME_FILE pt; PTHEME_FILE pt;
HRESULT hr; HRESULT hr;
LPWSTR tmp; LPWSTR tmp;
UINT resourceId = dwSizeNum + 3000;
TRACE("(%s,%s,%ld)\n", debugstr_w(pszThemeFileName), TRACE("(%s,%s,%ld)\n", debugstr_w(pszThemeFileName),
debugstr_w(pszColorName), dwSizeNum); debugstr_w(pszColorName), dwSizeNum);
@ -985,7 +993,13 @@ HRESULT WINAPI EnumThemeSizes(LPWSTR pszThemeFileName, LPWSTR pszColorName,
} }
if(!dwSizeNum && *tmp) { if(!dwSizeNum && *tmp) {
TRACE("%s\n", debugstr_w(tmp)); TRACE("%s\n", debugstr_w(tmp));
lstrcpyW(pszSizeName, tmp); lstrcpyW(pszSizeNames->szName, tmp);
LoadStringW (pt->hTheme, resourceId,
pszSizeNames->szDisplayName,
sizeof (pszSizeNames->szDisplayName) / sizeof (WCHAR));
LoadStringW (pt->hTheme, resourceId+1000,
pszSizeNames->szTooltip,
sizeof (pszSizeNames->szTooltip) / sizeof (WCHAR));
} }
else else
hr = E_PROP_ID_UNSUPPORTED; hr = E_PROP_ID_UNSUPPORTED;

View File

@ -5,8 +5,8 @@
4 stdcall -noname ApplyTheme(ptr ptr ptr) 4 stdcall -noname ApplyTheme(ptr ptr ptr)
7 stdcall -noname GetThemeDefaults(wstr wstr long wstr long) 7 stdcall -noname GetThemeDefaults(wstr wstr long wstr long)
8 stdcall -noname EnumThemes(wstr ptr ptr) 8 stdcall -noname EnumThemes(wstr ptr ptr)
9 stdcall -noname EnumThemeColors(wstr wstr long wstr) 9 stdcall -noname EnumThemeColors(wstr wstr long ptr)
10 stdcall -noname EnumThemeSizes(wstr wstr long wstr) 10 stdcall -noname EnumThemeSizes(wstr wstr long ptr)
11 stdcall -noname ParseThemeIniFile(wstr wstr ptr ptr) 11 stdcall -noname ParseThemeIniFile(wstr wstr ptr ptr)
13 stub -noname DrawNCPreview 13 stub -noname DrawNCPreview
14 stub -noname RegisterDefaultTheme 14 stub -noname RegisterDefaultTheme

View File

@ -66,6 +66,15 @@ typedef BOOL (CALLBACK*ParseThemeIniFileProc)(DWORD dwType, LPWSTR pszParam1,
LPWSTR pszParam2, LPWSTR pszParam3, LPWSTR pszParam2, LPWSTR pszParam3,
DWORD dwParam, LPVOID lpData); DWORD dwParam, LPVOID lpData);
/* Structure filled in by EnumThemeColors() and EnumeThemeSizes() with the
* various strings for a theme color or size. */
typedef struct tagTHEMENAMES
{
WCHAR szName[MAX_PATH+1];
WCHAR szDisplayName[MAX_PATH+1];
WCHAR szTooltip[MAX_PATH+1];
} THEMENAMES, *PTHEMENAMES;
/* Declarations for undocumented functions for use internally */ /* Declarations for undocumented functions for use internally */
DWORD WINAPI QueryThemeServices(void); DWORD WINAPI QueryThemeServices(void);
HRESULT WINAPI OpenThemeFile(LPCWSTR pszThemeFileName, LPCWSTR pszColorName, HRESULT WINAPI OpenThemeFile(LPCWSTR pszThemeFileName, LPCWSTR pszColorName,
@ -79,9 +88,9 @@ HRESULT WINAPI GetThemeDefaults(LPCWSTR pszThemeFileName, LPWSTR pszColorName,
HRESULT WINAPI EnumThemes(LPCWSTR pszThemePath, EnumThemeProc callback, HRESULT WINAPI EnumThemes(LPCWSTR pszThemePath, EnumThemeProc callback,
LPVOID lpData); LPVOID lpData);
HRESULT WINAPI EnumThemeColors(LPWSTR pszThemeFileName, LPWSTR pszSizeName, HRESULT WINAPI EnumThemeColors(LPWSTR pszThemeFileName, LPWSTR pszSizeName,
DWORD dwColorNum, LPWSTR pszColorName); DWORD dwColorNum, PTHEMENAMES pszColorNames);
HRESULT WINAPI EnumThemeSizes(LPWSTR pszThemeFileName, LPWSTR pszColorName, HRESULT WINAPI EnumThemeSizes(LPWSTR pszThemeFileName, LPWSTR pszColorName,
DWORD dwSizeNum, LPWSTR pszSizeName); DWORD dwSizeNum, PTHEMENAMES pszColorNames);
HRESULT WINAPI ParseThemeIniFile(LPCWSTR pszIniFileName, LPWSTR pszUnknown, HRESULT WINAPI ParseThemeIniFile(LPCWSTR pszIniFileName, LPWSTR pszUnknown,
ParseThemeIniFileProc callback, LPVOID lpData); ParseThemeIniFileProc callback, LPVOID lpData);