/*********************************************************************** * GetThemeSysBool (UXTHEME.@) */ BOOL WINAPI GetThemeSysBool(HTHEME hTheme, int iBoolID) { HRESULT hr; PTHEME_PROPERTY tp; BOOL ret; TRACE("(%p, %d)\n", hTheme, iBoolID); SetLastError(0); if(hTheme) { if((tp = MSSTYLES_FindMetric(TMT_BOOL, iBoolID))) { hr = MSSTYLES_GetPropertyBool(tp, &ret); if(SUCCEEDED(hr)) return ret; else SetLastError(hr); } } if(iBoolID == TMT_FLATMENUS) { if(SystemParametersInfoW(SPI_GETFLATMENU, 0, &ret, 0)) return ret; } else { FIXME("Unknown bool id: %d\n", iBoolID); SetLastError(STG_E_INVALIDPARAMETER); } return FALSE; }
/*********************************************************************** * GetThemeSysFont (UXTHEME.@) */ HRESULT WINAPI GetThemeSysFont(HTHEME hTheme, int iFontID, LOGFONTW *plf) { HRESULT hr = S_OK; PTHEME_PROPERTY tp; TRACE("(%p, %d)\n", hTheme, iFontID); if(hTheme) { if((tp = MSSTYLES_FindMetric(TMT_FONT, iFontID))) { HDC hdc = GetDC(NULL); hr = MSSTYLES_GetPropertyFont(tp, hdc, plf); ReleaseDC(NULL, hdc); if(SUCCEEDED(hr)) return S_OK; } } if(iFontID == TMT_ICONTITLEFONT) { if(!SystemParametersInfoW(SPI_GETICONTITLELOGFONT, sizeof(LOGFONTW), plf, 0)) return HRESULT_FROM_WIN32(GetLastError()); } else { NONCLIENTMETRICSW ncm; LOGFONTW *font = NULL; ncm.cbSize = sizeof(NONCLIENTMETRICSW); if(!SystemParametersInfoW(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICSW), &ncm, 0)) return HRESULT_FROM_WIN32(GetLastError()); switch(iFontID) { case TMT_CAPTIONFONT: font = &ncm.lfCaptionFont; break; case TMT_SMALLCAPTIONFONT: font = &ncm.lfSmCaptionFont; break; case TMT_MENUFONT: font = &ncm.lfMenuFont; break; case TMT_STATUSFONT: font = &ncm.lfStatusFont; break; case TMT_MSGBOXFONT: font = &ncm.lfMessageFont; break; default: FIXME("Unknown FontID: %d\n", iFontID); break; } if(font) *plf = *font; else hr = STG_E_INVALIDPARAMETER; } return hr; }
/*********************************************************************** * GetThemeSysInt (UXTHEME.@) */ HRESULT WINAPI GetThemeSysInt(HTHEME hTheme, int iIntID, int *piValue) { PTHEME_PROPERTY tp; TRACE("(%p, %d)\n", hTheme, iIntID); if(!hTheme) return E_HANDLE; if(iIntID < TMT_FIRSTINT || iIntID > TMT_LASTINT) { WARN("Unknown IntID: %d\n", iIntID); return STG_E_INVALIDPARAMETER; } if((tp = MSSTYLES_FindMetric(TMT_INT, iIntID))) return MSSTYLES_GetPropertyInt(tp, piValue); return E_PROP_ID_UNSUPPORTED; }
/*********************************************************************** * GetThemeSysSize (UXTHEME.@) */ int WINAPI GetThemeSysSize(HTHEME hTheme, int iSizeID) { PTHEME_PROPERTY tp; int i, id = -1; int metricMap[] = { SM_CXVSCROLL, TMT_SCROLLBARWIDTH, SM_CYHSCROLL, TMT_SCROLLBARHEIGHT, SM_CXSIZE, TMT_CAPTIONBARWIDTH, SM_CYSIZE, TMT_CAPTIONBARHEIGHT, SM_CXFRAME, TMT_SIZINGBORDERWIDTH, SM_CYFRAME, TMT_SIZINGBORDERWIDTH, /* There is no TMT_SIZINGBORDERHEIGHT, but this works in windows.. */ SM_CXSMSIZE, TMT_SMCAPTIONBARWIDTH, SM_CYSMSIZE, TMT_SMCAPTIONBARHEIGHT, SM_CXMENUSIZE, TMT_MENUBARWIDTH, SM_CYMENUSIZE, TMT_MENUBARHEIGHT }; if(hTheme) { PTHEME_CLASS ptc = (PTHEME_CLASS) hTheme; for(i=0; i<sizeof(metricMap)/sizeof(metricMap[0]); i+=2) { if(metricMap[i] == iSizeID) { id = metricMap[i+1]; break; } } SetLastError(0); if(id != -1) { if((tp = MSSTYLES_FindMetric(ptc->tf, TMT_SIZE, id))) { if(SUCCEEDED(MSSTYLES_GetPropertyInt(tp, &i))) { return i; } } TRACE("Size %d not found in theme, using system metric\n", iSizeID); } else { SetLastError(STG_E_INVALIDPARAMETER); return 0; } } // TODO: Check if this is correct // In windows for SM_CXFRAME this function returns what seems to be the non client metric iBorderWidth if (iSizeID == SM_CXFRAME) return GetSystemMetrics(SM_CXFRAME) - GetSystemMetrics(SM_CXDLGFRAME); return GetSystemMetrics(iSizeID); }
/*********************************************************************** * GetThemeSysString (UXTHEME.@) */ HRESULT WINAPI GetThemeSysString(HTHEME hTheme, int iStringID, LPWSTR pszStringBuff, int cchMaxStringChars) { PTHEME_PROPERTY tp; TRACE("(%p, %d)\n", hTheme, iStringID); if(!hTheme) return E_HANDLE; if(iStringID < TMT_FIRSTSTRING || iStringID > TMT_LASTSTRING) { WARN("Unknown StringID: %d\n", iStringID); return STG_E_INVALIDPARAMETER; } if((tp = MSSTYLES_FindMetric(TMT_STRING, iStringID))) return MSSTYLES_GetPropertyString(tp, pszStringBuff, cchMaxStringChars); return E_PROP_ID_UNSUPPORTED; }
/*********************************************************************** * MSSTYLES_AddMetric * * Add a property to a part/state * * PARAMS * tf Theme file * iPropertyPrimitive Primitive type of the property * iPropertyId ID of the property * lpValue Raw value (non-NULL terminated) * dwValueLen Length of the value * * RETURNS * The property added, or a property previously added with the same IDs */ static PTHEME_PROPERTY MSSTYLES_AddMetric(PTHEME_FILE tf, int iPropertyPrimitive, int iPropertyId, LPCWSTR lpValue, DWORD dwValueLen) { PTHEME_PROPERTY cur = MSSTYLES_FindMetric(tf, iPropertyPrimitive, iPropertyId); /* Should duplicate properties overwrite the original, or be ignored? */ if(cur) return cur; cur = HeapAlloc(GetProcessHeap(), 0, sizeof(THEME_PROPERTY)); cur->iPrimitiveType = iPropertyPrimitive; cur->iPropertyId = iPropertyId; cur->lpValue = lpValue; cur->dwValueLen = dwValueLen; cur->origin = PO_GLOBAL; cur->next = tf->metrics; tf->metrics = cur; return cur; }
/*********************************************************************** * GetThemeSysColor (UXTHEME.@) */ COLORREF WINAPI GetThemeSysColor(HTHEME hTheme, int iColorID) { HRESULT hr; PTHEME_PROPERTY tp; TRACE("(%p, %d)\n", hTheme, iColorID); SetLastError(0); if(hTheme) { if((tp = MSSTYLES_FindMetric(TMT_COLOR, iColorID))) { COLORREF color; hr = MSSTYLES_GetPropertyColor(tp, &color); if(SUCCEEDED(hr)) return color; else SetLastError(hr); } } return GetSysColor(iColorID); }
/*********************************************************************** * GetThemeSysSize (UXTHEME.@) */ int WINAPI GetThemeSysSize(HTHEME hTheme, int iSizeID) { PTHEME_PROPERTY tp; int i, id = -1; int metricMap[] = { SM_CXVSCROLL, TMT_SCROLLBARWIDTH, SM_CYHSCROLL, TMT_SCROLLBARHEIGHT, SM_CXSIZE, TMT_CAPTIONBARWIDTH, SM_CYSIZE, TMT_CAPTIONBARHEIGHT, SM_CXFRAME, TMT_SIZINGBORDERWIDTH, SM_CYFRAME, TMT_SIZINGBORDERWIDTH, /* There is no TMT_SIZINGBORDERHEIGHT, but this works in windows.. */ SM_CXSMSIZE, TMT_SMCAPTIONBARWIDTH, SM_CYSMSIZE, TMT_SMCAPTIONBARHEIGHT, SM_CXMENUSIZE, TMT_MENUBARWIDTH, SM_CYMENUSIZE, TMT_MENUBARHEIGHT }; if(hTheme) { for(i=0; i<sizeof(metricMap)/sizeof(metricMap[0]); i+=2) { if(metricMap[i] == iSizeID) { id = metricMap[i+1]; break; } } SetLastError(0); if(id != -1) { if((tp = MSSTYLES_FindMetric(TMT_SIZE, id))) { if(SUCCEEDED(MSSTYLES_GetPropertyInt(tp, &i))) { return i; } } TRACE("Size %d not found in theme, using system metric\n", iSizeID); } else { SetLastError(STG_E_INVALIDPARAMETER); return 0; } } return GetSystemMetrics(iSizeID); }
/*********************************************************************** * GetThemeSysColor (UXTHEME.@) */ COLORREF WINAPI GetThemeSysColor(HTHEME hTheme, int iColorID) { HRESULT hr; PTHEME_PROPERTY tp; // TODO: Check if this is correct if ( iColorID >= 0 && iColorID < 32) iColorID += TMT_SCROLLBAR; TRACE("(%p, %d)\n", hTheme, iColorID); SetLastError(0); if(hTheme) { PTHEME_CLASS ptc = (PTHEME_CLASS) hTheme; if((tp = MSSTYLES_FindMetric(ptc->tf, TMT_COLOR, iColorID))) { COLORREF color; hr = MSSTYLES_GetPropertyColor(tp, &color); if(SUCCEEDED(hr)) return color; else SetLastError(hr); } } return GetSysColor(iColorID); }