X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c719013fd40f1d9f0cd1eff5be177da9a743d5c7..18138662efd0bc550d78cbe32e93e25b43bbcbd2:/src/msw/window.cpp diff --git a/src/msw/window.cpp b/src/msw/window.cpp index bd7a853adf..0046539480 100644 --- a/src/msw/window.cpp +++ b/src/msw/window.cpp @@ -93,6 +93,7 @@ #include "wx/notebook.h" #include "wx/listctrl.h" +#include "wx/dynlib.h" #include @@ -119,7 +120,7 @@ #endif #endif -#if defined(TME_LEAVE) && defined(WM_MOUSELEAVE) +#if defined(TME_LEAVE) && defined(WM_MOUSELEAVE) && wxUSE_DYNLIB_CLASS #define HAVE_TRACKMOUSEEVENT #endif // everything needed for TrackMouseEvent() @@ -802,7 +803,30 @@ bool wxWindowMSW::SetCursor(const wxCursor& cursor) // don't "overwrite" busy cursor if ( m_cursor.Ok() && !wxIsBusy() ) { - ::SetCursor(GetHcursorOf(m_cursor)); + // normally we should change the cursor only if it's over this window + // but we should do it always if we capture the mouse currently + bool set = HasCapture(); + if ( !set ) + { + HWND hWnd = GetHwnd(); + + POINT point; +#ifdef __WXWINCE__ + ::GetCursorPosWinCE(&point); +#else + ::GetCursorPos(&point); +#endif + + RECT rect = wxGetWindowRect(hWnd); + + set = ::PtInRect(&rect, point) != 0; + } + + if ( set ) + { + ::SetCursor(GetHcursorOf(m_cursor)); + } + //else: will be set later when the mouse enters this window } return true; @@ -1539,9 +1563,13 @@ void wxWindowMSW::Update() // drag and drop // --------------------------------------------------------------------------- +#if wxUSE_DRAG_AND_DROP || !defined(__WXWINCE__) + +#if wxUSE_STATBOX + // we need to lower the sibling static boxes so controls contained within can be // a drop target -static inline void AdjustStaticBoxZOrder(wxWindow *parent) +static void AdjustStaticBoxZOrder(wxWindow *parent) { // no sibling static boxes if we have no parent (ie TLW) if ( !parent ) @@ -1560,6 +1588,16 @@ static inline void AdjustStaticBoxZOrder(wxWindow *parent) } } +#else // !wxUSE_STATBOX + +static inline void AdjustStaticBoxZOrder(wxWindow * WXUNUSED(parent)) +{ +} + +#endif // wxUSE_STATBOX/!wxUSE_STATBOX + +#endif // drag and drop is used + #if wxUSE_DRAG_AND_DROP void wxWindowMSW::SetDropTarget(wxDropTarget *pDropTarget) { @@ -1703,7 +1741,7 @@ void wxWindowMSW::DoGetPosition(int *x, int *y) const { if ( wxTheApp->GetLayoutDirection() == wxLayout_RightToLeft ) { - // In RTL mode, we want the logical left x-coordinate, + // In RTL mode, we want the logical left x-coordinate, // which would be the physical right x-coordinate. point.x = rect.right; } @@ -2140,10 +2178,13 @@ bool wxWindowMSW::MSWProcessMessage(WXMSG* pMsg) switch ( msg->wParam ) { case VK_TAB: - if ( lDlgCode & DLGC_WANTTAB ) { + if ( (lDlgCode & DLGC_WANTTAB) && !bCtrlDown ) + { + // let the control have the TAB bProcess = false; } - else { + else // use it for navigation + { // Ctrl-Tab cycles thru notebook pages bWindowChange = bCtrlDown; bForward = !bShiftDown; @@ -2173,9 +2214,9 @@ bool wxWindowMSW::MSWProcessMessage(WXMSG* pMsg) // we treat PageUp/Dn as arrows because chances are that // a control which needs arrows also needs them for // navigation (e.g. wxTextCtrl, wxListCtrl, ...) - if ( (lDlgCode & DLGC_WANTARROWS) || !bCtrlDown ) + if ( (lDlgCode & DLGC_WANTARROWS) && !bCtrlDown ) bProcess = false; - else + else // OTOH Ctrl-PageUp/Dn works as [Shift-]Ctrl-Tab bWindowChange = true; break; @@ -2630,7 +2671,8 @@ WXLRESULT wxWindowMSW::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM l #ifdef HAVE_TRACKMOUSEEVENT case WM_MOUSELEAVE: - // filter out excess WM_MOUSELEAVE events sent after PopupMenu() (on XP at least) + // filter out excess WM_MOUSELEAVE events sent after PopupMenu() + // (on XP at least) if ( m_mouseInWindow ) { GenerateMouseLeave(); @@ -2822,12 +2864,12 @@ WXLRESULT wxWindowMSW::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM l #endif // defined(WM_DRAWITEM) case WM_GETDLGCODE: - if ( !IsOfStandardClass() ) + if ( !IsOfStandardClass() || HasFlag(wxWANTS_CHARS) ) { // we always want to get the char events rc.result = DLGC_WANTCHARS; - if ( GetWindowStyleFlag() & wxWANTS_CHARS ) + if ( HasFlag(wxWANTS_CHARS) ) { // in fact, we want everything rc.result |= DLGC_WANTARROWS | @@ -3952,7 +3994,7 @@ bool wxWindowMSW::HandlePower(WXWPARAM WXUNUSED_IN_WINCE(wParam), bool wxWindowMSW::IsDoubleBuffered() const { - for ( const wxWindow *wnd = this; + for ( const wxWindowMSW *wnd = this; wnd && !wnd->IsTopLevel(); wnd = wnd->GetParent() ) { @@ -4918,14 +4960,41 @@ bool wxWindowMSW::HandleMouseMove(int x, int y, WXUINT flags) m_mouseInWindow = true; #ifdef HAVE_TRACKMOUSEEVENT - WinStruct trackinfo; + typedef BOOL (WINAPI *_TrackMouseEvent_t)(LPTRACKMOUSEEVENT); +#ifdef __WXWINCE__ + static const _TrackMouseEvent_t + s_pfn_TrackMouseEvent = _TrackMouseEvent; +#else // !__WXWINCE__ + static _TrackMouseEvent_t s_pfn_TrackMouseEvent; + static bool s_initDone = false; + if ( !s_initDone ) + { + wxLogNull noLog; + + wxDynamicLibrary dllComCtl32(_T("comctl32.dll"), wxDL_VERBATIM); + if ( dllComCtl32.IsLoaded() ) + { + s_pfn_TrackMouseEvent = (_TrackMouseEvent_t) + dllComCtl32.GetSymbol(_T("_TrackMouseEvent")); + } + + s_initDone = true; - trackinfo.dwFlags = TME_LEAVE; - trackinfo.hwndTrack = GetHwnd(); + // notice that it's ok to unload comctl32.dll here as it won't + // be really unloaded, being still in use because we link to it + // statically too + } - // Use the commctrl.h _TrackMouseEvent(), which will call the real - // TrackMouseEvent() if available or emulate it - _TrackMouseEvent(&trackinfo); + if ( s_pfn_TrackMouseEvent ) +#endif // __WXWINCE__/!__WXWINCE__ + { + WinStruct trackinfo; + + trackinfo.dwFlags = TME_LEAVE; + trackinfo.hwndTrack = GetHwnd(); + + (*s_pfn_TrackMouseEvent)(&trackinfo); + } #endif // HAVE_TRACKMOUSEEVENT wxMouseEvent event(wxEVT_ENTER_WINDOW); @@ -4935,7 +5004,7 @@ bool wxWindowMSW::HandleMouseMove(int x, int y, WXUINT flags) } } #ifdef HAVE_TRACKMOUSEEVENT - else + else // mouse not in window { // Check if we need to send a LEAVE event // Windows doesn't send WM_MOUSELEAVE if the mouse has been captured so