[PATCH 4/7] comctl32: Use OpenThemeDataForDpi() to create a theme handle not associated to a window.

Nikolay Sivov nsivov at codeweavers.com
Wed Sep 1 03:19:49 CDT 2021



On 9/1/21 11:18 AM, Zhiyi Zhang wrote:
>
> On 9/1/21 4:07 PM, Nikolay Sivov wrote:
>> On 9/1/21 9:37 AM, Zhiyi Zhang wrote:
>>> If a window is not passed to OpenThemeData(), OpenThemeData() assumes the DPI is 96 according to
>>> tests. And GetThemePartSize() should select theme parts according to the DPI stored in theme
>>> handles rather than using GDI device contexts. Thus, OpenThemeDataForDpi() should be used in place
>>> of OpenThemeData() when DPI is not 96 and theme handles shouldn't be associated with a window.
>>>
>>> Signed-off-by: Zhiyi Zhang <zzhang at codeweavers.com>
>>> ---
>>>  dlls/comctl32/datetime.c | 2 +-
>>>  dlls/comctl32/hotkey.c   | 2 +-
>>>  dlls/comctl32/toolbar.c  | 4 ++--
>>>  3 files changed, 4 insertions(+), 4 deletions(-)
>>>
>>> diff --git a/dlls/comctl32/datetime.c b/dlls/comctl32/datetime.c
>>> index ac5268f146c..f8827d4e26c 100644
>>> --- a/dlls/comctl32/datetime.c
>>> +++ b/dlls/comctl32/datetime.c
>>> @@ -1317,7 +1317,7 @@ static LRESULT DATETIME_NCPaint (HWND hwnd, HRGN region)
>>>      RECT r;
>>>      HDC dc;
>>>  
>>> -    theme = OpenThemeData(NULL, WC_EDITW);
>>> +    theme = OpenThemeDataForDpi(NULL, WC_EDITW, GetDpiForWindow(hwnd));
>>>      if (!theme)
>>>          return DefWindowProcW(hwnd, WM_NCPAINT, (WPARAM)region, 0);
>>>  
>>> diff --git a/dlls/comctl32/hotkey.c b/dlls/comctl32/hotkey.c
>>> index 7421ff6ef65..7808660e7f5 100644
>>> --- a/dlls/comctl32/hotkey.c
>>> +++ b/dlls/comctl32/hotkey.c
>>> @@ -434,7 +434,7 @@ HOTKEY_NCPaint (HWND hwnd, HRGN region)
>>>      RECT r;
>>>      HDC dc;
>>>  
>>> -    theme = OpenThemeData(NULL, WC_EDITW);
>>> +    theme = OpenThemeDataForDpi(NULL, WC_EDITW, GetDpiForWindow(hwnd));
>>>      if (!theme)
>>>          return DefWindowProcW(hwnd, WM_NCPAINT, (WPARAM)region, 0);
>> For datetime/hotkey we don't have Edit controls internally, so that
>> makes sense.
>>>  
>>> diff --git a/dlls/comctl32/toolbar.c b/dlls/comctl32/toolbar.c
>>> index cf1dc42449b..2ae70ad4f3e 100644
>>> --- a/dlls/comctl32/toolbar.c
>>> +++ b/dlls/comctl32/toolbar.c
>>> @@ -5313,7 +5313,7 @@ TOOLBAR_Create (HWND hwnd, const CREATESTRUCTW *lpcs)
>>>  
>>>      SystemParametersInfoW (SPI_GETICONTITLELOGFONT, 0, &logFont, 0);
>>>      infoPtr->hFont = infoPtr->hDefaultFont = CreateFontIndirectW (&logFont);
>>> -    infoPtr->hTheme = OpenThemeData (NULL, themeClass);
>>> +    infoPtr->hTheme = OpenThemeDataForDpi (NULL, themeClass, GetDpiForWindow (hwnd));
>>>  
>>>      TOOLBAR_CheckStyle (infoPtr);
>>>  
>>> @@ -6550,7 +6550,7 @@ TOOLBAR_SysColorChange (void)
>>>  static LRESULT theme_changed (TOOLBAR_INFO *infoPtr)
>>>  {
>>>      CloseThemeData (infoPtr->hTheme);
>>> -    infoPtr->hTheme = OpenThemeData (NULL, themeClass);
>>> +    infoPtr->hTheme = OpenThemeDataForDpi (NULL, themeClass, GetDpiForWindow (infoPtr->hwndSelf));
>>>      InvalidateRect (infoPtr->hwndSelf, NULL, TRUE);
>>>      return 0;
>>>  }
>> Would it be bad to associate with toolbar window in this case, since
>> theme class is for Toolbar specifically?
>>
> Toolbar shouldn't associate the theme handle to its window. Please see 677c459 and 8107462.
>
I see, thank you.



More information about the wine-devel mailing list