// other standard headers
#include <string.h>
-#if wxUSE_OWNER_DRAWN && defined(MIIM_BITMAP)
+//VC6 needs these defining, though they are in winuser.h
+#ifndef MIIM_BITMAP
+#define MIIM_STRING 0x00000040
+#define MIIM_BITMAP 0x00000080
+#define MIIM_FTYPE 0x00000100
+#define HBMMENU_CALLBACK ((HBITMAP) -1)
+typedef struct tagMENUINFO
+{
+ DWORD cbSize;
+ DWORD fMask;
+ DWORD dwStyle;
+ UINT cyMax;
+ HBRUSH hbrBack;
+ DWORD dwContextHelpID;
+ DWORD dwMenuData;
+} MENUINFO, FAR *LPMENUINFO;
+#endif
+
+#if wxUSE_OWNER_DRAWN
#include "wx/dynlib.h"
#endif
BOOL ok = false;
+#if wxUSE_OWNER_DRAWN
+ // Currently, mixing owner-drawn and non-owner-drawn items results in
+ // inconsistent margins, so we force this to be owner-drawn if any other
+ // items already are. Later we might want to use a boolean in the wxMenu
+ // to avoid search. Also we might make this fix unnecessary by getting the correct
+ // margin using NONCLIENTMETRICS.
+ if ( !pItem->IsOwnerDrawn() && !pItem->IsSeparator() )
+ {
+ // Check if any other items are ownerdrawn, and make ownerdrawn if so
+ wxMenuItemList::compatibility_iterator node = GetMenuItems().GetFirst();
+ while (node)
+ {
+ if (node->GetData()->IsOwnerDrawn())
+ {
+ pItem->SetOwnerDrawn(true);
+ break;
+ }
+ node = node->GetNext();
+ }
+ }
+#endif
+
// check if we have something more than a simple text item
#if wxUSE_OWNER_DRAWN
if ( pItem->IsOwnerDrawn() )
{
- // is the item owner-drawn just because of the bitmap?
- if ( pItem->GetBitmap().Ok() &&
+ // is the item owner-drawn just because of the [checked] bitmap?
+ if ( (pItem->GetBitmap(false).Ok() || pItem->GetBitmap(true).Ok()) &&
!pItem->GetTextColour().Ok() &&
!pItem->GetBackgroundColour().Ok() &&
- !pItem->GetFont().Ok() &&
- !pItem->GetBitmap(true).Ok() )
+ !pItem->GetFont().Ok() )
{
// try to use InsertMenuItem() as it's guaranteed to look correct
// while our owner-drawn code is not
-
- // first compile-time check
-#if defined(MIIM_BITMAP) && !defined(__MINGW32__)
+#ifndef __DMC__
+ // DMC at march 2007 doesn't have HBITMAP hbmpItem tagMENUITEMINFOA /W
+ // MIIM_BITMAP only works under WinME/2000+
WinStruct<MENUITEMINFO> mii;
-
- // now run-time one: MIIM_BITMAP only works under WinME/2000+
if ( wxGetWinVersion() >= wxWinVersion_98 )
{
mii.fMask = MIIM_STRING | MIIM_DATA | MIIM_BITMAP;
+ if ( pItem->IsCheckable() )
+ {
+ // need to set checked/unchecked bitmaps as otherwise our
+ // MSWOnDrawItem() item is not called
+ mii.fMask |= MIIM_CHECKMARKS;
+ }
+
mii.cch = itemText.length();
- mii.dwTypeData = wx_const_cast(wxChar *, itemText.c_str());
+ mii.dwTypeData = wx_const_cast(wxChar *, itemText.wx_str());
if (flags & MF_POPUP)
{
//
// so instead draw it ourselves in MSWOnDrawItem()
mii.dwItemData = wx_reinterpret_cast(ULONG_PTR, pItem);
+ if ( pItem->IsCheckable() )
+ {
+ mii.hbmpChecked =
+ mii.hbmpUnchecked = HBMMENU_CALLBACK;
+ }
mii.hbmpItem = HBMMENU_CALLBACK;
ok = ::InsertMenuItem(GetHmenu(), pos, TRUE /* by pos */, &mii);
pItem->ResetOwnerDrawn();
}
}
-#endif // MIIM_BITMAP
+#endif // __DMC__
}
if ( !ok )
itemText = wxMenuItem::GetLabelFromText(itemText);
#endif
- pData = (wxChar*)itemText.c_str();
+ pData = (wxChar*)itemText.wx_str();
}
// item might have already been inserted by InsertMenuItem() above
// ignore commands from the menu title
if ( id != (WXWORD)idMenuTitle )
{
- // get the checked status of the command: notice that menuState is the
- // old state of the menu, so the test for MF_CHECKED must be inverted
+ // update the check item when it's clicked
+ wxMenuItem * const item = FindItem(id);
+ if ( item && item->IsCheckable() )
+ item->Toggle();
+
+ // get the status of the menu item: note that it has been just changed
+ // by Toggle() above so here we already get the new state of the item
UINT menuState = ::GetMenuState(GetHmenu(), id, MF_BYCOMMAND);
- SendEvent(id, !(menuState & MF_CHECKED));
+ SendEvent(id, menuState & MF_CHECKED);
}
return true;