Use WM_INITMENUPOPUP
Added wxMenu member to wxMenuEvent git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@21930 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
		@@ -1184,12 +1184,12 @@ private:
 | 
				
			|||||||
class WXDLLIMPEXP_CORE wxMenuEvent : public wxEvent
 | 
					class WXDLLIMPEXP_CORE wxMenuEvent : public wxEvent
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
    wxMenuEvent(wxEventType type = wxEVT_NULL, int winid = 0)
 | 
					    wxMenuEvent(wxEventType type = wxEVT_NULL, int winid = 0, wxMenu* menu = NULL)
 | 
				
			||||||
        : wxEvent(winid, type)
 | 
					        : wxEvent(winid, type)
 | 
				
			||||||
        { m_menuId = winid; }
 | 
					        { m_menuId = winid; m_menu = NULL; }
 | 
				
			||||||
    wxMenuEvent(const wxMenuEvent & event)
 | 
					    wxMenuEvent(const wxMenuEvent & event)
 | 
				
			||||||
        : wxEvent(event)
 | 
					        : wxEvent(event)
 | 
				
			||||||
    { m_menuId = event.m_menuId; }
 | 
					    { m_menuId = event.m_menuId; m_menu = event.m_menu; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // only for wxEVT_MENU_HIGHLIGHT
 | 
					    // only for wxEVT_MENU_HIGHLIGHT
 | 
				
			||||||
    int GetMenuId() const { return m_menuId; }
 | 
					    int GetMenuId() const { return m_menuId; }
 | 
				
			||||||
@@ -1197,10 +1197,14 @@ public:
 | 
				
			|||||||
    // only for wxEVT_MENU_OPEN/CLOSE
 | 
					    // only for wxEVT_MENU_OPEN/CLOSE
 | 
				
			||||||
    bool IsPopup() const { return m_menuId == -1; }
 | 
					    bool IsPopup() const { return m_menuId == -1; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // only for wxEVT_MENU_OPEN/CLOSE
 | 
				
			||||||
 | 
					    wxMenu* GetMenu() const { return m_menu; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    virtual wxEvent *Clone() const { return new wxMenuEvent(*this); }
 | 
					    virtual wxEvent *Clone() const { return new wxMenuEvent(*this); }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
private:
 | 
					private:
 | 
				
			||||||
    int     m_menuId;
 | 
					    int     m_menuId;
 | 
				
			||||||
 | 
					    wxMenu* m_menu;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    DECLARE_DYNAMIC_CLASS(wxMenuEvent)
 | 
					    DECLARE_DYNAMIC_CLASS(wxMenuEvent)
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -146,8 +146,9 @@ public:
 | 
				
			|||||||
    void OnMenuHighlight(wxMenuEvent& event);
 | 
					    void OnMenuHighlight(wxMenuEvent& event);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if wxUSE_MENUS
 | 
					#if wxUSE_MENUS
 | 
				
			||||||
    // send wxUpdateUIEvents for all menu items (called from OnIdle())
 | 
					    // send wxUpdateUIEvents for all menu items in the menubar,
 | 
				
			||||||
    void DoMenuUpdates();
 | 
					    // or just for menu if non-NULL
 | 
				
			||||||
 | 
					    void DoMenuUpdates(wxMenu* menu = NULL);
 | 
				
			||||||
#endif // wxUSE_MENUS
 | 
					#endif // wxUSE_MENUS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // do the UI update processing for this window
 | 
					    // do the UI update processing for this window
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -102,6 +102,12 @@ public:
 | 
				
			|||||||
    // current size - this has an effect of refreshing the window layout
 | 
					    // current size - this has an effect of refreshing the window layout
 | 
				
			||||||
    virtual void SendSizeEvent();
 | 
					    virtual void SendSizeEvent();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __WXWINCE__
 | 
				
			||||||
 | 
					    WXHWND GetCommandBar() { return m_commandBar; }
 | 
				
			||||||
 | 
					    WXHWND CreateCommandBar() ;
 | 
				
			||||||
 | 
					    void RemoveCommandBar() ;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
protected:
 | 
					protected:
 | 
				
			||||||
    // common part of all ctors
 | 
					    // common part of all ctors
 | 
				
			||||||
    void Init();
 | 
					    void Init();
 | 
				
			||||||
@@ -128,8 +134,8 @@ protected:
 | 
				
			|||||||
    // window proc for the frames
 | 
					    // window proc for the frames
 | 
				
			||||||
    long MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam);
 | 
					    long MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // handle WM_INITMENU message
 | 
					    // handle WM_INITMENUPOPUP message
 | 
				
			||||||
    bool HandleInitMenu();
 | 
					    bool HandleInitMenuPopup(WXHMENU hMenu);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    virtual bool IsMDIChild() const { return FALSE; }
 | 
					    virtual bool IsMDIChild() const { return FALSE; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -332,8 +332,7 @@
 | 
				
			|||||||
 * Presently, only Windows and GTK+ support wxEVT_MENU_OPEN.
 | 
					 * Presently, only Windows and GTK+ support wxEVT_MENU_OPEN.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
#ifndef wxUSE_IDLEMENUUPDATES
 | 
					#ifndef wxUSE_IDLEMENUUPDATES
 | 
				
			||||||
    #if (defined(__WXMSW__) && !defined(__WXWINCE)) ||\
 | 
					    #if defined(__WXMSW__) || defined(__WXGTK__)
 | 
				
			||||||
         defined(__WXGTK__)
 | 
					 | 
				
			||||||
        #define wxUSE_IDLEMENUUPDATES 0
 | 
					        #define wxUSE_IDLEMENUUPDATES 0
 | 
				
			||||||
    #else
 | 
					    #else
 | 
				
			||||||
        #define wxUSE_IDLEMENUUPDATES 1
 | 
					        #define wxUSE_IDLEMENUUPDATES 1
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -256,10 +256,10 @@ void wxFrameBase::OnInternalIdle()
 | 
				
			|||||||
#endif
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void wxFrameBase::OnMenuOpen(wxMenuEvent& WXUNUSED(event))
 | 
					void wxFrameBase::OnMenuOpen(wxMenuEvent& event)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#if wxUSE_MENUS && !wxUSE_IDLEMENUUPDATES
 | 
					#if wxUSE_MENUS && !wxUSE_IDLEMENUUPDATES
 | 
				
			||||||
    DoMenuUpdates();
 | 
					    DoMenuUpdates(event.GetMenu());
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -421,13 +421,15 @@ wxToolBar* wxFrameBase::OnCreateToolBar(long style,
 | 
				
			|||||||
#if wxUSE_MENUS
 | 
					#if wxUSE_MENUS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// update all menus
 | 
					// update all menus
 | 
				
			||||||
void wxFrameBase::DoMenuUpdates()
 | 
					void wxFrameBase::DoMenuUpdates(wxMenu* menu)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					    wxEvtHandler* source = GetEventHandler();
 | 
				
			||||||
    wxMenuBar* bar = GetMenuBar();
 | 
					    wxMenuBar* bar = GetMenuBar();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if ( bar != NULL )
 | 
					    if (menu)
 | 
				
			||||||
 | 
					        menu->UpdateUI(source);
 | 
				
			||||||
 | 
					    else if ( bar != NULL )
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        wxEvtHandler* source = GetEventHandler();
 | 
					 | 
				
			||||||
        int nCount = bar->GetMenuCount();
 | 
					        int nCount = bar->GetMenuCount();
 | 
				
			||||||
        for (int n = 0; n < nCount; n++)
 | 
					        for (int n = 0; n < nCount; n++)
 | 
				
			||||||
            bar->GetMenu(n)->UpdateUI(source);
 | 
					            bar->GetMenu(n)->UpdateUI(source);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -169,7 +169,7 @@ static void gtk_menu_open_callback( GtkWidget *widget, wxMenu *menu )
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    if (g_isIdle) wxapp_install_idle_handler();
 | 
					    if (g_isIdle) wxapp_install_idle_handler();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    wxMenuEvent event( wxEVT_MENU_OPEN, -1 );
 | 
					    wxMenuEvent event( wxEVT_MENU_OPEN, -1, menu );
 | 
				
			||||||
    event.SetEventObject( menu );
 | 
					    event.SetEventObject( menu );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    wxEvtHandler* handler = menu->GetEventHandler();
 | 
					    wxEvtHandler* handler = menu->GetEventHandler();
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -169,7 +169,7 @@ static void gtk_menu_open_callback( GtkWidget *widget, wxMenu *menu )
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    if (g_isIdle) wxapp_install_idle_handler();
 | 
					    if (g_isIdle) wxapp_install_idle_handler();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    wxMenuEvent event( wxEVT_MENU_OPEN, -1 );
 | 
					    wxMenuEvent event( wxEVT_MENU_OPEN, -1, menu );
 | 
				
			||||||
    event.SetEventObject( menu );
 | 
					    event.SetEventObject( menu );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    wxEvtHandler* handler = menu->GetEventHandler();
 | 
					    wxEvtHandler* handler = menu->GetEventHandler();
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -141,11 +141,7 @@ wxFrame::~wxFrame()
 | 
				
			|||||||
    m_isBeingDeleted = TRUE;
 | 
					    m_isBeingDeleted = TRUE;
 | 
				
			||||||
    DeleteAllBars();
 | 
					    DeleteAllBars();
 | 
				
			||||||
#ifdef __WXWINCE__
 | 
					#ifdef __WXWINCE__
 | 
				
			||||||
    if (m_commandBar)
 | 
					    RemoveCommandBar();
 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        ::DestroyWindow((HWND) m_commandBar);
 | 
					 | 
				
			||||||
        m_commandBar = NULL;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -300,16 +296,9 @@ void wxFrame::InternalSetMenuBar()
 | 
				
			|||||||
#ifdef __WXMICROWIN__
 | 
					#ifdef __WXMICROWIN__
 | 
				
			||||||
    // Nothing
 | 
					    // Nothing
 | 
				
			||||||
#elif defined(__WXWINCE__)
 | 
					#elif defined(__WXWINCE__)
 | 
				
			||||||
    if (!m_commandBar)
 | 
					    
 | 
				
			||||||
    {
 | 
					    CreateCommandBar() ;
 | 
				
			||||||
        // TODO: eventually have a wxCommandBar class
 | 
					
 | 
				
			||||||
        m_commandBar = (WXHWND) CommandBar_Create(wxGetInstance(), GetHwnd(), NewControlId());
 | 
					 | 
				
			||||||
        if (!m_commandBar)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            wxFAIL_MSG( _T("failed to create commandbar") );
 | 
					 | 
				
			||||||
            return;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    if (m_commandBar)
 | 
					    if (m_commandBar)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        if (!CommandBar_InsertMenubarEx((HWND) m_commandBar, NULL,
 | 
					        if (!CommandBar_InsertMenubarEx((HWND) m_commandBar, NULL,
 | 
				
			||||||
@@ -802,6 +791,10 @@ long wxFrame::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
 | 
				
			|||||||
            processed = HandlePaint();
 | 
					            processed = HandlePaint();
 | 
				
			||||||
            break;
 | 
					            break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        case WM_INITMENUPOPUP:
 | 
				
			||||||
 | 
					            processed = HandleInitMenuPopup((WXHMENU) wParam);
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if !defined(__WXMICROWIN__) && !defined(__WXWINCE__)
 | 
					#if !defined(__WXMICROWIN__) && !defined(__WXWINCE__)
 | 
				
			||||||
        case WM_MENUSELECT:
 | 
					        case WM_MENUSELECT:
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
@@ -813,10 +806,6 @@ long wxFrame::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
            break;
 | 
					            break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        case WM_INITMENU:
 | 
					 | 
				
			||||||
            processed = HandleInitMenu();
 | 
					 | 
				
			||||||
            break;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        case WM_EXITMENULOOP:
 | 
					        case WM_EXITMENULOOP:
 | 
				
			||||||
            processed = HandleMenuLoop(wxEVT_MENU_CLOSE, wParam);
 | 
					            processed = HandleMenuLoop(wxEVT_MENU_CLOSE, wParam);
 | 
				
			||||||
            break;
 | 
					            break;
 | 
				
			||||||
@@ -839,13 +828,52 @@ long wxFrame::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
 | 
				
			|||||||
    return rc;
 | 
					    return rc;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// handle WM_INITMENU message
 | 
					// handle WM_INITMENUPOPUP message
 | 
				
			||||||
bool wxFrame::HandleInitMenu()
 | 
					bool wxFrame::HandleInitMenuPopup(WXHMENU hMenu)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    wxMenuEvent event(wxEVT_MENU_OPEN, 0);
 | 
					    wxMenu* menu = NULL;
 | 
				
			||||||
 | 
					    if (GetMenuBar())
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        int nCount = GetMenuBar()->GetMenuCount();
 | 
				
			||||||
 | 
					        for (int n = 0; n < nCount; n++)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            if (GetMenuBar()->GetMenu(n)->GetHMenu() == hMenu)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                menu = GetMenuBar()->GetMenu(n);
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    wxMenuEvent event(wxEVT_MENU_OPEN, 0, menu);
 | 
				
			||||||
    event.SetEventObject(this);
 | 
					    event.SetEventObject(this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return GetEventHandler()->ProcessEvent(event);
 | 
					    return GetEventHandler()->ProcessEvent(event);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __WXWINCE__
 | 
				
			||||||
 | 
					WXHWND wxFrame::CreateCommandBar()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if (m_commandBar)
 | 
				
			||||||
 | 
					        return m_commandBar;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    m_commandBar = (WXHWND) CommandBar_Create(wxGetInstance(), GetHwnd(), NewControlId());
 | 
				
			||||||
 | 
					    if (!m_commandBar)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        wxFAIL_MSG( _T("failed to create commandbar") );
 | 
				
			||||||
 | 
					        return 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return m_commandBar;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void wxFrame::RemoveCommandBar()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if (m_commandBar)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        ::DestroyWindow((HWND) m_commandBar);
 | 
				
			||||||
 | 
					        m_commandBar = NULL;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user