From: Nikolay Sivov Subject: uxtheme: Partial implementation of DrawThemeTextEx Message-Id: <55945877.2000007@codeweavers.com> Date: Thu, 02 Jul 2015 00:15:35 +0300 https://bugs.winehq.org/show_bug.cgi?id=38822 From eb0ba8ce4d80657852803d91e60a7dc6cfe901dd Mon Sep 17 00:00:00 2001 From: Nikolay Sivov Date: Thu, 2 Jul 2015 00:14:21 +0300 Subject: [PATCH] uxtheme: Partial implementation of DrawThemeTextEx --- dlls/uxtheme/draw.c | 45 +++++++++++++++++++++++++++++++++++---------- dlls/uxtheme/uxtheme.spec | 1 + include/uxtheme.h | 40 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 76 insertions(+), 10 deletions(-) diff --git a/dlls/uxtheme/draw.c b/dlls/uxtheme/draw.c index a7f80fd..e3d3679 100644 --- a/dlls/uxtheme/draw.c +++ b/dlls/uxtheme/draw.c @@ -1633,8 +1633,29 @@ HRESULT WINAPI DrawThemeIcon(HTHEME hTheme, HDC hdc, int iPartId, int iStateId, * DrawThemeText (UXTHEME.@) */ HRESULT WINAPI DrawThemeText(HTHEME hTheme, HDC hdc, int iPartId, int iStateId, - LPCWSTR pszText, int iCharCount, DWORD dwTextFlags, - DWORD dwTextFlags2, const RECT *pRect) + LPCWSTR pszText, int iCharCount, DWORD flags, + DWORD flags2, const RECT *pRect) +{ + DTTOPTS opts; + RECT rt; + + TRACE("%d %d\n", iPartId, iStateId); + + CopyRect(&rt, pRect); + + opts.dwSize = sizeof(opts); + if (flags2 & DTT_GRAYED) { + opts.dwFlags = DTT_TEXTCOLOR; + opts.crText = GetSysColor(COLOR_GRAYTEXT); + } + return DrawThemeTextEx(hTheme, hdc, iPartId, iStateId, pszText, iCharCount, flags, &rt, &opts); +} + +/*********************************************************************** + * DrawThemeTextEx (UXTHEME.@) + */ +HRESULT WINAPI DrawThemeTextEx(HTHEME hTheme, HDC hdc, int iPartId, int iStateId, + LPCWSTR pszText, int iCharCount, DWORD flags, RECT *rect, const DTTOPTS *options) { HRESULT hr; HFONT hFont = NULL; @@ -1643,11 +1664,15 @@ HRESULT WINAPI DrawThemeText(HTHEME hTheme, HDC hdc, int iPartId, int iStateId, COLORREF textColor; COLORREF oldTextColor; int oldBkMode; - RECT rt; - - TRACE("%d %d: stub\n", iPartId, iStateId); + + TRACE("%p %p %d %d %s:%d 0x%08x %p %p\n", hTheme, hdc, iPartId, iStateId, + debugstr_wn(pszText, iCharCount), iCharCount, flags, rect, options); + if(!hTheme) return E_HANDLE; + + if (options->dwFlags & ~DTT_TEXTCOLOR) + FIXME("unsupported flags 0x%08x\n", options->dwFlags); hr = GetThemeFont(hTheme, hdc, iPartId, iStateId, TMT_FONT, &logfont); if(SUCCEEDED(hr)) { @@ -1655,19 +1680,19 @@ HRESULT WINAPI DrawThemeText(HTHEME hTheme, HDC hdc, int iPartId, int iStateId, if(!hFont) TRACE("Failed to create font\n"); } - CopyRect(&rt, pRect); + if(hFont) oldFont = SelectObject(hdc, hFont); - - if(dwTextFlags2 & DTT_GRAYED) - textColor = GetSysColor(COLOR_GRAYTEXT); + + if (options->dwFlags & DTT_TEXTCOLOR) + textColor = options->crText; else { if(FAILED(GetThemeColor(hTheme, iPartId, iStateId, TMT_TEXTCOLOR, &textColor))) textColor = GetTextColor(hdc); } oldTextColor = SetTextColor(hdc, textColor); oldBkMode = SetBkMode(hdc, TRANSPARENT); - DrawTextW(hdc, pszText, iCharCount, &rt, dwTextFlags); + DrawTextW(hdc, pszText, iCharCount, rect, flags); SetBkMode(hdc, oldBkMode); SetTextColor(hdc, oldTextColor); diff --git a/dlls/uxtheme/uxtheme.spec b/dlls/uxtheme/uxtheme.spec index 7a0e7e4..d4ea07a 100644 --- a/dlls/uxtheme/uxtheme.spec +++ b/dlls/uxtheme/uxtheme.spec @@ -58,6 +58,7 @@ @ stdcall DrawThemeIcon(ptr ptr long long ptr ptr long) @ stdcall DrawThemeParentBackground(ptr ptr ptr) @ stdcall DrawThemeText(ptr ptr long long wstr long long long ptr) +@ stdcall DrawThemeTextEx(ptr ptr long long wstr long long ptr ptr) @ stdcall EnableThemeDialogTexture(ptr long) @ stdcall EnableTheming(long) @ stdcall EndBufferedAnimation(ptr long) diff --git a/include/uxtheme.h b/include/uxtheme.h index e167d80..7606306 100644 --- a/include/uxtheme.h +++ b/include/uxtheme.h @@ -53,6 +53,46 @@ HRESULT WINAPI DrawThemeParentBackground(HWND,HDC,RECT*); HRESULT WINAPI DrawThemeText(HTHEME,HDC,int,int,LPCWSTR,int,DWORD,DWORD, const RECT*); +/* DTTOPTS.dwFlags bits */ +#define DTT_TEXTCOLOR 0x00000001 +#define DTT_BORDERCOLOR 0x00000002 +#define DTT_SHADOWCOLOR 0x00000004 +#define DTT_SHADOWTYPE 0x00000008 +#define DTT_SHADOWOFFSET 0x00000010 +#define DTT_BORDERSIZE 0x00000020 +#define DTT_FONTPROP 0x00000040 +#define DTT_COLORPROP 0x00000080 +#define DTT_STATEID 0x00000100 +#define DTT_CALCRECT 0x00000200 +#define DTT_APPLYOVERLAY 0x00000400 +#define DTT_GLOWSIZE 0x00000800 +#define DTT_CALLBACK 0x00001000 +#define DTT_COMPOSITED 0x00002000 +#define DTT_VALIDBITS 0x00003fff + +typedef int (WINAPI *DTT_CALLBACK_PROC)(HDC,LPWSTR,int,RECT*,UINT,LPARAM); + +typedef struct _DTTOPTS { + DWORD dwSize; + DWORD dwFlags; + COLORREF crText; + COLORREF crBorder; + COLORREF crShadow; + int iTextShadowType; + POINT ptShadowOffset; + int iBorderSize; + int iFontPropId; + int iColorPropId; + int iStateId; + BOOL fApplyOverlay; + int iGlowSize; + DTT_CALLBACK_PROC pfnDrawTextCallback; + LPARAM lParam; +} DTTOPTS, *PDTTOPTS; + +HRESULT WINAPI DrawThemeTextEx(HTHEME,HDC,int,int,LPCWSTR,int,DWORD,RECT*, + const DTTOPTS*); + #define ETDT_DISABLE 0x00000001 #define ETDT_ENABLE 0x00000002 #define ETDT_USETABTEXTURE 0x00000004 -- 2.1.4