X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/cbab1556578ae39b1f00e0c4f6ca8016ac8124ac..9914bfbb77f48baf869b63aff58feb2b145ff4d3:/src/msw/window.cpp diff --git a/src/msw/window.cpp b/src/msw/window.cpp index 0ebb93aa59..da62175805 100644 --- a/src/msw/window.cpp +++ b/src/msw/window.cpp @@ -4224,6 +4224,8 @@ bool wxWindowMSW::HandleSetCursor(WXHWND WXUNUSED(hWnd), y = pt.y; ScreenToClient(&x, &y); wxSetCursorEvent event(x, y); + event.SetId(GetId()); + event.SetEventObject(this); bool processedEvtSetCursor = HandleWindowEvent(event); if ( processedEvtSetCursor && event.HasCursor() ) @@ -4739,7 +4741,7 @@ wxColour wxWindowMSW::MSWGetThemeColour(const wchar_t *themeName, int themePart, int themeState, MSWThemeColour themeColour, - wxSystemColour fallback) + wxSystemColour fallback) const { #if wxUSE_UXTHEME const wxUxThemeEngine* theme = wxUxThemeEngine::GetIfActive(); @@ -4763,7 +4765,7 @@ wxColour wxWindowMSW::MSWGetThemeColour(const wchar_t *themeName, wxFAIL_MSG(wxT("unsupported theme colour")); }; - wxUxThemeHandle hTheme(this, themeName); + wxUxThemeHandle hTheme((const wxWindow *)this, themeName); COLORREF col; HRESULT hr = theme->GetThemeColor ( @@ -4796,6 +4798,15 @@ wxColour wxWindowMSW::MSWGetThemeColour(const wchar_t *themeName, // painting // --------------------------------------------------------------------------- +// this variable is used to check that a paint event handler which processed +// the event did create a wxPaintDC inside its code and called BeginPaint() to +// validate the invalidated window area as otherwise we'd keep getting an +// endless stream of WM_PAINT messages for this window resulting in a lot of +// difficult to debug problems (e.g. impossibility to repaint other windows, +// lack of timer and idle events and so on) +extern bool wxDidCreatePaintDC; +bool wxDidCreatePaintDC = false; + bool wxWindowMSW::HandlePaint() { HRGN hRegion = ::CreateRectRgn(0, 0, 0, 0); // Dummy call to get a handle @@ -4810,11 +4821,20 @@ bool wxWindowMSW::HandlePaint() m_updateRegion = wxRegion((WXHRGN) hRegion); + wxDidCreatePaintDC = false; + wxPaintEvent event(m_windowId); event.SetEventObject(this); bool processed = HandleWindowEvent(event); + if ( processed && !wxDidCreatePaintDC ) + { + // do call MSWDefWindowProc() to validate the update region to avoid + // the problems mentioned above + processed = false; + } + // note that we must generate NC event after the normal one as otherwise // BeginPaint() will happily overwrite our decorations with the background // colour