From: Vadim Zeitlin Date: Sun, 20 Jan 2013 02:09:39 +0000 (+0000) Subject: Fix changing labels of menu items with bitmaps in wxMSW. X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/f1a062a1faf57333f7b5e14764e3ef32a274a4bc Fix changing labels of menu items with bitmaps in wxMSW. We need to call SetMenuItemInfo() from wxMenuItem::SetItemLabel() even for the owner-drawn items, otherwise their width is not recomputed. Closes #3897. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@73400 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/docs/changes.txt b/docs/changes.txt index 4379570ab9..8d2f3fc5cf 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -626,6 +626,7 @@ wxMSW: - Don't send any events from wxSpinCtrl::SetRange() even if the value changed. - Display system drag images during drag and drop if available (PeterO). - Fix setting initial wxSpinCtrl value outside 0..100 range (joim). +- Fix changing labels of menu items with bitmaps (Daniel Hyams). wxOSX/Cocoa: diff --git a/src/msw/menuitem.cpp b/src/msw/menuitem.cpp index 509f021654..02ea2a9e93 100644 --- a/src/msw/menuitem.cpp +++ b/src/msw/menuitem.cpp @@ -681,15 +681,6 @@ void wxMenuItem::SetItemLabel(const wxString& txt) if ( !hMenu || ::GetMenuState(hMenu, id, MF_BYCOMMAND) == (UINT)-1 ) return; -#if wxUSE_OWNER_DRAWN - if ( IsOwnerDrawn() ) - { - // we don't need to do anything for owner drawn items, they will redraw - // themselves using the new text the next time they're displayed - return; - } -#endif // owner drawn - // update the text of the native menu item WinStruct info; @@ -712,11 +703,26 @@ void wxMenuItem::SetItemLabel(const wxString& txt) return; } - if ( isLaterThanWin95 ) - info.fMask |= MIIM_STRING; - //else: MIIM_TYPE already specified - info.dwTypeData = wxMSW_CONV_LPTSTR(m_text); - info.cch = m_text.length(); +#if wxUSE_OWNER_DRAWN + // Don't set the text for the owner drawn items, they don't use it and even + // though setting it doesn't seem to actually do any harm under Windows 7, + // avoid doing this relatively nonsensical operation just in case it does + // break something on other, past or future, Windows versions. + // + // Notice that we do need to call SetMenuItemInfo() even for the ownerdrawn + // items however as otherwise their size wouldn't be recalculated as + // WM_MEASUREITEM wouldn't be sent and this could result in display + // problems if the length of the menu item changed significantly. + if ( !IsOwnerDrawn() ) +#endif // wxUSE_OWNER_DRAWN + { + if ( isLaterThanWin95 ) + info.fMask |= MIIM_STRING; + //else: MIIM_TYPE already specified + info.dwTypeData = wxMSW_CONV_LPTSTR(m_text); + info.cch = m_text.length(); + } + if ( !::SetMenuItemInfo(hMenu, id, FALSE, &info) ) { wxLogLastError(wxT("SetMenuItemInfo"));