X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/999836aacade840a5d9a0cbb5fad7b1d4de62c93..919312f76764a6fee2422664d2251c4e6b6be993:/src/msw/window.cpp diff --git a/src/msw/window.cpp b/src/msw/window.cpp index 65006bc51b..d3bc7241d7 100644 --- a/src/msw/window.cpp +++ b/src/msw/window.cpp @@ -53,6 +53,8 @@ #include "wx/ownerdrw.h" #endif +#include "wx/module.h" + #if wxUSE_DRAG_AND_DROP #include "wx/dnd.h" #endif @@ -462,9 +464,6 @@ bool wxWindowMSW::MSWCommand(WXUINT WXUNUSED(param), WXWORD WXUNUSED(id)) void wxWindowMSW::Init() { - // generic - InitBase(); - // MSW specific m_isBeingDeleted = FALSE; m_oldWndProc = NULL; @@ -2401,6 +2400,62 @@ long wxWindowMSW::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam wParam); break; + // Seems to be broken currently +#if 0 // ndef __WXWINCE__ + case WM_MOUSELEAVE: + { + wxASSERT_MSG( !m_mouseInWindow, wxT("the mouse should be in a window to generate this event!") ); + + // only process this message if the mouse is not in the window, + // This can also check for children in composite windows. + // however, this may mean the the wxEVT_LEAVE_WINDOW is never sent + // if the mouse does not enter the window from it's child before + // leaving the scope of the window. ( perhaps this can be picked + // up in the OnIdle code as before, for this special case ) + if ( /*IsComposite() && */ !IsMouseInWindow() ) + { + m_mouseInWindow = FALSE; + + // Unfortunately no mouse state is passed with a WM_MOUSE_LEAVE + int state = 0; + if ( wxIsShiftDown() ) + state |= MK_SHIFT; + if ( wxIsCtrlDown() ) + state |= MK_CONTROL; + if ( GetKeyState( VK_LBUTTON ) ) + state |= MK_LBUTTON; + if ( GetKeyState( VK_MBUTTON ) ) + state |= MK_MBUTTON; + if ( GetKeyState( VK_RBUTTON ) ) + state |= MK_RBUTTON; + + POINT pt; + if ( !::GetCursorPos(&pt) ) + { + wxLogLastError(_T("GetCursorPos")); + } + + // we need to have client coordinates here for symmetry with + // wxEVT_ENTER_WINDOW + RECT rect = wxGetWindowRect(GetHwnd()); + pt.x -= rect.left; + pt.y -= rect.top; + + wxMouseEvent event2(wxEVT_LEAVE_WINDOW); + InitMouseEvent(event2, pt.x, pt.y, state); + + (void)GetEventHandler()->ProcessEvent(event2); + } + // always pass processed back as false, this allows the window + // manager to process the message too. This is needed to ensure + // windows XP themes work properly as the mouse moves over widgets + // like buttons. + processed = false; + } + break; +#endif + // __WXWINCE__ + #if wxUSE_MOUSEWHEEL case WM_MOUSEWHEEL: processed = HandleMouseWheel(wParam, lParam); @@ -2994,6 +3049,8 @@ bool wxWindowMSW::MSWGetCreateWindowCoords(const wxPoint& pos, nonDefault = TRUE; } + AdjustForParentClientOrigin(x, y); + return nonDefault; } @@ -4341,6 +4398,18 @@ bool wxWindowMSW::HandleMouseMove(int x, int y, WXUINT flags) // Generate an ENTER event m_mouseInWindow = TRUE; +#ifndef __WXWINCE__ + TRACKMOUSEEVENT trackinfo; + + trackinfo.cbSize = sizeof(trackinfo); + trackinfo.dwFlags = TME_LEAVE; + trackinfo.hwndTrack = GetHwnd(); + //Use the commctrl.h _TrackMouseEvent, which will call the + // appropriate TrackMouseEvent or emulate it ( win95 ) + // else we need _WIN32_WINNT >= 0x0400 + _TrackMouseEvent(&trackinfo); +#endif + wxMouseEvent event(wxEVT_ENTER_WINDOW); InitMouseEvent(event, x, y, flags); @@ -5684,3 +5753,54 @@ bool wxWindowMSW::HandleHotKey(WXWPARAM wParam, WXLPARAM lParam) #endif // wxUSE_HOTKEY +// Not verified for WinCE +#ifndef __WXWINCE__ +/* + * wxEventFixModule (needs a better name) allows message handling to continute while a menu + * is being shown - ie, to continue processing messages from a worker thread. + * + * Code originally by Jason W. from wx-dev, reworked into a wxModule by Chris Mellon + */ + +class wxEventFixModule : public wxModule { +public: + //base class virtuals + virtual bool OnInit() { + wxEventFixModule::s_hMsgHookProc = SetWindowsHookEx( + WH_GETMESSAGE, + &wxEventFixModule::MsgHookProc, + NULL, + GetCurrentThreadId()); + wxLogDebug(_T("Loaded event fix module")); + return true; + }; + virtual void OnExit() { + UnhookWindowsHookEx(wxEventFixModule::s_hMsgHookProc); + + }; + static LRESULT CALLBACK MsgHookProc(int nCode, WPARAM wParam, LPARAM lParam) { + MSG *msg = (MSG*)lParam; + switch (msg->message) + { + case WM_NULL: + static bool bInHookProc = false; + if (!bInHookProc) + { + bInHookProc = true; + wxTheApp->ProcessPendingEvents(); + bInHookProc = false; + } + break; + } + return CallNextHookEx(wxEventFixModule::s_hMsgHookProc, nCode, wParam, lParam); + }; +private: + static HHOOK s_hMsgHookProc; +DECLARE_DYNAMIC_CLASS(wxEventFixModule) +}; +HHOOK wxEventFixModule::s_hMsgHookProc = 0; + +IMPLEMENT_DYNAMIC_CLASS(wxEventFixModule, wxModule) +#endif + // __WXWINCE__ +