Implemented wxMouseCaptureChangedEvent and made wxGenericDragImage check it

the capture before release it.
Documented wxMouseCaptureChangedEvent and GetCapture/FindCapture.


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@15117 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Julian Smart
2002-04-12 20:26:43 +00:00
parent cd5e929815
commit a5e84126fc
10 changed files with 128 additions and 3 deletions

View File

@@ -157,6 +157,7 @@ All (GUI):
for GTK+, Mac, MGL, X11, Motif ports (Chris Elliott) for GTK+, Mac, MGL, X11, Motif ports (Chris Elliott)
- added (platform-dependent) scan code to wxKeyEvent (Bryce Denney) - added (platform-dependent) scan code to wxKeyEvent (Bryce Denney)
- added wxTextCtrl::EmulateKeyPress() - added wxTextCtrl::EmulateKeyPress()
- Added wxMouseCaptureChangedEvent
wxMSW: wxMSW:
@@ -180,6 +181,8 @@ wxMSW:
- wxWindowDC and wxClientDC::GetSize() works correctly now - wxWindowDC and wxClientDC::GetSize() works correctly now
- Added wxTB_NODIVIDER and wxTB_NOALIGN so native toolbar can be used in FL - Added wxTB_NODIVIDER and wxTB_NOALIGN so native toolbar can be used in FL
- Multiline labels in buttons are now supoprted (simply use "\n" in the label) - Multiline labels in buttons are now supoprted (simply use "\n" in the label)
- Implemented wxMouseCaptureChangedEvent and made wxGenericDragImage check it
has the capture before release it.
wxGTK: wxGTK:

View File

@@ -222,6 +222,7 @@ An event object contains information about a specific event. Event handlers
\twocolitem{\helpref{wxListEvent}{wxlistevent}}{A list control event} \twocolitem{\helpref{wxListEvent}{wxlistevent}}{A list control event}
\twocolitem{\helpref{wxMaximizeEvent}{wxmaximizeevent}}{A maximize event} \twocolitem{\helpref{wxMaximizeEvent}{wxmaximizeevent}}{A maximize event}
\twocolitem{\helpref{wxMenuEvent}{wxmenuevent}}{A menu event} \twocolitem{\helpref{wxMenuEvent}{wxmenuevent}}{A menu event}
\twocolitem{\helpref{wxMouseCaptureChangedEvent}{wxmousecapturechangedevent}}{A mouse capture changed event}
\twocolitem{\helpref{wxMouseEvent}{wxmouseevent}}{A mouse event} \twocolitem{\helpref{wxMouseEvent}{wxmouseevent}}{A mouse event}
\twocolitem{\helpref{wxMoveEvent}{wxmoveevent}}{A move event} \twocolitem{\helpref{wxMoveEvent}{wxmoveevent}}{A move event}
\twocolitem{\helpref{wxNotebookEvent}{wxnotebookevent}}{A notebook control event} \twocolitem{\helpref{wxNotebookEvent}{wxnotebookevent}}{A notebook control event}

View File

@@ -202,6 +202,7 @@
\input mimetype.tex \input mimetype.tex
\input minifram.tex \input minifram.tex
\input module.tex \input module.tex
\input mcaptevt.tex
\input mouseevt.tex \input mouseevt.tex
\input moveevt.tex \input moveevt.tex
\input mltchdlg.tex \input mltchdlg.tex

View File

