From 69231000be8d209bb8ea1f6aaa1ff665a270e351 Mon Sep 17 00:00:00 2001 From: Julian Smart Date: Wed, 16 May 2001 11:32:21 +0000 Subject: [PATCH] Applied patch #421554: implementation of wxEVT_CONTEXT_MENU git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@10173 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/event.h | 37 ++++++++++++++++++++++++++++++++++++- src/common/event.cpp | 1 + src/msw/window.cpp | 19 +++++++++++++++++++ 3 files changed, 56 insertions(+), 1 deletion(-) diff --git a/include/wx/event.h b/include/wx/event.h index f7bddba9b7..24cc14c0b4 100644 --- a/include/wx/event.h +++ b/include/wx/event.h @@ -961,7 +961,6 @@ public: wxEVT_MENU_INIT, wxEVT_MENU_HIGHLIGHT, wxEVT_POPUP_MENU_INIT, - wxEVT_CONTEXT_MENU, */ class WXDLLEXPORT wxMenuEvent : public wxEvent @@ -1425,6 +1424,37 @@ private: DECLARE_DYNAMIC_CLASS(wxHelpEvent) }; +// A Context event is sent when the user right clicks on a window or +// presses Shift-F10 +// NOTE : Under windows this is a repackaged WM_CONTETXMENU message +// Under other systems it may have to be generated from a right click event +/* + wxEVT_CONTEXT_MENU +*/ + +class WXDLLEXPORT wxContextMenuEvent : public wxCommandEvent +{ +public: + wxContextMenuEvent(wxEventType type = wxEVT_NULL, + wxWindowID id = 0, + const wxPoint& pt = wxDefaultPosition) + { + m_eventType = type; + m_id = id; + m_pos = pt; + } + + // Position of event (in screen coordinates) + const wxPoint& GetPosition() const { return m_pos; } + void SetPosition(const wxPoint& pos) { m_pos = pos; } + +protected: + wxPoint m_pos; + +private: + DECLARE_DYNAMIC_CLASS(wxContextMenuEvent) +}; + #endif // wxUSE_GUI // Idle event @@ -1705,6 +1735,7 @@ typedef void (wxEvtHandler::*wxWindowDestroyEventFunction)(wxWindowDestroyEvent& typedef void (wxEvtHandler::*wxSetCursorEventFunction)(wxSetCursorEvent&); typedef void (wxEvtHandler::*wxNotifyEventFunction)(wxNotifyEvent&); typedef void (wxEvtHandler::*wxHelpEventFunction)(wxHelpEvent&); +typedef void (wxEvtHandler::*wxContextMenuEventFunction)(wxContextMenuEvent&); #endif // wxUSE_GUI // N.B. In GNU-WIN32, you *have* to take the address of a member function @@ -1935,6 +1966,10 @@ typedef void (wxEvtHandler::*wxHelpEventFunction)(wxHelpEvent&); #define EVT_DETAILED_HELP_RANGE(id1, id2, func) \ DECLARE_EVENT_TABLE_ENTRY( wxEVT_DETAILED_HELP, id1, id2, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) (wxHelpEventFunction) & func, (wxObject *) NULL ), +// Context Menu Events +#define EVT_CONTEXT_MENU(func) \ + DECLARE_EVENT_TABLE_ENTRY(wxEVT_CONTEXT_MENU, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxContextMenuEventFunction) & func, (wxObject *) NULL ), + // ---------------------------------------------------------------------------- // Global data // ---------------------------------------------------------------------------- diff --git a/src/common/event.cpp b/src/common/event.cpp index 301ae91082..061d991d7a 100644 --- a/src/common/event.cpp +++ b/src/common/event.cpp @@ -83,6 +83,7 @@ IMPLEMENT_DYNAMIC_CLASS(wxIdleEvent, wxEvent) IMPLEMENT_DYNAMIC_CLASS(wxWindowCreateEvent, wxEvent) IMPLEMENT_DYNAMIC_CLASS(wxWindowDestroyEvent, wxEvent) IMPLEMENT_DYNAMIC_CLASS(wxHelpEvent, wxCommandEvent) + IMPLEMENT_DYNAMIC_CLASS(wxContextMenuEvent, wxCommandEvent) #endif // wxUSE_GUI const wxEventTable *wxEvtHandler::GetEventTable() const diff --git a/src/msw/window.cpp b/src/msw/window.cpp index b4073d6d24..3a91b2ccab 100644 --- a/src/msw/window.cpp +++ b/src/msw/window.cpp @@ -2226,10 +2226,29 @@ long wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam) wxHelpEvent helpEvent(wxEVT_HELP, info->iCtrlId) ; helpEvent.SetEventObject(this); processed = GetEventHandler()->ProcessEvent(helpEvent); + } else processed = FALSE; break; } + case WM_CONTEXTMENU: + { + HWND hWnd = (HWND) wParam; + + // we don't convert from screen to client coordinates as + // the event may be handled by a parent window + wxPoint p(LOWORD(lParam), HIWORD(lParam)); + + wxContextMenuEvent contextEvent(wxEVT_CONTEXT_MENU, GetId(), p); + GetEventHandler()->ProcessEvent(contextEvent); + + // set processed to true even if the event is not handled because if we don't + // windows will propogate the WM_CONTEXTMENU up the parent window chain, which + // we have already done ourselves. + processed = true; + + break; + } #endif }