Fix setting menu item bitmaps after appending them in wxMSW.
Update the bitmap used by Windows when using non-owner-drawn items with bitmaps. Closes #9388. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@76191 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -52,6 +52,7 @@ wxMSW:
|
|||||||
|
|
||||||
- Improve wxMimeTypesManager open command detection (Eric Jensen).
|
- Improve wxMimeTypesManager open command detection (Eric Jensen).
|
||||||
- Make wxFILTER_INCLUDE_LIST in wxTextValidator actually usable.
|
- Make wxFILTER_INCLUDE_LIST in wxTextValidator actually usable.
|
||||||
|
- Fix setting menu item bitmaps after appending them (Artur Wieczorek).
|
||||||
- Fix handling of selected images in wxBitmapButton (Artur Wieczorek).
|
- Fix handling of selected images in wxBitmapButton (Artur Wieczorek).
|
||||||
- Fix loading of bitmap with non-pre-multiplied alpha (Artur Wieczorek).
|
- Fix loading of bitmap with non-pre-multiplied alpha (Artur Wieczorek).
|
||||||
- Support multiline strings in wxDC::DrawRotatedText() (Artur Wieczorek).
|
- Support multiline strings in wxDC::DrawRotatedText() (Artur Wieczorek).
|
||||||
|
@@ -77,18 +77,13 @@ public:
|
|||||||
void SetBitmaps(const wxBitmap& bmpChecked,
|
void SetBitmaps(const wxBitmap& bmpChecked,
|
||||||
const wxBitmap& bmpUnchecked = wxNullBitmap)
|
const wxBitmap& bmpUnchecked = wxNullBitmap)
|
||||||
{
|
{
|
||||||
m_bmpChecked = bmpChecked;
|
DoSetBitmap(bmpChecked, true);
|
||||||
m_bmpUnchecked = bmpUnchecked;
|
DoSetBitmap(bmpUnchecked, false);
|
||||||
SetOwnerDrawn(true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetBitmap(const wxBitmap& bmp, bool bChecked = true)
|
void SetBitmap(const wxBitmap& bmp, bool bChecked = true)
|
||||||
{
|
{
|
||||||
if ( bChecked )
|
DoSetBitmap(bmp, bChecked);
|
||||||
m_bmpChecked = bmp;
|
|
||||||
else
|
|
||||||
m_bmpUnchecked = bmp;
|
|
||||||
SetOwnerDrawn(true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetDisabledBitmap(const wxBitmap& bmpDisabled)
|
void SetDisabledBitmap(const wxBitmap& bmpDisabled)
|
||||||
@@ -124,6 +119,9 @@ private:
|
|||||||
// helper function to get a handle of bitmap associated with item
|
// helper function to get a handle of bitmap associated with item
|
||||||
WXHBITMAP GetHBitmapForMenu(bool checked = true);
|
WXHBITMAP GetHBitmapForMenu(bool checked = true);
|
||||||
|
|
||||||
|
// helper function to set/change the bitmap
|
||||||
|
void DoSetBitmap(const wxBitmap& bmp, bool bChecked);
|
||||||
|
|
||||||
#else // !wxUSE_OWNER_DRAWN
|
#else // !wxUSE_OWNER_DRAWN
|
||||||
// Provide stubs for the public functions above to ensure that the code
|
// Provide stubs for the public functions above to ensure that the code
|
||||||
// still compiles without wxUSE_OWNER_DRAWN -- it makes sense to just drop
|
// still compiles without wxUSE_OWNER_DRAWN -- it makes sense to just drop
|
||||||
|
@@ -740,6 +740,76 @@ void wxMenuItem::SetItemLabel(const wxString& txt)
|
|||||||
|
|
||||||
#if wxUSE_OWNER_DRAWN
|
#if wxUSE_OWNER_DRAWN
|
||||||
|
|
||||||
|
void wxMenuItem::DoSetBitmap(const wxBitmap& bmp, bool bChecked)
|
||||||
|
{
|
||||||
|
if ( bChecked )
|
||||||
|
{
|
||||||
|
if ( m_bmpChecked.IsSameAs(bmp) )
|
||||||
|
return;
|
||||||
|
|
||||||
|
m_bmpChecked = bmp;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( m_bmpUnchecked.IsSameAs(bmp) )
|
||||||
|
return;
|
||||||
|
|
||||||
|
m_bmpUnchecked = bmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
// already marked as owner-drawn, cannot be reverted
|
||||||
|
if ( IsOwnerDrawn() )
|
||||||
|
return;
|
||||||
|
|
||||||
|
// assume owner-drawn state, will be reset if we can use Windows bitmap
|
||||||
|
// support instead of making the item owner-drawn
|
||||||
|
SetOwnerDrawn(true);
|
||||||
|
|
||||||
|
if ( MustUseOwnerDrawn() )
|
||||||
|
return;
|
||||||
|
|
||||||
|
// the item can be not attached to any menu yet and SetBitmap() is still
|
||||||
|
// valid to call in this case and should do nothing else
|
||||||
|
if ( !m_parentMenu )
|
||||||
|
return;
|
||||||
|
|
||||||
|
HMENU hMenu = GetHMenuOf(m_parentMenu);
|
||||||
|
if ( !hMenu )
|
||||||
|
return;
|
||||||
|
|
||||||
|
const UINT id = GetMSWId();
|
||||||
|
|
||||||
|
const UINT state = ::GetMenuState(hMenu, id, MF_BYCOMMAND);
|
||||||
|
if ( state == (UINT)-1 )
|
||||||
|
return;
|
||||||
|
|
||||||
|
// update the bitmap of the native menu item
|
||||||
|
// don't set hbmpItem for the checkable items as it would
|
||||||
|
// be used for both checked and unchecked state
|
||||||
|
WinStruct<MENUITEMINFO> mii;
|
||||||
|
if ( IsCheckable() )
|
||||||
|
{
|
||||||
|
mii.fMask = MIIM_CHECKMARKS;
|
||||||
|
mii.hbmpChecked = GetHBitmapForMenu(true);
|
||||||
|
mii.hbmpUnchecked = GetHBitmapForMenu(false);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mii.fMask = MIIM_BITMAP;
|
||||||
|
mii.hbmpItem = GetHBitmapForMenu();
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( !::SetMenuItemInfo(hMenu, id, FALSE, &mii) )
|
||||||
|
{
|
||||||
|
wxLogLastError(wxT("SetMenuItemInfo"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// No need to really make the item owner drawn, Windows will draw its
|
||||||
|
// bitmap(s) for us.
|
||||||
|
SetOwnerDrawn(false);
|
||||||
|
}
|
||||||
|
|
||||||
int wxMenuItem::MeasureAccelWidth() const
|
int wxMenuItem::MeasureAccelWidth() const
|
||||||
{
|
{
|
||||||
wxString accel = GetItemLabel().AfterFirst(wxT('\t'));
|
wxString accel = GetItemLabel().AfterFirst(wxT('\t'));
|
||||||
|
Reference in New Issue
Block a user