@@ -0,0 +1,50 @@
\section{\class{wxMouseCaptureChangedEvent}}\label{wxmousecapturechangedevent}
An mouse capture changed event is sent to a window that loses its
mouse capture. This is called even if wxWindow::ReleaseCapture
was called by the application code. Handling this event allows
an application to cater for unexpected capture releases which
might otherwise confuse mouse handling code.
This event is implemented under Windows only.
\wxheading{Derived from}
\helpref{wxEvent}{wxevent}\\
\helpref{wxObject}{wxobject}
\wxheading{Include files}
<wx/event.h>
\wxheading{Event table macros}
To process this event, use the following event handler macro to direct input to a member
function that takes a wxMouseCaptureChangedEvent argument.
\twocolwidtha{7cm}
\begin{twocollist}\itemsep=0pt
\twocolitem{{\bf EVT\_MOUSE\_CAPTURE\_CHANGED(func)}}{Process a wxEVT\_MOUSE\_CAPTURE\_CHANGED event.}
\end{twocollist}%
\wxheading{See also}
\helpref{Event handling overview}{eventhandlingoverview},
\helpref{wxWindow::CaptureMouse}{wxwindowcapturemouse},
\helpref{wxWindow::ReleaseMouse}{wxwindowreleasemouse},
\helpref{wxWindow::GetCapture}{wxwindowgetcapture}
\latexignore{\rtfignore{\wxheading{Members}}}
\membersection{wxMouseCaptureChangedEvent::wxMouseCaptureChangedEvent}
\func{}{wxMouseCaptureChangedEvent}{\param{wxWindowID }{windowId = 0}, \param{wxWindow*}{ gainedCapture = NULL}}
Constructor.
\membersection{wxActivateEvent::GetCapturedWindow}\label{wxmousecapturechangedeventgetcapturedwindow}
\constfunc{wxWindow*}{GetCapturedWindow}{\void}
Returns the window that gained the capture, or NULL if it was a non-wxWindows window.

View File

