From: Zhiyi Zhang <zzhang(a)codeweavers.com> --- dlls/comctl32/comctl32.h | 1 + dlls/comctl32/commctrl.c | 14 ++++++++++++++ dlls/comctl32_v6/button.c | 5 +---- dlls/comctl32_v6/combo.c | 5 +---- dlls/comctl32_v6/edit.c | 5 +---- dlls/comctl32_v6/listbox.c | 5 +---- dlls/comctl32_v6/static.c | 3 +-- 7 files changed, 20 insertions(+), 18 deletions(-) diff --git a/dlls/comctl32/comctl32.h b/dlls/comctl32/comctl32.h index 48ec4c1c149..adf3de64738 100644 --- a/dlls/comctl32/comctl32.h +++ b/dlls/comctl32/comctl32.h @@ -197,6 +197,7 @@ void COMCTL32_EnsureBitmapSize(HBITMAP *pBitmap, int cxMinWidth, int cyMinHeight void COMCTL32_GetFontMetrics(HFONT hFont, TEXTMETRICW *ptm); BOOL COMCTL32_IsReflectedMessage(UINT uMsg); LRESULT COMCTL32_SetVersion(INT *current_version, INT new_version); +LRESULT COMCTL32_ThemeChanged(HWND hwnd, const WCHAR *theme_class, BOOL invalidate, BOOL erase); INT Str_GetPtrWtoA(LPCWSTR lpSrc, LPSTR lpDest, INT nMaxLen); INT Str_GetPtrAtoW(LPCSTR lpSrc, LPWSTR lpDest, INT nMaxLen); BOOL Str_SetPtrAtoW(LPWSTR *lppDest, LPCSTR lpSrc); diff --git a/dlls/comctl32/commctrl.c b/dlls/comctl32/commctrl.c index d74ff7d1fd8..3cc0d79c248 100644 --- a/dlls/comctl32/commctrl.c +++ b/dlls/comctl32/commctrl.c @@ -3131,3 +3131,17 @@ LRESULT COMCTL32_SetVersion(INT *current_version, INT new_version) return old_version; #endif } + +/* A helper to handle WM_THEMECHANGED messages */ +LRESULT COMCTL32_ThemeChanged(HWND hwnd, const WCHAR *theme_class, BOOL invalidate, BOOL erase) +{ + if (theme_class) + { + COMCTL32_CloseThemeForWindow(hwnd); + COMCTL32_OpenThemeForWindow(hwnd, theme_class); + } + + if (invalidate) + InvalidateRect(hwnd, NULL, erase); + return 0; +} diff --git a/dlls/comctl32_v6/button.c b/dlls/comctl32_v6/button.c index 5667cb31bd6..9128e523c20 100644 --- a/dlls/comctl32_v6/button.c +++ b/dlls/comctl32_v6/button.c @@ -549,10 +549,7 @@ static LRESULT CALLBACK BUTTON_WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, L break; case WM_THEMECHANGED: - COMCTL32_CloseThemeForWindow( hWnd ); - COMCTL32_OpenThemeForWindow( hWnd, WC_BUTTONW ); - InvalidateRect( hWnd, NULL, TRUE ); - break; + return COMCTL32_ThemeChanged( hWnd, WC_BUTTONW, TRUE, TRUE ); case WM_ERASEBKGND: if (btn_type == BS_OWNERDRAW) diff --git a/dlls/comctl32_v6/combo.c b/dlls/comctl32_v6/combo.c index 7eb6383f831..453f1de7dd9 100644 --- a/dlls/comctl32_v6/combo.c +++ b/dlls/comctl32_v6/combo.c @@ -1692,10 +1692,7 @@ static LRESULT CALLBACK COMBO_WindowProc( HWND hwnd, UINT message, WPARAM wParam break; case WM_THEMECHANGED: - COMCTL32_CloseThemeForWindow( hwnd ); - COMCTL32_OpenThemeForWindow( hwnd, WC_COMBOBOXW ); - InvalidateRect( hwnd, NULL, TRUE ); - break; + return COMCTL32_ThemeChanged( hwnd, WC_COMBOBOXW, TRUE, TRUE ); case WM_PRINTCLIENT: case WM_PAINT: diff --git a/dlls/comctl32_v6/edit.c b/dlls/comctl32_v6/edit.c index 8cfa6f7c7ef..98a4a218e52 100644 --- a/dlls/comctl32_v6/edit.c +++ b/dlls/comctl32_v6/edit.c @@ -4991,10 +4991,7 @@ static LRESULT CALLBACK EDIT_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPAR break; case WM_THEMECHANGED: - CloseThemeData(GetWindowTheme(hwnd)); - COMCTL32_OpenThemeForWindow(hwnd, WC_EDITW); - InvalidateRect(hwnd, NULL, TRUE); - break; + return COMCTL32_ThemeChanged(hwnd, WC_EDITW, TRUE, TRUE); default: result = DefWindowProcW(hwnd, msg, wParam, lParam); diff --git a/dlls/comctl32_v6/listbox.c b/dlls/comctl32_v6/listbox.c index 543b506d3c2..9caa30239a9 100644 --- a/dlls/comctl32_v6/listbox.c +++ b/dlls/comctl32_v6/listbox.c @@ -3156,10 +3156,7 @@ static LRESULT CALLBACK LISTBOX_WindowProc( HWND hwnd, UINT msg, WPARAM wParam, break; case WM_THEMECHANGED: - COMCTL32_CloseThemeForWindow( hwnd ); - COMCTL32_OpenThemeForWindow( hwnd, WC_LISTBOXW ); - InvalidateRect( hwnd, NULL, TRUE ); - break; + return COMCTL32_ThemeChanged( hwnd, WC_LISTBOXW, TRUE, TRUE ); default: if ((msg >= WM_USER) && (msg < 0xc000)) diff --git a/dlls/comctl32_v6/static.c b/dlls/comctl32_v6/static.c index b1ec0e6b008..c243d3f871e 100644 --- a/dlls/comctl32_v6/static.c +++ b/dlls/comctl32_v6/static.c @@ -527,8 +527,7 @@ static LRESULT CALLBACK STATIC_WindowProc( HWND hwnd, UINT uMsg, WPARAM wParam, break; case WM_THEMECHANGED: - InvalidateRect( hwnd, 0, TRUE ); - break; + return COMCTL32_ThemeChanged( hwnd, NULL, TRUE, TRUE ); case WM_NCCREATE: { -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/9221