Author: gadamopoulos Date: Wed Apr 26 09:28:35 2017 New Revision: 74407
URL: http://svn.reactos.org/svn/reactos?rev=74407&view=rev Log: [UXTHEME] -Implement the tab background texture. NOTE: A hack was used to go around the problem that SetBrushOrgEx doesn't really work. CORE-12978
Modified: trunk/reactos/dll/win32/uxtheme/draw.c trunk/reactos/dll/win32/uxtheme/themehooks.c trunk/reactos/dll/win32/uxtheme/uxthemep.h
Modified: trunk/reactos/dll/win32/uxtheme/draw.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/uxtheme/draw.c?re... ============================================================================== --- trunk/reactos/dll/win32/uxtheme/draw.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/uxtheme/draw.c [iso-8859-1] Wed Apr 26 09:28:35 2017 @@ -61,7 +61,7 @@ dwDialogTextureFlags = HandleToUlong( GetPropW( hwnd, (LPCWSTR)MAKEINTATOM(atDialogThemeEnabled) )); if (dwDialogTextureFlags == 0) /* Means EnableThemeDialogTexture wasn't called for this dialog */ - return TRUE; + return FALSE;
return (dwDialogTextureFlags & ETDT_ENABLE) && !(dwDialogTextureFlags & ETDT_DISABLE); } @@ -224,7 +224,7 @@ * * Load image for part/state */ -static HRESULT UXTHEME_LoadImage(HTHEME hTheme, HDC hdc, int iPartId, int iStateId, const RECT *pRect, BOOL glyph, +HRESULT UXTHEME_LoadImage(HTHEME hTheme, HDC hdc, int iPartId, int iStateId, const RECT *pRect, BOOL glyph, HBITMAP *hBmp, RECT *bmpRect, BOOL* hasImageAlpha) { int imagelayout = IL_HORIZONTAL;
Modified: trunk/reactos/dll/win32/uxtheme/themehooks.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/uxtheme/themehook... ============================================================================== --- trunk/reactos/dll/win32/uxtheme/themehooks.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/uxtheme/themehooks.c [iso-8859-1] Wed Apr 26 09:28:35 2017 @@ -11,6 +11,7 @@ USERAPIHOOK user32ApiHook; BYTE gabDWPmessages[UAHOWP_MAX_SIZE]; BYTE gabMSGPmessages[UAHOWP_MAX_SIZE]; +BYTE gabDLGPmessages[UAHOWP_MAX_SIZE]; BOOL gbThemeHooksActive = FALSE;
PWND_CONTEXT ThemeGetWndContext(HWND hWnd) @@ -56,7 +57,19 @@ { user32ApiHook.SetWindowRgn(hWnd, 0, TRUE); } - + + if (pContext->hTabBackgroundBrush != NULL) + { + DeleteObject(pContext->hTabBackgroundBrush); + pContext->hTabBackgroundBrush = NULL; + } + + if (pContext->hTabBackgroundBmp != NULL) + { + DeleteObject(pContext->hTabBackgroundBmp); + pContext->hTabBackgroundBmp = NULL; + } + HeapFree(GetProcessHeap(), 0, pContext);
SetPropW( hWnd, (LPCWSTR)MAKEINTATOM(atWndContext), NULL); @@ -225,8 +238,27 @@ switch(Msg) { case WM_THEMECHANGED: + { + PWND_CONTEXT pcontext = ThemeGetWndContext(hWnd); + if (GetAncestor(hWnd, GA_PARENT) == GetDesktopWindow()) UXTHEME_LoadTheme(TRUE); + + if (pcontext == NULL) + return 0; + + if (pcontext->hTabBackgroundBrush != NULL) + { + DeleteObject(pcontext->hTabBackgroundBrush); + pcontext->hTabBackgroundBrush = NULL; + } + + if (pcontext->hTabBackgroundBmp != NULL) + { + DeleteObject(pcontext->hTabBackgroundBmp); + pcontext->hTabBackgroundBmp = NULL; + } + } case WM_NCCREATE: { PWND_CONTEXT pcontext = ThemeGetWndContext(hWnd); @@ -253,6 +285,126 @@ { ThemeDestroyWndContext(hWnd); return 0; + } + } + + return 0; +} + +HRESULT GetDiaogTextureBrush(HTHEME theme, HWND hwnd, HDC hdc, HBRUSH* result, BOOL changeOrigin) +{ + PWND_CONTEXT pcontext; + + pcontext = ThemeGetWndContext(hwnd); + if (pcontext == NULL) + return E_FAIL; + + if (pcontext->hTabBackgroundBrush == NULL) + { + HBITMAP hbmp; + RECT dummy, bmpRect; + BOOL hasImageAlpha; + //HTHEME theme = GetWindowTheme(hwnd); + theme = MSSTYLES_OpenThemeClass(ActiveThemeFile, NULL, L"TAB"); + if (!theme) + return E_FAIL; + + UXTHEME_LoadImage(theme, 0, TABP_BODY, 0, &dummy, FALSE, &hbmp, &bmpRect, &hasImageAlpha); + if (changeOrigin) + { + /* Unfortunately SetBrushOrgEx doesn't work at all */ + RECT rcWindow, rcParent; + POINT pt; + HDC hdcPattern, hdcHackPattern; + HBITMAP hbmpOld1, hbmpold2, hbmpHack; + + GetWindowRect(hwnd, &rcWindow); + GetWindowRect(GetParent(hwnd), &rcParent); + pt.x = rcWindow.left - rcParent.left; + pt.y = rcWindow.top - rcParent.top; + + hdcPattern = CreateCompatibleDC(hdc); + hbmpOld1 = (HBITMAP)SelectObject(hdcPattern, hbmp); + + hdcHackPattern = CreateCompatibleDC(hdc); + hbmpHack = CreateCompatibleBitmap(hdc, bmpRect.right, bmpRect.bottom); + hbmpold2 = (HBITMAP)SelectObject(hdcHackPattern, hbmpHack); + + BitBlt(hdcHackPattern, 0, 0, bmpRect.right, bmpRect.bottom - pt.y, hdcPattern, 0, pt.y, SRCCOPY); + BitBlt(hdcHackPattern, 0, bmpRect.bottom - pt.y, bmpRect.right, pt.y, hdcPattern, 0, 0, SRCCOPY); + + hbmpold2 = (HBITMAP)SelectObject(hdcHackPattern, hbmpold2); + hbmpOld1 = (HBITMAP)SelectObject(hdcPattern, hbmpOld1); + + DeleteDC(hdcPattern); + DeleteDC(hdcHackPattern); + + /* Keep the handle of the bitmap we created so that it can be used later */ + pcontext->hTabBackgroundBmp = hbmpHack; + hbmp = hbmpHack; + } + + /* hbmp is cached so there is no need to free it */ + pcontext->hTabBackgroundBrush = CreatePatternBrush(hbmp); + } + + if (!pcontext->hTabBackgroundBrush) + return E_FAIL; + + *result = pcontext->hTabBackgroundBrush; + return S_OK; +} + +void HackFillStaticBg(HWND hwnd, HDC hdc, HBRUSH* result) +{ + RECT rcStatic; + + GetClientRect(hwnd, &rcStatic); + FillRect(hdc, &rcStatic, *result); + + SetBkMode (hdc, TRANSPARENT); + *result = GetStockObject (NULL_BRUSH); +} + +static LRESULT CALLBACK +ThemeDlgPreWindowProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam, ULONG_PTR ret,PDWORD unknown) +{ + return 0; +} + +static LRESULT CALLBACK +ThemeDlgPostWindowProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam, ULONG_PTR ret,PDWORD unknown) +{ + switch(Msg) + { + case WM_CTLCOLORDLG: + case WM_CTLCOLORBTN: + case WM_CTLCOLORSTATIC: + { + HWND hwndTarget = (HWND)lParam; + HDC hdc = (HDC)wParam; + HBRUSH* phbrush = (HBRUSH*)ret; + HTHEME theme = GetWindowTheme ( hWnd ); + + if (!IsAppThemed()) + break; + + if (!IsThemeDialogTextureEnabled (hWnd)) + break; + + GetDiaogTextureBrush(theme, hwndTarget, hdc, phbrush, Msg != WM_CTLCOLORDLG); + +#if 1 + { + WCHAR controlClass[32]; + GetClassNameW (hwndTarget, controlClass, sizeof(controlClass) / sizeof(controlClass[0])); + + /* This is a hack for the static class. Windows have a v6 static class just for this. */ + if (lstrcmpiW (controlClass, WC_STATICW) == 0) + HackFillStaticBg(hwndTarget, hdc, phbrush); + } +#endif + break; } }
@@ -333,8 +485,8 @@ puah->DefWindowProcW = ThemeDefWindowProcW; puah->PreWndProc = ThemePreWindowProc; puah->PostWndProc = ThemePostWindowProc; - puah->PreDefDlgProc = ThemePreWindowProc; - puah->PostDefDlgProc = ThemePostWindowProc; + puah->PreDefDlgProc = ThemeDlgPreWindowProc; + puah->PostDefDlgProc = ThemeDlgPostWindowProc; puah->DefWndProcArray.MsgBitArray = gabDWPmessages; puah->DefWndProcArray.Size = UAHOWP_MAX_SIZE; puah->WndProcArray.MsgBitArray = gabMSGPmessages; @@ -380,6 +532,16 @@ UAH_HOOK_MESSAGE(puah->WndProcArray, WM_THEMECHANGED); UAH_HOOK_MESSAGE(puah->WndProcArray, WM_UAHINIT);
+ puah->DlgProcArray.MsgBitArray = gabDLGPmessages; + puah->DlgProcArray.Size = UAHOWP_MAX_SIZE; + + UAH_HOOK_MESSAGE(puah->DlgProcArray, WM_INITDIALOG); + UAH_HOOK_MESSAGE(puah->DlgProcArray, WM_CTLCOLORMSGBOX); + UAH_HOOK_MESSAGE(puah->DlgProcArray, WM_CTLCOLORBTN); + UAH_HOOK_MESSAGE(puah->DlgProcArray, WM_CTLCOLORDLG); + UAH_HOOK_MESSAGE(puah->DlgProcArray, WM_CTLCOLORSTATIC); + UAH_HOOK_MESSAGE(puah->DlgProcArray, WM_PRINTCLIENT); + UXTHEME_LoadTheme(TRUE);
return TRUE;
Modified: trunk/reactos/dll/win32/uxtheme/uxthemep.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/uxtheme/uxthemep.... ============================================================================== --- trunk/reactos/dll/win32/uxtheme/uxthemep.h [iso-8859-1] (original) +++ trunk/reactos/dll/win32/uxtheme/uxthemep.h [iso-8859-1] Wed Apr 26 09:28:35 2017 @@ -85,6 +85,9 @@
typedef struct _UXINI_FILE *PUXINI_FILE;
+HRESULT UXTHEME_LoadImage(HTHEME hTheme, HDC hdc, int iPartId, int iStateId, const RECT *pRect, BOOL glyph, + HBITMAP *hBmp, RECT *bmpRect, BOOL* hasImageAlpha); + BOOL MSSTYLES_LookupProperty(LPCWSTR pszPropertyName, int *dwPrimitive, int *dwId); BOOL MSSTYLES_LookupEnum(LPCWSTR pszValueName, int dwEnum, int *dwValue); BOOL MSSTYLES_LookupPartState(LPCWSTR pszClass, LPCWSTR pszPart, LPCWSTR pszState, int *iPartId, int *iStateId); @@ -137,6 +140,8 @@ BOOL HasThemeRgn; BOOL UpdatingRgn; BOOL DirtyThemeRegion; + HBRUSH hTabBackgroundBrush; + HBITMAP hTabBackgroundBmp;
BOOL SCROLL_trackVertical; enum SCROLL_HITTEST SCROLL_trackHitTest;