@@ -509,6 +509,19 @@ same as the size the window would have had after calling
Returns the \helpref{caret}{wxcaret} associated with the window. Returns the \helpref{caret}{wxcaret} associated with the window.
\membersection{wxWindow::GetCapture}\label{wxwindowgetcapture}
\func{static wxWindow *}{GetCapture}{\void}
Returns the currently captured window.
\wxheading{See also}
\helpref{wxWindow::HasCapture}{wxwindowhascapture},
\helpref{wxWindow::CaptureMouse}{wxwindowcapturemouse},
\helpref{wxWindow::ReleaseMouse}{wxwindowreleasemouse},
\helpref{wxMouseCaptureChangedEvent}{wxmousecapturechangedevent}
\membersection{wxWindow::GetCharHeight} \membersection{wxWindow::GetCharHeight}
\constfunc{virtual int}{GetCharHeight}{\void} \constfunc{virtual int}{GetCharHeight}{\void}
@@ -896,6 +909,18 @@ Returns a pointer to the current validator for the window, or NULL if there is n
Gets the window style that was passed to the constructor or {\bf Create} Gets the window style that was passed to the constructor or {\bf Create}
method. {\bf GetWindowStyle()} is another name for the same function. method. {\bf GetWindowStyle()} is another name for the same function.
\membersection{wxWindow::HasCapture}\label{wxwindowhascapture}
\constfunc{virtual bool}{HasCapture}{\void}
Returns TRUE if this window has the current mouse capture.
\wxheading{See also}
\helpref{wxWindow::CaptureMouse}{wxwindowcapturemouse},
\helpref{wxWindow::ReleaseMouse}{wxwindowreleasemouse},
\helpref{wxMouseCaptureChangedEvent}{wxmousecapturechangedevent}
\membersection{wxWindow::Hide}\label{wxwindowhide} \membersection{wxWindow::Hide}\label{wxwindowhide}
\func{bool}{Hide}{\void} \func{bool}{Hide}{\void}
@@ -1665,7 +1690,10 @@ Releases mouse input captured with \helpref{wxWindow::CaptureMouse}{wxwindowcapt
\wxheading{See also} \wxheading{See also}
\helpref{wxWindow::CaptureMouse}{wxwindowcapturemouse} \helpref{wxWindow::CaptureMouse}{wxwindowcapturemouse},
\helpref{wxWindow::HasCapture}{wxwindowhascapture},
\helpref{wxWindow::ReleaseMouse}{wxwindowreleasemouse},
\helpref{wxMouseCaptureChangedEvent}{wxmousecapturechangedevent}
\membersection{wxWindow::RemoveChild}\label{wxwindowremovechild} \membersection{wxWindow::RemoveChild}\label{wxwindowremovechild}

View File

@@ -1397,6 +1397,27 @@ private:
DECLARE_DYNAMIC_CLASS(wxSysColourChangedEvent) DECLARE_DYNAMIC_CLASS(wxSysColourChangedEvent)
}; };
/*
wxEVT_MOUSE_CAPTURE_CHANGED
The window losing the capture receives this message
(even if it released the capture itself).
*/
class WXDLLEXPORT wxMouseCaptureChangedEvent : public wxEvent
{
public:
wxMouseCaptureChangedEvent(wxWindowID id = 0, wxWindow* gainedCapture = NULL): wxEvent(id)
{ m_eventType = wxEVT_MOUSE_CAPTURE_CHANGED; m_gainedCapture = gainedCapture; }
virtual wxEvent *Clone() const { return new wxMouseCaptureChangedEvent(*this); }
wxWindow* GetCapturedWindow() const { return m_gainedCapture; };
private:
wxWindow* m_gainedCapture;
DECLARE_DYNAMIC_CLASS(wxMouseCaptureChangedEvent)
};
/* /*
wxEVT_DISPLAY_CHANGED wxEVT_DISPLAY_CHANGED
*/ */
@@ -1947,6 +1968,7 @@ typedef void (wxEvtHandler::*wxSetCursorEventFunction)(wxSetCursorEvent&);
typedef void (wxEvtHandler::*wxNotifyEventFunction)(wxNotifyEvent&); typedef void (wxEvtHandler::*wxNotifyEventFunction)(wxNotifyEvent&);
typedef void (wxEvtHandler::*wxHelpEventFunction)(wxHelpEvent&); typedef void (wxEvtHandler::*wxHelpEventFunction)(wxHelpEvent&);
typedef void (wxEvtHandler::*wxContextMenuEventFunction)(wxContextMenuEvent&); typedef void (wxEvtHandler::*wxContextMenuEventFunction)(wxContextMenuEvent&);
typedef void (wxEvtHandler::*wxMouseCaptureChangedEventFunction)(wxMouseCaptureChangedEvent&);
#endif // wxUSE_GUI #endif // wxUSE_GUI
// N.B. In GNU-WIN32, you *have* to take the address of a member function // N.B. In GNU-WIN32, you *have* to take the address of a member function
@@ -2013,6 +2035,7 @@ typedef void (wxEvtHandler::*wxContextMenuEventFunction)(wxContextMenuEvent&);
#define EVT_WINDOW_CREATE(func) DECLARE_EVENT_TABLE_ENTRY( wxEVT_CREATE, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxWindowCreateEventFunction) & func, (wxObject *) NULL ), #define EVT_WINDOW_CREATE(func) DECLARE_EVENT_TABLE_ENTRY( wxEVT_CREATE, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxWindowCreateEventFunction) & func, (wxObject *) NULL ),
#define EVT_WINDOW_DESTROY(func) DECLARE_EVENT_TABLE_ENTRY( wxEVT_DESTROY, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxWindowDestroyEventFunction) & func, (wxObject *) NULL ), #define EVT_WINDOW_DESTROY(func) DECLARE_EVENT_TABLE_ENTRY( wxEVT_DESTROY, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxWindowDestroyEventFunction) & func, (wxObject *) NULL ),
#define EVT_SET_CURSOR(func) DECLARE_EVENT_TABLE_ENTRY( wxEVT_SET_CURSOR, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxSetCursorEventFunction) & func, (wxObject *) NULL ), #define EVT_SET_CURSOR(func) DECLARE_EVENT_TABLE_ENTRY( wxEVT_SET_CURSOR, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxSetCursorEventFunction) & func, (wxObject *) NULL ),
#define EVT_MOUSE_CAPTURE_CHANGED(func) DECLARE_EVENT_TABLE_ENTRY( wxEVT_MOUSE_CAPTURE_CHANGED, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxMouseCaptureChangedEventFunction) & func, (wxObject *) NULL ),
// Mouse events // Mouse events
#define EVT_LEFT_DOWN(func) DECLARE_EVENT_TABLE_ENTRY( wxEVT_LEFT_DOWN, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxMouseEventFunction) & func, (wxObject *) NULL ), #define EVT_LEFT_DOWN(func) DECLARE_EVENT_TABLE_ENTRY( wxEVT_LEFT_DOWN, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxMouseEventFunction) & func, (wxObject *) NULL ),

