uxtheme: Partial implementation of DrawThemeTextEx

Nikolay Sivov nsivov at codeweavers.com
Wed Jul 1 16:15:35 CDT 2015


https://bugs.winehq.org/show_bug.cgi?id=38822
-------------- next part --------------
From eb0ba8ce4d80657852803d91e60a7dc6cfe901dd Mon Sep 17 00:00:00 2001
From: Nikolay Sivov <nsivov at codeweavers.com>
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



More information about the wine-patches mailing list