[PATCH 5/5] comctl32/propsheet: Handle page dialog tab texture in DefDlgProc().
Zhiyi Zhang
zzhang at codeweavers.com
Mon Jan 24 01:47:43 CST 2022
Signed-off-by: Zhiyi Zhang <zzhang at codeweavers.com>
---
dlls/comctl32/propsheet.c | 164 --------------------------------------
1 file changed, 164 deletions(-)
diff --git a/dlls/comctl32/propsheet.c b/dlls/comctl32/propsheet.c
index 82c0a3cc576..556d63f2c75 100644
--- a/dlls/comctl32/propsheet.c
+++ b/dlls/comctl32/propsheet.c
@@ -63,7 +63,6 @@
#include "prsht.h"
#include "comctl32.h"
#include "uxtheme.h"
-#include "vsstyle.h"
#include "wine/debug.h"
@@ -141,7 +140,6 @@ typedef struct
*/
static const WCHAR PropSheetInfoStr[] = L"PropertySheetInfo";
-static const WCHAR PropSheetPageBackgroundBrush[] = L"PropSheetPageBackgroundBrush";
#define PSP_INTERNAL_UNICODE 0x80000000
@@ -1198,136 +1196,6 @@ PROPSHEET_WizardSubclassProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam,
return DefSubclassProc(hwnd, uMsg, wParam, lParam);
}
-static HBRUSH get_propsheet_background_brush(HWND hwnd)
-{
- HBITMAP bitmap, old_bitmap;
- HDC hdc, hdc_screen;
- HBRUSH brush;
- HTHEME theme;
- HRESULT hr;
- RECT rect;
- SIZE size;
-
- brush = GetPropW(hwnd, PropSheetPageBackgroundBrush);
- if (brush)
- return brush;
-
- theme = OpenThemeData(NULL, L"Tab");
- if (!theme)
- return NULL;
-
- hr = GetThemePartSize(theme, NULL, TABP_BODY, 0, NULL, TS_TRUE, &size);
- if (FAILED(hr))
- {
- size.cx = 10;
- size.cy = 600;
- }
-
- hdc_screen = GetDC(NULL);
- hdc = CreateCompatibleDC(hdc_screen);
- bitmap = CreateCompatibleBitmap(hdc_screen, size.cx, size.cy);
- old_bitmap = SelectObject(hdc, bitmap);
-
- SetRect(&rect, 0, 0, size.cx, size.cy);
- /* FIXME: XP draws the tab body bitmap directly without transparency even if there is */
- FillRect(hdc, &rect, GetSysColorBrush(COLOR_3DFACE));
- hr = DrawThemeBackground(theme, hdc, TABP_BODY, 0, &rect, NULL);
- if (SUCCEEDED(hr))
- {
- brush = CreatePatternBrush(bitmap);
- SetPropW(hwnd, PropSheetPageBackgroundBrush, brush);
- }
-
- SelectObject(hdc, old_bitmap);
- DeleteDC(hdc);
- ReleaseDC(NULL, hdc_screen);
- CloseThemeData(theme);
- return brush;
-}
-
-/* Subclassing window procedure for theming dialogs in property sheet pages */
-static LRESULT CALLBACK PROPSHEET_ThemedSubclassProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp,
- UINT_PTR id, DWORD_PTR ref)
-{
- POINT org, old_org;
- LOGBRUSH logbrush;
- WNDPROC dlgproc;
- HBRUSH brush;
- LRESULT lr;
- RECT rect;
- HDC hdc;
-
- switch (msg)
- {
- case WM_THEMECHANGED:
- {
- brush = GetPropW(hwnd, PropSheetPageBackgroundBrush);
- if (brush)
- {
- RemovePropW(hwnd, PropSheetPageBackgroundBrush);
- if (GetObjectW(brush, sizeof(logbrush), &logbrush) == sizeof(logbrush))
- DeleteObject((HBITMAP)logbrush.lbHatch);
- DeleteObject(brush);
- }
- InvalidateRect(hwnd, NULL, TRUE);
- break;
- }
- case WM_ERASEBKGND:
- {
- if (!IsThemeActive() || !IsThemeDialogTextureEnabled(hwnd))
- break;
-
- dlgproc = (WNDPROC)GetWindowLongPtrW(hwnd, DWLP_DLGPROC);
- lr = CallWindowProcW(dlgproc, hwnd, msg, wp, lp);
- if (lr)
- return lr;
-
- brush = get_propsheet_background_brush(hwnd);
- if (!brush)
- break;
-
- /* Using FillRect() to draw background could introduce a tiling effect if the destination
- * rectangle is larger than the pattern brush size, which is usually 10x600. This bug is
- * visible on property sheet pages if system DPI is set to 192. However, the same bug also
- * exists on XP and explains why vista+ don't use gradient tab body background anymore */
- hdc = (HDC)wp;
- GetViewportOrgEx(hdc, &org);
- SetBrushOrgEx(hdc, org.x, org.y, &old_org);
- GetClientRect(hwnd, &rect);
- FillRect(hdc, &rect, brush);
- SetBrushOrgEx(hdc, old_org.x, old_org.y, NULL);
- return TRUE;
- }
-
- case WM_CTLCOLORSTATIC:
- {
- if (!IsThemeActive() || !IsThemeDialogTextureEnabled(hwnd))
- break;
-
- dlgproc = (WNDPROC)GetWindowLongPtrW(hwnd, DWLP_DLGPROC);
- lr = CallWindowProcW(dlgproc, hwnd, msg, wp, lp);
- if (lr)
- return lr;
-
- brush = get_propsheet_background_brush(hwnd);
- if (!brush)
- break;
-
- hdc = (HDC)wp;
- SetBkColor(hdc, GetSysColor(COLOR_BTNFACE));
- SetBkMode(hdc, TRANSPARENT);
-
- org.x = 0;
- org.y = 0;
- MapWindowPoints((HWND)lp, hwnd, &org, 1);
- SetBrushOrgEx(hdc, -org.x, -org.y, NULL);
- return (LRESULT)brush;
- }
- }
-
- return DefSubclassProc(hwnd, msg, wp, lp);
-}
-
/*
* Get the size of an in-memory Template
*
@@ -1599,10 +1467,6 @@ static BOOL PROPSHEET_CreatePage(HWND hwndParent,
SetWindowSubclass(hwndPage, PROPSHEET_WizardSubclassProc, 1,
(DWORD_PTR)ppshpage);
}
- else
- {
- SetWindowSubclass(hwndPage, PROPSHEET_ThemedSubclassProc, 1, (DWORD_PTR)ppshpage);
- }
if (!(psInfo->ppshheader.dwFlags & INTRNL_ANY_WIZARD))
EnableThemeDialogTexture (hwndPage, ETDT_ENABLETAB);
@@ -2487,8 +2351,6 @@ static BOOL PROPSHEET_RemovePage(HWND hwndDlg,
PropSheetInfo * psInfo = GetPropW(hwndDlg, PropSheetInfoStr);
HWND hwndTabControl = GetDlgItem(hwndDlg, IDC_TABCONTROL);
PropPageInfo* oldPages;
- LOGBRUSH logbrush;
- HBRUSH brush;
TRACE("index %d, hpage %p\n", index, hpage);
if (!psInfo) {
@@ -2546,18 +2408,6 @@ static BOOL PROPSHEET_RemovePage(HWND hwndDlg,
RemoveWindowSubclass(psInfo->proppage[index].hwndPage,
PROPSHEET_WizardSubclassProc, 1);
}
- else
- {
- RemoveWindowSubclass(psInfo->proppage[index].hwndPage, PROPSHEET_ThemedSubclassProc, 1);
- brush = GetPropW(psInfo->proppage[index].hwndPage, PropSheetPageBackgroundBrush);
- if (brush)
- {
- RemovePropW(psInfo->proppage[index].hwndPage, PropSheetPageBackgroundBrush);
- if (GetObjectW(brush, sizeof(logbrush), &logbrush) == sizeof(logbrush))
- DeleteObject((HBITMAP)logbrush.lbHatch);
- DeleteObject(brush);
- }
- }
/* Destroy page dialog window */
DestroyWindow(psInfo->proppage[index].hwndPage);
@@ -2855,8 +2705,6 @@ static int PROPSHEET_GetPageIndex(HPROPSHEETPAGE page, const PropSheetInfo* psIn
*/
static void PROPSHEET_CleanUp(HWND hwndDlg)
{
- LOGBRUSH logbrush;
- HBRUSH brush;
int i;
PropSheetInfo* psInfo = RemovePropW(hwndDlg, PropSheetInfoStr);
@@ -2877,18 +2725,6 @@ static void PROPSHEET_CleanUp(HWND hwndDlg)
RemoveWindowSubclass(psInfo->proppage[i].hwndPage,
PROPSHEET_WizardSubclassProc, 1);
}
- else
- {
- RemoveWindowSubclass(psInfo->proppage[i].hwndPage, PROPSHEET_ThemedSubclassProc, 1);
- brush = GetPropW(psInfo->proppage[i].hwndPage, PropSheetPageBackgroundBrush);
- if (brush)
- {
- RemovePropW(psInfo->proppage[i].hwndPage, PropSheetPageBackgroundBrush);
- if (GetObjectW(brush, sizeof(logbrush), &logbrush) == sizeof(logbrush))
- DeleteObject((HBITMAP)logbrush.lbHatch);
- DeleteObject(brush);
- }
- }
if(psInfo->proppage[i].hwndPage)
DestroyWindow(psInfo->proppage[i].hwndPage);
--
2.32.0
More information about the wine-devel
mailing list