View File

@@ -341,7 +341,7 @@ public:
bool HandleQueryNewPalette(); bool HandleQueryNewPalette();
bool HandleSysColorChange(); bool HandleSysColorChange();
bool HandleDisplayChange(); bool HandleDisplayChange();
bool HandleCaptureChanged(WXHWND gainedCapture);
bool HandleQueryEndSession(long logOff, bool *mayEnd); bool HandleQueryEndSession(long logOff, bool *mayEnd);
bool HandleEndSession(bool endSession, long logOff); bool HandleEndSession(bool endSession, long logOff);

View File

@@ -88,6 +88,7 @@ IMPLEMENT_ABSTRACT_CLASS(wxEvent, wxObject)
IMPLEMENT_DYNAMIC_CLASS(wxWindowDestroyEvent, wxEvent) IMPLEMENT_DYNAMIC_CLASS(wxWindowDestroyEvent, wxEvent)
IMPLEMENT_DYNAMIC_CLASS(wxHelpEvent, wxCommandEvent) IMPLEMENT_DYNAMIC_CLASS(wxHelpEvent, wxCommandEvent)
IMPLEMENT_DYNAMIC_CLASS(wxContextMenuEvent, wxCommandEvent) IMPLEMENT_DYNAMIC_CLASS(wxContextMenuEvent, wxCommandEvent)
IMPLEMENT_DYNAMIC_CLASS(wxMouseCaptureChangedEvent, wxEvent)
#endif // wxUSE_GUI #endif // wxUSE_GUI
const wxEventTable *wxEvtHandler::GetEventTable() const const wxEventTable *wxEvtHandler::GetEventTable() const

View File

@@ -295,7 +295,13 @@ bool wxGenericDragImage::EndDrag()
{ {
if (m_window) if (m_window)
{ {
#ifdef __WXMSW__
// Under Windows we can be pretty sure this test will give
// the correct results
if (wxWindow::GetCapture() == m_window)
#endif
m_window->ReleaseMouse(); m_window->ReleaseMouse();
if (m_cursor.Ok() && m_oldCursor.Ok()) if (m_cursor.Ok() && m_oldCursor.Ok())
{ {
m_window->SetCursor(m_oldCursor); m_window->SetCursor(m_oldCursor);

View File

@@ -2647,6 +2647,10 @@ long wxWindowMSW::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam
processed = HandlePaletteChanged((WXHWND) (HWND) wParam); processed = HandlePaletteChanged((WXHWND) (HWND) wParam);
break; break;
case WM_CAPTURECHANGED:
processed = HandleCaptureChanged((WXHWND) (HWND) lParam);
break;
case WM_QUERYNEWPALETTE: case WM_QUERYNEWPALETTE:
processed = HandleQueryNewPalette(); processed = HandleQueryNewPalette();
break; break;
@@ -3511,6 +3515,14 @@ bool wxWindowMSW::HandlePaletteChanged(WXHWND hWndPalChange)
return GetEventHandler()->ProcessEvent(event); return GetEventHandler()->ProcessEvent(event);
} }
bool wxWindowMSW::HandleCaptureChanged(WXHWND hWndGainedCapture)
{
wxMouseCaptureChangedEvent event(GetId(), wxFindWinFromHandle(hWndGainedCapture));
event.SetEventObject(this);
return GetEventHandler()->ProcessEvent(event);
}
bool wxWindowMSW::HandleQueryNewPalette() bool wxWindowMSW::HandleQueryNewPalette()
{ {