X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f350d4b2ee92d0e4db0019a649ed4ec74236c524..2209baaee3a8578450e204593b79ed155f340f68:/src/msw/window.cpp diff --git a/src/msw/window.cpp b/src/msw/window.cpp index a80bee3a53..3be9dd4b12 100644 --- a/src/msw/window.cpp +++ b/src/msw/window.cpp @@ -798,22 +798,10 @@ bool wxWindowMSW::SetCursor(const wxCursor& cursor) return false; } - if ( m_cursor.Ok() ) + // don't "overwrite" busy cursor + if ( m_cursor.Ok() && !wxIsBusy() ) { - HWND hWnd = GetHwnd(); - - // Change the cursor NOW if we're within the correct window - POINT point; -#ifdef __WXWINCE__ - ::GetCursorPosWinCE(&point); -#else - ::GetCursorPos(&point); -#endif - - RECT rect = wxGetWindowRect(hWnd); - - if ( ::PtInRect(&rect, point) && !wxIsBusy() ) - ::SetCursor(GetHcursorOf(m_cursor)); + ::SetCursor(GetHcursorOf(m_cursor)); } return true; @@ -1155,6 +1143,9 @@ void wxWindowMSW::SetWindowStyleFlag(long flags) if ( !GetHwnd() ) return; + // we may need to call SetWindowPos() when we change some styles + bool callSWP = false; + WXDWORD exstyle, exstyleOld; long style = MSWGetStyle(flags, &exstyle), styleOld = MSWGetStyle(flagsOld, &exstyleOld); @@ -1170,17 +1161,40 @@ void wxWindowMSW::SetWindowStyleFlag(long flags) styleReal |= style; ::SetWindowLong(GetHwnd(), GWL_STYLE, styleReal); + + // If any of the style changes changed any of the frame styles: + // MSDN: SetWindowLong: + // Certain window data is cached, so changes you make using + // SetWindowLong will not take effect until you call the + // SetWindowPos function. Specifically, if you change any of + // the frame styles, you must call SetWindowPos with the + // SWP_FRAMECHANGED flag for the cache to be updated properly. + + callSWP = ((styleOld ^ style ) & (WS_BORDER | + WS_THICKFRAME | + WS_CAPTION | + WS_DLGFRAME | + WS_MAXIMIZEBOX | + WS_MINIMIZEBOX | + WS_SYSMENU) ) != 0; } // and the extended style + long exstyleReal = ::GetWindowLong(GetHwnd(), GWL_EXSTYLE); + if ( exstyle != exstyleOld ) { - long exstyleReal = ::GetWindowLong(GetHwnd(), GWL_EXSTYLE); exstyleReal &= ~exstyleOld; exstyleReal |= exstyle; ::SetWindowLong(GetHwnd(), GWL_EXSTYLE, exstyleReal); + // ex style changes don't take effect without calling SetWindowPos + callSWP = true; + } + + if ( callSWP ) + { // we must call SetWindowPos() to flush the cached extended style and // also to make the change to wxSTAY_ON_TOP style take effect: just // setting the style simply doesn't work @@ -1188,7 +1202,7 @@ void wxWindowMSW::SetWindowStyleFlag(long flags) exstyleReal & WS_EX_TOPMOST ? HWND_TOPMOST : HWND_NOTOPMOST, 0, 0, 0, 0, - SWP_NOMOVE | SWP_NOSIZE) ) + SWP_NOMOVE | SWP_NOSIZE | SWP_FRAMECHANGED) ) { wxLogLastError(_T("SetWindowPos")); } @@ -1957,7 +1971,7 @@ bool wxWindowMSW::DoPopupMenu(wxMenu *menu, int x, int y) #if defined(__WXWINCE__) UINT flags = 0; #else - UINT flags = TPM_RIGHTBUTTON; + UINT flags = TPM_RIGHTBUTTON | TPM_RECURSE; #endif ::TrackPopupMenu(hMenu, flags, point.x, point.y, 0, hWnd, NULL); @@ -2596,22 +2610,22 @@ WXLRESULT wxWindowMSW::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM l if (IsContextMenuEnabled() && message == WM_LBUTTONDOWN) { SHRGINFO shrgi = {0}; - + shrgi.cbSize = sizeof(SHRGINFO); shrgi.hwndClient = (HWND) GetHWND(); shrgi.ptDown.x = x; shrgi.ptDown.y = y; - + shrgi.dwFlags = SHRG_RETURNCMD; // shrgi.dwFlags = SHRG_NOTIFYPARENT; - + if (GN_CONTEXTMENU == ::SHRecognizeGesture(&shrgi)) { wxPoint pt(x, y); pt = ClientToScreen(pt); - + wxContextMenuEvent evtCtx(wxEVT_CONTEXT_MENU, GetId(), pt); - + evtCtx.SetEventObject(this); if (GetEventHandler()->ProcessEvent(evtCtx)) { @@ -5366,10 +5380,10 @@ int wxCharCodeMSWToWX(int keySym, WXLPARAM lParam) // handle extended keys case VK_PRIOR: - id = ChooseNormalOrExtended(lParam, WXK_NUMPAD_PRIOR, WXK_PRIOR); + id = ChooseNormalOrExtended(lParam, WXK_NUMPAD_PAGEUP, WXK_PAGEUP); break; case VK_NEXT: - id = ChooseNormalOrExtended(lParam, WXK_NUMPAD_NEXT, WXK_NEXT); + id = ChooseNormalOrExtended(lParam, WXK_NUMPAD_PAGEDOWN, WXK_PAGEDOWN); break; case VK_END: id = ChooseNormalOrExtended(lParam, WXK_NUMPAD_END, WXK_END); @@ -5421,8 +5435,8 @@ WXWORD wxCharCodeWXToMSW(int id, bool *isVirtual) case WXK_ALT: keySym = VK_MENU; break; case WXK_PAUSE: keySym = VK_PAUSE; break; case WXK_CAPITAL: keySym = VK_CAPITAL; break; - case WXK_PRIOR: keySym = VK_PRIOR; break; - case WXK_NEXT : keySym = VK_NEXT; break; + case WXK_PAGEUP: keySym = VK_PRIOR; break; + case WXK_PAGEDOWN: keySym = VK_NEXT; break; case WXK_END: keySym = VK_END; break; case WXK_HOME : keySym = VK_HOME; break; case WXK_LEFT : keySym = VK_LEFT; break;