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;
}
mii.cch = itemText.length();
- mii.dwTypeData = const_cast<wxChar *>(itemText.wx_str());
+ mii.dwTypeData = wxMSW_CONV_LPTSTR(itemText);
if ( flags & MF_POPUP )
{
itemText = wxMenuItem::GetLabelText(itemText);
#endif
- pData = (wxChar*)itemText.wx_str();
+ pData = itemText.t_str();
}
// item might have already been inserted by InsertMenuItem() above
m_accels.RemoveAt(n);
+#if wxUSE_OWNER_DRAWN
ResetMaxAccelWidth();
+#endif
}
//else: this item doesn't have an accel, nothing to do
#endif // wxUSE_ACCEL
if ( !label.empty() )
{
if ( !::InsertMenu(hMenu, 0u, MF_BYPOSITION | MF_STRING,
- (UINT_PTR)idMenuTitle, m_title.wx_str()) ||
+ (UINT_PTR)idMenuTitle, m_title.t_str()) ||
!::InsertMenu(hMenu, 1u, MF_BYPOSITION, (unsigned)-1, NULL) )
{
wxLogLastError(wxT("InsertMenu"));
{
// 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();
- info.dwTypeData = const_cast<wxChar *>(m_title.wx_str());
+ info.dwTypeData = wxMSW_CONV_LPTSTR(m_title);
if ( !SetMenuItemInfo(hMenu, 0, TRUE, & info) )
{
wxLogLastError(wxT("SetMenuItemInfo"));
#else
if ( !ModifyMenu(hMenu, 0u,
MF_BYPOSITION | MF_STRING,
- (UINT_PTR)idMenuTitle, m_title.wx_str()) )
+ (UINT_PTR)idMenuTitle, m_title.t_str()) )
{
wxLogLastError(wxT("ModifyMenu"));
}
// 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
HMENU hPopupMenu = (HMENU) GetMenu(i)->GetHMenu();
tbButton.dwData = (DWORD)hPopupMenu;
wxString label = wxStripMenuCodes(GetMenuLabel(i));
- tbButton.iString = (int) label.wx_str();
+ tbButton.iString = (int) wxMSW_CONV_LPCTSTR(label);
tbButton.idCommand = NewControlId();
if ( !::SendMessage(hCommandBar, TB_INSERTBUTTON, i, (LPARAM)&tbButton) )
{
if ( !::AppendMenu((HMENU)m_hMenu, MF_POPUP | MF_STRING,
(UINT_PTR)(*it)->GetHMenu(),
- (*it)->GetTitle().wx_str()) )
+ (*it)->GetTitle().t_str()) )
{
wxLogLastError(wxT("AppendMenu"));
}
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();
- info.dwTypeData = const_cast<wxChar *>(label.wx_str());
+ info.dwTypeData = wxMSW_CONV_LPTSTR(label);
if ( !SetMenuItemInfo(GetHmenu(), id, TRUE, &info) )
{
wxLogLastError(wxT("SetMenuItemInfo"));
#else
if ( ::ModifyMenu(GetHmenu(), mswpos, MF_BYPOSITION | MF_STRING | flagsOld,
- id, label.wx_str()) == (int)0xFFFFFFFF )
+ id, label.t_str()) == (int)0xFFFFFFFF )
{
wxLogLastError(wxT("ModifyMenu"));
}
if ( !::InsertMenu(GetHmenu(), (UINT)mswpos,
MF_BYPOSITION | MF_POPUP | MF_STRING,
- (UINT_PTR)GetHmenuOf(menu), title.wx_str()) )
+ (UINT_PTR)GetHmenuOf(menu), title.t_str()) )
{
wxLogLastError(wxT("InsertMenu"));
}
HMENU hPopupMenu = (HMENU) menu->GetHMenu() ;
tbButton.dwData = (DWORD)hPopupMenu;
wxString label = wxStripMenuCodes(title);
- tbButton.iString = (int) label.wx_str();
+ tbButton.iString = (int) wxMSW_CONV_LPCTSTR(label);
tbButton.idCommand = NewControlId();
if (!::SendMessage((HWND) GetToolBar()->GetHWND(), TB_INSERTBUTTON, pos, (LPARAM)&tbButton))
#else
if ( !::InsertMenu(GetHmenu(), mswpos,
MF_BYPOSITION | MF_POPUP | MF_STRING,
- (UINT_PTR)GetHmenuOf(menu), title.wx_str()) )
+ (UINT_PTR)GetHmenuOf(menu), title.t_str()) )
{
wxLogLastError(wxT("InsertMenu"));
}
HMENU hPopupMenu = (HMENU) menu->GetHMenu() ;
tbButton.dwData = (DWORD)hPopupMenu;
wxString label = wxStripMenuCodes(title);
- tbButton.iString = (int) label.wx_str();
+ tbButton.iString = (int) wxMSW_CONV_LPCTSTR(label);
tbButton.idCommand = NewControlId();
if (!::SendMessage((HWND) GetToolBar()->GetHWND(), TB_INSERTBUTTON, pos, (LPARAM)&tbButton))
}
#else
if ( !::AppendMenu(GetHmenu(), MF_POPUP | MF_STRING,
- (UINT_PTR)submenu, title.wx_str()) )
+ (UINT_PTR)submenu, title.t_str()) )
{
wxLogLastError(wxT("AppendMenu"));
}
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;