+ HMENU hMenu = GetHMenuOf(m_parentMenu);
+ wxCHECK_RET( hMenu, wxT("menuitem without menu") );
+
+#if wxUSE_ACCEL
+ m_parentMenu->UpdateAccel(this);
+#endif // wxUSE_ACCEL
+
+ UINT id = GetRealId();
+ UINT flagsOld = ::GetMenuState(hMenu, id, MF_BYCOMMAND);
+ if ( flagsOld == 0xFFFFFFFF )
+ {
+ wxLogLastError(wxT("GetMenuState"));
+ }
+ else
+ {
+ if ( IsSubMenu() )
+ {
+ // high byte contains the number of items in a submenu for submenus
+ flagsOld &= 0xFF;
+ flagsOld |= MF_POPUP;
+ }
+
+ LPCTSTR data;
+
+#if wxUSE_OWNER_DRAWN
+ if ( IsOwnerDrawn() )
+ {
+ flagsOld |= MF_OWNERDRAW;
+ data = (LPCTSTR)this;
+ }
+ else
+#endif //owner drawn
+ {
+ flagsOld |= MF_STRING;
+ data = (wxChar*) text.c_str();
+ }
+
+#ifdef __WXWINCE__
+ // FIXME: complete this, applying the old
+ // flags.
+ // However, the WinCE doc for SetMenuItemInfo
+ // says that you can't use it to set the menu
+ // item state; only data, id and type.
+ MENUITEMINFO info;
+ wxZeroMemory(info);
+ info.cbSize = sizeof(info);
+ info.fMask = MIIM_TYPE;
+ info.fType = MFT_STRING;
+ info.cch = text.Length();
+ info.dwTypeData = (LPTSTR) data ;
+ if ( !SetMenuItemInfo(hMenu, id, FALSE, & info) )
+ {
+ wxLogLastError(wxT("SetMenuItemInfo"));
+ }
+#else
+ if ( ::ModifyMenu(hMenu, id,
+ MF_BYCOMMAND | flagsOld,
+ id, data) == (int)0xFFFFFFFF )
+ {
+ wxLogLastError(wxT("ModifyMenu"));
+ }
+#endif
+ }
+}
+
+void wxMenuItem::SetCheckable(bool checkable)
+{
+ wxMenuItemBase::SetCheckable(checkable);
+ OWNER_DRAWN_ONLY( wxOwnerDrawn::SetCheckable(checkable) );
+}
+
+// ----------------------------------------------------------------------------
+// wxMenuItemBase
+// ----------------------------------------------------------------------------
+
+wxMenuItem *wxMenuItemBase::New(wxMenu *parentMenu,
+ int id,
+ const wxString& name,
+ const wxString& help,
+ wxItemKind kind,
+ wxMenu *subMenu)
+{
+ return new wxMenuItem(parentMenu, id, name, help, kind, subMenu);
+}