1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: wxMenu, wxMenuBar, wxMenuItem
4 // Author: Julian Smart
5 // Modified by: Vadim Zeitlin
8 // Copyright: (c) Julian Smart and Markus Holzem
9 // Licence: wxWindows license
10 /////////////////////////////////////////////////////////////////////////////
13 // ============================================================================
15 // ============================================================================
17 // ----------------------------------------------------------------------------
19 // ----------------------------------------------------------------------------
25 #pragma implementation "menu.h"
26 #pragma implementation "menuitem.h"
29 // For compilers that support precompilation, includes "wx.h".
30 #include "wx/wxprec.h"
43 #include "wx/ownerdrw.h"
46 #include "wx/msw/private.h"
47 #include "wx/msw/menu.h"
48 #include "wx/menuitem.h"
51 // other standard headers
52 // ----------------------
55 // ----------------------------------------------------------------------------
57 // ----------------------------------------------------------------------------
59 // the (popup) menu title has this special id
60 static const int idMenuTitle
= -2;
62 // ----------------------------------------------------------------------------
64 // ----------------------------------------------------------------------------
65 #if !USE_SHARED_LIBRARY
66 IMPLEMENT_DYNAMIC_CLASS(wxMenu
, wxEvtHandler
)
67 IMPLEMENT_DYNAMIC_CLASS(wxMenuBar
, wxEvtHandler
)
70 // ============================================================================
72 // ============================================================================
76 // Construct a menu with optional title (then use append)
77 wxMenu::wxMenu(const wxString
& Title
, const wxFunction func
)
81 m_eventHandler
= this;
82 m_pInvokingWindow
= NULL
;
86 m_hMenu
= (WXHMENU
) CreatePopupMenu();
88 m_topLevelMenu
= this;
91 Append(idMenuTitle
, m_title
) ;
98 // The wxWindow destructor will take care of deleting the submenus.
102 DestroyMenu((HMENU
) m_hMenu
);
105 // Windows seems really bad on Menu de-allocation...
106 // After many try, here is what I do: RemoveMenu() will ensure
107 // that popup are "disconnected" from their parent; then call
108 // delete method on each child (which in turn do a recursive job),
109 // and finally, DestroyMenu()
111 // With that, BoundCheckers is happy, and no complaints...
115 N = GetMenuItemCount(m_hMenu);
117 for (i = N-1; i >= 0; i--)
118 RemoveMenu(m_hMenu, i, MF_BYPOSITION);
121 // How is deleting submenus in this loop any different from deleting
122 // the submenus in the children list, via ~wxWindow ?
123 // I'll reinstate this deletion for now and remove addition
124 // from children list (which doesn't exist now)
126 wxNode
*node
= m_menuItems
.First();
129 wxMenuItem
*item
= (wxMenuItem
*)node
->Data();
131 // Delete child menus.
132 // Beware: they must not be appended to children list!!!
133 // (because order of delete is significant)
134 if (item
->GetSubMenu())
135 item
->DeleteSubMenu();
137 wxNode
*next
= node
->Next();
144 DestroyMenu(m_hMenu);
154 // function appends a new item or submenu to the menu
155 void wxMenu::Append(wxMenuItem
*pItem
)
157 wxCHECK_RET( pItem
!= NULL
, "can't append NULL item to the menu" );
159 m_menuItems
.Append(pItem
);
164 flags
|= MF_MENUBREAK
;
168 if ( pItem
->IsSeparator() ) {
169 flags
|= MF_SEPARATOR
;
172 // id is the numeric id for normal menu items and HMENU for submenus
174 wxMenu
*SubMenu
= pItem
->GetSubMenu();
175 if ( SubMenu
!= NULL
) {
176 wxASSERT( SubMenu
->m_hMenu
!= (WXHMENU
) NULL
);
178 id
= (UINT
)SubMenu
->m_hMenu
;
180 SubMenu
->m_topLevelMenu
= m_topLevelMenu
;
181 SubMenu
->m_parent
= this;
182 SubMenu
->m_savehMenu
= (WXHMENU
)id
;
183 SubMenu
->m_hMenu
= 0;
193 #if wxUSE_OWNER_DRAWN
194 if ( pItem
->IsOwnerDrawn() ) { // want to get {Measure|Draw}Item messages?
195 // item draws itself, pass pointer to it in data parameter
196 flags
|= MF_OWNERDRAW
;
197 pData
= (LPCSTR
)pItem
;
202 // menu is just a normal string (passed in data parameter)
204 pData
= pItem
->GetName();
207 // visually select the menu title
208 if ( id
== idMenuTitle
)
210 // TODO use SetMenuItemInfo(MFS_DEFAULT) to put it in bold face
213 HMENU hMenu
= (HMENU
)((m_hMenu
== 0) ? m_savehMenu
: m_hMenu
);
214 if ( !AppendMenu(hMenu
, flags
, id
, pData
) )
216 wxLogLastError("AppendMenu");
222 void wxMenu::AppendSeparator()
224 Append(new wxMenuItem(this, ID_SEPARATOR
));
228 void wxMenu::Append(int Id
, const wxString
& label
, wxMenu
*SubMenu
,
229 const wxString
& helpString
)
231 Append(new wxMenuItem(this, Id
, label
, helpString
, FALSE
, SubMenu
));
234 // Ordinary menu item
235 void wxMenu::Append(int Id
, const wxString
& label
,
236 const wxString
& helpString
, bool checkable
)
238 // 'checkable' parameter is useless for Windows.
239 Append(new wxMenuItem(this, Id
, label
, helpString
, checkable
));
242 void wxMenu::Delete(int id
)
249 for (pos
= 0, node
= m_menuItems
.First(); node
; node
= node
->Next(), pos
++) {
250 item
= (wxMenuItem
*)node
->Data();
251 if (item
->GetId() == id
)
258 menu
= (HMENU
)(m_hMenu
? m_hMenu
: m_savehMenu
);
260 wxMenu
*pSubMenu
= item
->GetSubMenu();
261 if ( pSubMenu
!= NULL
) {
262 RemoveMenu(menu
, (UINT
)pos
, MF_BYPOSITION
);
263 pSubMenu
->m_hMenu
= pSubMenu
->m_savehMenu
;
264 pSubMenu
->m_savehMenu
= 0;
265 pSubMenu
->m_parent
= NULL
;
266 // RemoveChild(item->subMenu);
267 pSubMenu
->m_topLevelMenu
= NULL
;
268 // TODO: Why isn't subMenu deleted here???
269 // Will put this in for now. Assuming this is supposed
270 // to delete the menu, not just remove it.
271 item
->DeleteSubMenu();
274 DeleteMenu(menu
, (UINT
)pos
, MF_BYPOSITION
);
277 m_menuItems
.DeleteNode(node
);
281 void wxMenu::Enable(int Id
, bool Flag
)
283 wxMenuItem
*item
= FindItemForId(Id
);
284 wxCHECK_RET( item
!= NULL
, "can't enable non-existing menu item" );
289 bool wxMenu::Enabled(int Id
) const
291 wxMenuItem
*item
= FindItemForId(Id
);
292 wxCHECK( item
!= NULL
, FALSE
);
294 return item
->IsEnabled();
297 void wxMenu::Check(int Id
, bool Flag
)
299 wxMenuItem
*item
= FindItemForId(Id
);
300 wxCHECK_RET( item
!= NULL
, "can't get status of non-existing menu item" );
305 bool wxMenu::Checked(int Id
) const
307 wxMenuItem
*item
= FindItemForId(Id
);
308 wxCHECK( item
!= NULL
, FALSE
);
310 return item
->IsChecked();
313 void wxMenu::SetTitle(const wxString
& label
)
315 bool hasNoTitle
= m_title
.IsEmpty();
318 HMENU hMenu
= (HMENU
)((m_hMenu
== 0) ? m_savehMenu
: m_hMenu
);
322 if ( !label
.IsEmpty() )
324 if ( !InsertMenu(hMenu
, 0, MF_BYPOSITION
| MF_STRING
,
325 idMenuTitle
, m_title
) ||
326 !InsertMenu(hMenu
, 1, MF_BYPOSITION
, -1, NULL
) )
328 wxLogLastError("InsertMenu");
334 if ( label
.IsEmpty() )
336 // remove the title and the separator after it
337 if ( !RemoveMenu(hMenu
, 0, MF_BYPOSITION
) ||
338 !RemoveMenu(hMenu
, 0, MF_BYPOSITION
) )
340 wxLogLastError("RemoveMenu");
346 if ( !ModifyMenu(hMenu
, 0,
347 MF_BYPOSITION
| MF_STRING
,
348 idMenuTitle
, m_title
) )
350 wxLogLastError("ModifyMenu");
355 // TODO use SetMenuItemInfo(MFS_DEFAULT) to put it in bold face
358 const wxString
wxMenu::GetTitle() const
363 void wxMenu::SetLabel(int Id
, const wxString
& label
)
365 wxMenuItem
*item
= FindItemForId(Id
) ;
369 if (item
->GetSubMenu()==NULL
)
373 UINT was_flag
= GetMenuState((HMENU
)m_hMenu
,Id
,MF_BYCOMMAND
) ;
374 ModifyMenu((HMENU
)m_hMenu
,Id
,MF_BYCOMMAND
|MF_STRING
|was_flag
,Id
,(const char *)label
) ;
376 else if (m_savehMenu
)
378 UINT was_flag
= GetMenuState((HMENU
)m_savehMenu
,Id
,MF_BYCOMMAND
) ;
379 ModifyMenu((HMENU
)m_savehMenu
,Id
,MF_BYCOMMAND
|MF_STRING
|was_flag
,Id
,(const char *)label
) ;
384 wxMenu
*father
= item
->GetSubMenu()->m_topLevelMenu
;
385 wxNode
*node
= father
->m_menuItems
.First() ;
389 wxMenuItem
*matched
= (wxMenuItem
*)node
->Data() ;
393 node
= node
->Next() ;
395 // Here, we have the position.
396 ModifyMenu((HMENU
)father
->m_savehMenu
,i
,
397 MF_BYPOSITION
|MF_STRING
|MF_POPUP
,
398 (UINT
)item
->GetSubMenu()->m_savehMenu
,(const char *)label
) ;
400 item
->SetName(label
);
403 wxString
wxMenu::GetLabel(int id
) const
406 static char tmp[128] ;
409 len = GetMenuString((HMENU)m_hMenu,Id,tmp,WXSIZEOF(tmp) - 1,MF_BYCOMMAND);
410 else if (m_savehMenu)
411 len = GetMenuString((HMENU)m_savehMenu,Id,tmp,WXSIZEOF(tmp) - 1,MF_BYCOMMAND);
415 return wxString(tmp) ;
418 wxMenuItem
*pItem
= FindItemForId(id
) ;
420 return pItem
->GetName() ;
422 return wxEmptyString
;
425 bool wxMenu::MSWCommand(WXUINT
WXUNUSED(param
), WXWORD id
)
427 wxCommandEvent
event(wxEVENT_TYPE_MENU_COMMAND
);
428 event
.SetEventObject( this );
431 ProcessCommand(event
);
435 // Finds the item id matching the given string, -1 if not found.
436 int wxMenu::FindItem (const wxString
& itemString
) const
440 wxStripMenuCodes ((char *)(const char *)itemString
, buf1
);
442 for (wxNode
* node
= m_menuItems
.First (); node
; node
= node
->Next ())
444 wxMenuItem
*item
= (wxMenuItem
*) node
->Data ();
445 if (item
->GetSubMenu())
447 int ans
= item
->GetSubMenu()->FindItem(itemString
);
451 if ( !item
->IsSeparator() )
453 wxStripMenuCodes((char *)item
->GetName().c_str(), buf2
);
454 if (strcmp(buf1
, buf2
) == 0)
455 return item
->GetId();
462 wxMenuItem
*wxMenu::FindItemForId(int itemId
, wxMenu
** itemMenu
) const
466 for (wxNode
* node
= m_menuItems
.First (); node
; node
= node
->Next ())
468 wxMenuItem
*item
= (wxMenuItem
*) node
->Data ();
470 if (item
->GetId() == itemId
)
473 *itemMenu
= (wxMenu
*) this;
477 if (item
->GetSubMenu())
479 wxMenuItem
*ans
= item
->GetSubMenu()->FindItemForId (itemId
, itemMenu
);
490 void wxMenu::SetHelpString(int itemId
, const wxString
& helpString
)
492 wxMenuItem
*item
= FindItemForId (itemId
);
494 item
->SetHelp(helpString
);
497 wxString
wxMenu::GetHelpString (int itemId
) const
499 wxMenuItem
*item
= FindItemForId (itemId
);
501 return (item
== NULL
) ? str
: item
->GetHelp();
504 void wxMenu::ProcessCommand(wxCommandEvent
& event
)
506 bool processed
= FALSE
;
511 (void)(*(m_callback
))(*this, event
);
515 // Try the menu's event handler
516 if ( !processed
&& GetEventHandler())
518 processed
= GetEventHandler()->ProcessEvent(event
);
521 // Try the window the menu was popped up from (and up
522 // through the hierarchy)
523 if ( !processed
&& GetInvokingWindow())
524 processed
= GetInvokingWindow()->ProcessEvent(event
);
527 extern wxMenu
*wxCurrentPopupMenu
;
528 bool wxWindow::PopupMenu(wxMenu
*menu
, int x
, int y
)
530 menu
->SetInvokingWindow(this);
532 HWND hWnd
= (HWND
) GetHWND();
533 HMENU hMenu
= (HMENU
)menu
->m_hMenu
;
537 ::ClientToScreen(hWnd
, &point
);
538 wxCurrentPopupMenu
= menu
;
539 ::TrackPopupMenu(hMenu
, TPM_RIGHTBUTTON
, point
.x
, point
.y
, 0, hWnd
, NULL
);
541 wxCurrentPopupMenu
= NULL
;
543 menu
->SetInvokingWindow(NULL
);
549 wxMenuBar::wxMenuBar()
551 m_eventHandler
= this;
556 m_menuBarFrame
= NULL
;
560 wxMenuBar::wxMenuBar(int N
, wxMenu
*Menus
[], const wxString Titles
[])
562 m_eventHandler
= this;
565 m_titles
= new wxString
[N
];
567 for ( i
= 0; i
< N
; i
++ )
568 m_titles
[i
] = Titles
[i
];
569 m_menuBarFrame
= NULL
;
570 for (i
= 0; i
< N
; i
++)
571 m_menus
[i
]->m_menuBar
= (wxMenuBar
*) this;
576 wxMenuBar::~wxMenuBar()
578 // In fact, don't want menu to be destroyed before MDI
579 // shuffling has taken place. Let it be destroyed
580 // automatically when the window is destroyed.
582 // DestroyMenu(menu);
587 // See remarks in ::~wxMenu() method
588 // BEWARE - this may interfere with MDI fixes, so
589 // may need to remove
592 if (m_menuBarFrame && ((m_menuBarFrame->GetWindowStyleFlag() & wxSDI) == wxSDI))
595 N = GetMenuItemCount(menu) ;
596 for (i = N-1; i >= 0; i--)
597 RemoveMenu(menu, i, MF_BYPOSITION);
600 for (i
= 0; i
< m_menuCount
; i
++)
607 /* Don't destroy menu here, in case we're MDI and
608 need to do some shuffling with VALID menu handles.
615 // Must only be used AFTER menu has been attached to frame,
616 // otherwise use individual menus to enable/disable items
617 void wxMenuBar::Enable(int Id
, bool Flag
)
621 ms_flag
= MF_ENABLED
;
625 wxMenu
*itemMenu
= NULL
;
626 wxMenuItem
*item
= FindItemForId(Id
, &itemMenu
) ;
630 if (itemMenu
->m_hMenu
)
631 EnableMenuItem((HMENU
)itemMenu
->m_hMenu
, Id
, MF_BYCOMMAND
| ms_flag
);
632 else if (itemMenu
->m_savehMenu
)
633 EnableMenuItem((HMENU
)itemMenu
->m_savehMenu
, Id
, MF_BYCOMMAND
| ms_flag
);
637 void wxMenuBar::EnableTop(int pos
, bool flag
)
641 ms_flag
= MF_ENABLED
;
645 EnableMenuItem((HMENU
)m_hMenu
, pos
, MF_BYPOSITION
| ms_flag
);
646 DrawMenuBar((HWND
) m_menuBarFrame
->GetHWND()) ;
649 // Must only be used AFTER menu has been attached to frame,
650 // otherwise use individual menus
651 void wxMenuBar::Check(int Id
, bool Flag
)
653 wxMenu
*itemMenu
= NULL
;
654 wxMenuItem
*item
= FindItemForId(Id
, &itemMenu
) ;
658 if (!item
->IsCheckable())
662 ms_flag
= MF_CHECKED
;
664 ms_flag
= MF_UNCHECKED
;
666 if (itemMenu
->m_hMenu
)
667 CheckMenuItem((HMENU
)itemMenu
->m_hMenu
, Id
, MF_BYCOMMAND
| ms_flag
);
668 else if (itemMenu
->m_savehMenu
)
669 CheckMenuItem((HMENU
)itemMenu
->m_savehMenu
, Id
, MF_BYCOMMAND
| ms_flag
);
671 // CheckMenuItem((HMENU)m_hMenu, Id, MF_BYCOMMAND | ms_flag);
674 bool wxMenuBar::Checked(int Id
) const
676 wxMenu
*itemMenu
= NULL
;
677 wxMenuItem
*item
= FindItemForId(Id
, &itemMenu
) ;
683 if (itemMenu
->m_hMenu
)
684 Flag
=GetMenuState((HMENU
)itemMenu
->m_hMenu
, Id
, MF_BYCOMMAND
) ;
685 else if (itemMenu
->m_savehMenu
)
686 Flag
=GetMenuState((HMENU
)itemMenu
->m_savehMenu
, Id
, MF_BYCOMMAND
) ;
688 // Flag=GetMenuState((HMENU)m_hMenu, Id, MF_BYCOMMAND) ;
696 bool wxMenuBar::Enabled(int Id
) const
698 wxMenu
*itemMenu
= NULL
;
699 wxMenuItem
*item
= FindItemForId(Id
, &itemMenu
) ;
705 if (itemMenu
->m_hMenu
)
706 Flag
=GetMenuState((HMENU
)itemMenu
->m_hMenu
, Id
, MF_BYCOMMAND
) ;
707 else if (itemMenu
->m_savehMenu
)
708 Flag
=GetMenuState((HMENU
)itemMenu
->m_savehMenu
, Id
, MF_BYCOMMAND
) ;
717 void wxMenuBar::SetLabel(int Id
, const wxString
& label
)
719 wxMenu
*itemMenu
= NULL
;
720 wxMenuItem
*item
= FindItemForId(Id
, &itemMenu
) ;
725 if (itemMenu
->m_hMenu
)
727 UINT was_flag
= GetMenuState((HMENU
)itemMenu
->m_hMenu
,Id
,MF_BYCOMMAND
) ;
728 ModifyMenu((HMENU
)itemMenu
->m_hMenu
,Id
,MF_BYCOMMAND
|MF_STRING
|was_flag
,Id
,(const char *)label
) ;
730 else if (itemMenu
->m_savehMenu
)
732 UINT was_flag
= GetMenuState((HMENU
)itemMenu
->m_savehMenu
,Id
,MF_BYCOMMAND
) ;
733 ModifyMenu((HMENU
)itemMenu
->m_savehMenu
,Id
,MF_BYCOMMAND
|MF_STRING
|was_flag
,Id
,(const char *)label
) ;
737 wxString
wxMenuBar::GetLabel(int Id
) const
739 wxMenu
*itemMenu
= NULL
;
740 wxMenuItem
*item
= FindItemForId(Id
, &itemMenu
) ;
745 static char tmp
[128] ;
747 if (itemMenu
->m_hMenu
)
749 len
= GetMenuString((HMENU
)itemMenu
->m_hMenu
,Id
,tmp
,127,MF_BYCOMMAND
) ;
751 else if (itemMenu
->m_savehMenu
)
753 len
= GetMenuString((HMENU
)itemMenu
->m_savehMenu
,Id
,tmp
,127,MF_BYCOMMAND
) ;
756 // int len = GetMenuString((HMENU)m_hMenu,Id,tmp,127,MF_BYCOMMAND) ;
758 return wxString(tmp
) ;
761 void wxMenuBar::SetLabelTop(int pos
, const wxString
& label
)
763 UINT was_flag
= GetMenuState((HMENU
)m_hMenu
,pos
,MF_BYPOSITION
) ;
764 if (was_flag
&MF_POPUP
)
767 HMENU popup
= GetSubMenu((HMENU
)m_hMenu
,pos
) ;
768 ModifyMenu((HMENU
)m_hMenu
,pos
,MF_BYPOSITION
|MF_STRING
|was_flag
,(UINT
)popup
,(const char *)label
) ;
771 ModifyMenu((HMENU
)m_hMenu
,pos
,MF_BYPOSITION
|MF_STRING
|was_flag
,pos
,(const char *)label
) ;
774 wxString
wxMenuBar::GetLabelTop(int pos
) const
776 static char tmp
[128] ;
777 int len
= GetMenuString((HMENU
)m_hMenu
,pos
,tmp
,127,MF_BYPOSITION
) ;
779 return wxString(tmp
);
782 bool wxMenuBar::OnDelete(wxMenu
*a_menu
, int pos
)
787 if (RemoveMenu((HMENU
)m_hMenu
, (UINT
)pos
, MF_BYPOSITION
)) {
788 m_menus
[pos
]->m_hMenu
= m_menus
[pos
]->m_savehMenu
;
789 m_menus
[pos
]->m_savehMenu
= 0;
791 if (m_menuBarFrame
) {
792 DrawMenuBar((HWND
) m_menuBarFrame
->GetHWND()) ;
801 bool wxMenuBar::OnAppend(wxMenu
*a_menu
, const char *title
)
803 if (!a_menu
->m_hMenu
)
809 a_menu
->m_savehMenu
= a_menu
->m_hMenu
;
812 AppendMenu((HMENU
)m_hMenu
, MF_POPUP
| MF_STRING
, (UINT
)a_menu
->m_savehMenu
, title
);
814 DrawMenuBar((HWND
) m_menuBarFrame
->GetHWND());
819 void wxMenuBar::Append (wxMenu
* menu
, const wxString
& title
)
821 if (!OnAppend(menu
, title
))
825 wxMenu
**new_menus
= new wxMenu
*[m_menuCount
];
826 wxString
*new_titles
= new wxString
[m_menuCount
];
829 for (i
= 0; i
< m_menuCount
- 1; i
++)
831 new_menus
[i
] = m_menus
[i
];
833 new_titles
[i
] = m_titles
[i
];
842 m_titles
= new_titles
;
844 m_menus
[m_menuCount
- 1] = (wxMenu
*)menu
;
845 m_titles
[m_menuCount
- 1] = title
;
847 ((wxMenu
*)menu
)->m_menuBar
= (wxMenuBar
*) this;
848 ((wxMenu
*)menu
)->SetParent(this);
851 void wxMenuBar::Delete(wxMenu
* menu
, int i
)
857 for (ii
= 0; ii
< m_menuCount
; ii
++) {
858 if (m_menus
[ii
] == menu
)
861 if (ii
>= m_menuCount
)
864 if (ii
< 0 || ii
>= m_menuCount
)
869 if (!OnDelete(menu
, ii
))
872 menu
->SetParent(NULL
);
875 for (j
= ii
; j
< m_menuCount
; j
++) {
876 m_menus
[j
] = m_menus
[j
+ 1];
877 m_titles
[j
] = m_titles
[j
+ 1];
881 // Find the menu menuString, item itemString, and return the item id.
882 // Returns -1 if none found.
883 int wxMenuBar::FindMenuItem (const wxString
& menuString
, const wxString
& itemString
) const
887 wxStripMenuCodes ((char *)(const char *)menuString
, buf1
);
889 for (i
= 0; i
< m_menuCount
; i
++)
891 wxStripMenuCodes ((char *)(const char *)m_titles
[i
], buf2
);
892 if (strcmp (buf1
, buf2
) == 0)
893 return m_menus
[i
]->FindItem (itemString
);
898 wxMenuItem
*wxMenuBar::FindItemForId (int Id
, wxMenu
** itemMenu
) const
903 wxMenuItem
*item
= NULL
;
905 for (i
= 0; i
< m_menuCount
; i
++)
906 if ((item
= m_menus
[i
]->FindItemForId (Id
, itemMenu
)))
911 void wxMenuBar::SetHelpString (int Id
, const wxString
& helpString
)
914 for (i
= 0; i
< m_menuCount
; i
++)
916 if (m_menus
[i
]->FindItemForId (Id
))
918 m_menus
[i
]->SetHelpString (Id
, helpString
);
924 wxString
wxMenuBar::GetHelpString (int Id
) const
927 for (i
= 0; i
< m_menuCount
; i
++)
929 if (m_menus
[i
]->FindItemForId (Id
))
930 return wxString(m_menus
[i
]->GetHelpString (Id
));
935 wxWindow
*wxMenu::GetWindow() const
937 if ( m_pInvokingWindow
!= NULL
)
938 return m_pInvokingWindow
;
939 if ( m_menuBar
!= NULL
)
940 return m_menuBar
->m_menuBarFrame
;
944 WXHMENU
wxMenu::GetHMenu() const
948 else if ( m_savehMenu
!= 0 )