UINT WXUNUSED_IN_WINCE(id))
{
#ifndef __WXWINCE__
- MENUITEMINFO mii;
- wxZeroMemory(mii);
- mii.cbSize = sizeof(MENUITEMINFO);
+ WinStruct<MENUITEMINFO> mii;
mii.fMask = MIIM_STATE;
mii.fState = MFS_DEFAULT;
BOOL WXUNUSED_IN_WINCE(byPositon = FALSE))
{
#ifndef __WXWINCE__
- MENUITEMINFO mii;
- wxZeroMemory(mii);
- mii.cbSize = sizeof(MENUITEMINFO);
+ WinStruct<MENUITEMINFO> mii;
mii.fMask = MIIM_FTYPE | MIIM_DATA;
mii.fType = MFT_OWNERDRAW;
mii.dwItemData = data;
#ifdef __WXWINCE__
UINT GetMenuState(HMENU hMenu, UINT id, UINT flags)
{
- MENUITEMINFO info;
- wxZeroMemory(info);
- info.cbSize = sizeof(info);
+ WinStruct<MENUITEMINFO> info;
info.fMask = MIIM_STATE;
// MF_BYCOMMAND is zero so test MF_BYPOSITION
if ( !::GetMenuItemInfo(hMenu, id, flags & MF_BYPOSITION ? TRUE : FALSE , & info) )
// ---------------------------------------------------------------------------
// Construct a menu with optional title (then use append)
-void wxMenu::Init()
+void wxMenu::InitNoCreate()
{
m_radioData = NULL;
m_doBreak = false;
m_maxBitmapWidth = 0;
m_maxAccelWidth = -1;
#endif // wxUSE_OWNER_DRAWN
+}
+
+void wxMenu::Init()
+{
+ InitNoCreate();
// create the menu
m_hMenu = (WXHMENU)CreatePopupMenu();
}
}
+wxMenu::wxMenu(WXHMENU hMenu)
+{
+ InitNoCreate();
+
+ m_hMenu = hMenu;
+
+ // Ensure that our internal idea of how many items we have corresponds to
+ // the real number of items in the menu.
+ //
+ // We could also retrieve the real labels of the items here but it doesn't
+ // seem to be worth the trouble.
+ const int numExistingItems = ::GetMenuItemCount(m_hMenu);
+ for ( int n = 0; n < numExistingItems; n++ )
+ {
+ wxMenuBase::DoAppend(wxMenuItem::New(this, wxID_SEPARATOR));
+ }
+}
+
// The wxWindow destructor will take care of deleting the submenus.
wxMenu::~wxMenu()
{
GetMenuBar()->RebuildAccelTable();
}
+#if wxUSE_OWNER_DRAWN
ResetMaxAccelWidth();
+#endif
}
//else: it is a separator, they can't have accels, nothing to do
}
#if wxUSE_IMAGE
if ( wxGetWinVersion() >= wxWinVersion_Vista )
{
+#if wxUSE_OWNER_DRAWN
wxBitmap bmp = pItem->GetBitmap(checked);
if ( bmp.IsOk() )
{
return GetHbitmapOf(pItem->GetBitmap(checked));
}
+#endif // wxUSE_OWNER_DRAWN
//else: bitmap is not set
return NULL;
m_accels.RemoveAt(n);
+#if wxUSE_OWNER_DRAWN
ResetMaxAccelWidth();
+#endif
}
//else: this item doesn't have an accel, nothing to do
#endif // wxUSE_ACCEL
{
// modify the title
#ifdef __WXWINCE__
- MENUITEMINFO info;
- wxZeroMemory(info);
- info.cbSize = sizeof(info);
+ WinStruct<MENUITEMINFO> info;
info.fMask = MIIM_TYPE;
info.fType = MFT_STRING;
info.cch = m_title.length();
// put the title string in bold face
if ( !m_title.empty() )
{
- SetDefaultMenuItem(GetHmenu(), (UINT_PTR)idMenuTitle);
+ SetDefaultMenuItem(GetHmenu(), (UINT)idMenuTitle);
}
#endif // Win32
}
// ignore commands from the menu title
if ( id != idMenuTitle )
{
+ // Default value for uncheckable items.
+ int checked = -1;
+
// 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);
+ // 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.
+ //
+ // Also notice that we must pass unsigned id_ and not sign-extended id
+ // to ::GetMenuState() as this is what it expects.
+ UINT menuState = ::GetMenuState(GetHmenu(), id_, MF_BYCOMMAND);
+ checked = (menuState & MF_CHECKED) != 0;
+ }
+
+ SendEvent(id, checked);
}
return true;
}
// get the menu with given handle (recursively)
+#if wxUSE_OWNER_DRAWN
wxMenu* wxMenu::MSWGetMenu(WXHMENU hMenu)
{
// check self
// unknown hMenu
return NULL;
}
+#endif // wxUSE_OWNER_DRAWN
// ---------------------------------------------------------------------------
// Menu Bar
Refresh();
}
+bool wxMenuBar::IsEnabledTop(size_t pos) const
+{
+ wxCHECK_MSG( pos < GetMenuCount(), false, wxS("invalid menu index") );
+ WinStruct<MENUITEMINFO> mii;
+ mii.fMask = MIIM_STATE;
+ if ( !::GetMenuItemInfo(GetHmenu(), pos, TRUE, &mii) )
+ {
+ wxLogLastError(wxS("GetMenuItemInfo(menubar)"));
+ }
+
+ return !(mii.fState & MFS_GRAYED);
+}
+
void wxMenuBar::SetMenuLabel(size_t pos, const wxString& label)
{
wxCHECK_RET( pos < GetMenuCount(), wxT("invalid menu index") );
}
#ifdef __WXWINCE__
- MENUITEMINFO info;
- wxZeroMemory(info);
- info.cbSize = sizeof(info);
+ WinStruct<MENUITEMINFO> info;
info.fMask = MIIM_TYPE;
info.fType = MFT_STRING;
info.cch = label.length();
wxCHECK_MSG( GetHMenu() != hMenu, NULL,
wxT("wxMenuBar::MSWGetMenu(): menu handle is wxMenuBar, not wxMenu") );
+#if wxUSE_OWNER_DRAWN
// query all menus
for ( size_t n = 0 ; n < GetMenuCount(); ++n )
{
if ( menu )
return menu;
}
+#endif
// unknown hMenu
return NULL;