X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/906c935a80b10d53cecf57f71ab5f3f4f1d529ec..51ec29ea5d1d1093bafbae27a8483211a90d9659:/src/msw/window.cpp diff --git a/src/msw/window.cpp b/src/msw/window.cpp index 7535e4efeb..c7bdf169d2 100644 --- a/src/msw/window.cpp +++ b/src/msw/window.cpp @@ -113,10 +113,6 @@ #include #endif -#if !defined __WXWINCE__ && !defined NEED_PBT_H - #include -#endif - #if defined(__WXWINCE__) #include "wx/msw/wince/missing.h" #ifdef __POCKETPC__ @@ -321,20 +317,23 @@ static void EnsureParentHasControlParentStyle(wxWindow *parent) #endif // !__WXWINCE__ -#ifdef __WXWINCE__ -// On Windows CE, GetCursorPos can return an error, so use this function -// instead -bool GetCursorPosWinCE(POINT* pt) +// GetCursorPos can return an error, so use this function +// instead. +// Error originally observed with WinCE, but later using Remote Desktop +// to connect to XP. +void wxGetCursorPosMSW(POINT* pt) { if (!GetCursorPos(pt)) { +#ifdef __WXWINCE__ + wxLogLastError(wxT("GetCursorPos")); +#endif DWORD pos = GetMessagePos(); - pt->x = LOWORD(pos); - pt->y = HIWORD(pos); + // the coordinates may be negative in multi-monitor systems + pt->x = GET_X_LPARAM(pos); + pt->y = GET_Y_LPARAM(pos); } - return true; } -#endif // --------------------------------------------------------------------------- // event tables @@ -852,11 +851,7 @@ bool wxWindowMSW::SetCursor(const wxCursor& cursor) HWND hWnd = GetHwnd(); POINT point; -#ifdef __WXWINCE__ - ::GetCursorPosWinCE(&point); -#else - ::GetCursorPos(&point); -#endif + ::wxGetCursorPosMSW(&point); RECT rect = wxGetWindowRect(hWnd); @@ -875,13 +870,9 @@ bool wxWindowMSW::SetCursor(const wxCursor& cursor) // under the cursor and ask it to set its cursor itself as only it // knows what it is. POINT pt; - if ( !::GetCursorPos(&pt) ) - { - wxLogLastError(wxT("GetCursorPos")); - return false; - } + wxGetCursorPosMSW(&pt); - const wxWindow* win = wxFindWindowAtPoint(wxPoint(pt.x, pt.y)); + const wxWindowMSW* win = wxFindWindowAtPoint(wxPoint(pt.x, pt.y)); if ( !win ) win = this; @@ -1517,11 +1508,7 @@ bool wxWindowMSW::IsMouseInWindow() const { // get the mouse position POINT pt; -#ifdef __WXWINCE__ - ::GetCursorPosWinCE(&pt); -#else - ::GetCursorPos(&pt); -#endif + wxGetCursorPosMSW(&pt); // find the window which currently has the cursor and go up the window // chain until we find this window - or exhaust it @@ -3162,6 +3149,7 @@ wxWindowMSW::MSWHandleMessage(WXLRESULT *result, case VK_OEM_5: case VK_OEM_6: case VK_OEM_7: + case VK_OEM_102: case VK_OEM_PLUS: case VK_OEM_COMMA: case VK_OEM_MINUS: @@ -4204,14 +4192,7 @@ bool wxWindowMSW::HandleSetCursor(WXHWND WXUNUSED(hWnd), // first ask the user code - it may wish to set the cursor in some very // specific way (for example, depending on the current position) POINT pt; -#ifdef __WXWINCE__ - if ( !::GetCursorPosWinCE(&pt)) -#else - if ( !::GetCursorPos(&pt) ) -#endif - { - wxLogLastError(wxT("GetCursorPos")); - } + wxGetCursorPosMSW(&pt); int x = pt.x, y = pt.y; @@ -5628,14 +5609,7 @@ void wxWindowMSW::GenerateMouseLeave() state |= MK_RBUTTON; POINT pt; -#ifdef __WXWINCE__ - if ( !::GetCursorPosWinCE(&pt) ) -#else - if ( !::GetCursorPos(&pt) ) -#endif - { - wxLogLastError(wxT("GetCursorPos")); - } + wxGetCursorPosMSW(&pt); // we need to have client coordinates here for symmetry with // wxEVT_ENTER_WINDOW @@ -6261,6 +6235,7 @@ int VKToWX(WXWORD vk, WXLPARAM lParam, wchar_t *uc) case VK_OEM_5: case VK_OEM_6: case VK_OEM_7: + case VK_OEM_102: // MapVirtualKey() returns 0 if it fails to convert the virtual // key which nicely corresponds to our WXK_NONE. wxk = ::MapVirtualKey(vk, MAPVK_VK_TO_CHAR); @@ -6339,6 +6314,9 @@ int VKToWX(WXWORD vk, WXLPARAM lParam, wchar_t *uc) // don't use ChooseNormalOrExtended() here as the keys are reversed // here: numpad enter is the extended one wxk = HIWORD(lParam) & KF_EXTENDED ? WXK_NUMPAD_ENTER : WXK_RETURN; + + if ( uc ) + *uc = WXK_RETURN; break; default: @@ -6521,7 +6499,7 @@ wxMouseState wxGetMouseState() { wxMouseState ms; POINT pt; - GetCursorPos( &pt ); + wxGetCursorPosMSW(&pt); ms.SetX(pt.x); ms.SetY(pt.y); @@ -6644,7 +6622,14 @@ wxKeyboardHook(int nCode, WORD wParam, DWORD lParam) #endif // wxUSE_UNICODE ) { - const wxWindow * const win = wxGetActiveWindow(); + wxWindow const* win = wxWindow::DoFindFocus(); + if ( !win ) + { + // Even if the focus got lost somehow, still send the event + // to the top level parent to allow a wxDialog to always + // close on Escape. + win = wxGetActiveWindow(); + } wxKeyEvent event(wxEVT_CHAR_HOOK); MSWInitAnyKeyEvent(event, wParam, lParam, win); @@ -6659,8 +6644,11 @@ wxKeyboardHook(int nCode, WORD wParam, DWORD lParam) if ( handler && handler->ProcessEvent(event) ) { - // processed - return 1; + if ( !event.IsNextEventAllowed() ) + { + // Stop processing of this event. + return 1; + } } } } @@ -7224,11 +7212,7 @@ wxWindow* wxFindWindowAtPoint(const wxPoint& pt) wxPoint wxGetMousePosition() { POINT pt; -#ifdef __WXWINCE__ - GetCursorPosWinCE(&pt); -#else - GetCursorPos( & pt ); -#endif + wxGetCursorPosMSW(&pt); return wxPoint(pt.x, pt.y); }