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

Zhiyi Zhang zzhang at codeweavers.com
Wed Sep 1 03:18:19 CDT 2021



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.




More information about the wine-devel mailing list