From b9e6623377b992ed8a6d4ac146d59e2c19330ada Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Thu, 3 Jan 2008 01:13:44 +0000 Subject: [PATCH] don't hardcode 16/32 as sizes for small/normal icons (fixes bug 1862812) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@50999 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- docs/changes.txt | 1 + include/wx/msw/toplevel.h | 5 +++++ src/msw/toplevel.cpp | 29 +++++++++++++++-------------- 3 files changed, 21 insertions(+), 14 deletions(-) diff --git a/docs/changes.txt b/docs/changes.txt index 14a1c96cc5..107f4c271d 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -312,6 +312,7 @@ All (GUI): wxMSW: - Fix rare bug with messages delivered to wrong wxSocket (Tim Kosse) +- Fix setting icons when they have non-default (16*16 and 32*32) sizes 2.8.7 diff --git a/include/wx/msw/toplevel.h b/include/wx/msw/toplevel.h index 3938b96e62..b4f4e0ae03 100644 --- a/include/wx/msw/toplevel.h +++ b/include/wx/msw/toplevel.h @@ -142,6 +142,11 @@ protected: virtual void DoGetSize(int *width, int *height) const; #endif // __WXWINCE__ + // helper of SetIcons(): calls gets the icon with the size specified by the + // given system metrics (SM_C{X|Y}[SM]ICON) from the bundle and sets it + // using WM_SETICON with the specified wParam (ICOM_SMALL or ICON_BIG) + void DoSelectAndSetIcon(const wxIconBundle& icons, int smX, int smY, int i); + // is the window currently iconized? bool m_iconized; diff --git a/src/msw/toplevel.cpp b/src/msw/toplevel.cpp index 57e85c3913..a7217b5c91 100644 --- a/src/msw/toplevel.cpp +++ b/src/msw/toplevel.cpp @@ -965,25 +965,26 @@ wxString wxTopLevelWindowMSW::GetTitle() const return GetLabel(); } -void wxTopLevelWindowMSW::SetIcons(const wxIconBundle& icons) +void wxTopLevelWindowMSW::DoSelectAndSetIcon(const wxIconBundle& icons, + int smX, + int smY, + int i) { - wxTopLevelWindowBase::SetIcons(icons); + const wxSize size(::GetSystemMetrics(smX), ::GetSystemMetrics(smY)); -#if !defined(__WXMICROWIN__) - const wxIcon& sml = icons.GetIconOfExactSize(16); - if( sml.Ok() ) + const wxIcon icon = icons.GetIconOfExactSize(size); + if ( icon.Ok() ) { - ::SendMessage( GetHwndOf( this ), WM_SETICON, ICON_SMALL, - (LPARAM)GetHiconOf(sml) ); + ::SendMessage(GetHwnd(), WM_SETICON, i, (LPARAM)GetHiconOf(icon)); } +} - const wxIcon& big = icons.GetIconOfExactSize(32); - if( big.Ok() ) - { - ::SendMessage( GetHwndOf( this ), WM_SETICON, ICON_BIG, - (LPARAM)GetHiconOf(big) ); - } -#endif // !__WXMICROWIN__ +void wxTopLevelWindowMSW::SetIcons(const wxIconBundle& icons) +{ + wxTopLevelWindowBase::SetIcons(icons); + + DoSelectAndSetIcon(icons, SM_CXSMICON, SM_CYSMICON, ICON_SMALL); + DoSelectAndSetIcon(icons, SM_CXICON, SM_CYICON, ICON_BIG); } bool wxTopLevelWindowMSW::EnableCloseButton(bool enable) -- 2.45.2