X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/fc32cd4a59dc7c6cedea430750b2ce2c2a342353..4b60ad0d8c1ea4f840ad0b9b7c11270322634394:/src/msw/window.cpp diff --git a/src/msw/window.cpp b/src/msw/window.cpp index 65fafd055a..1331e0e476 100644 --- a/src/msw/window.cpp +++ b/src/msw/window.cpp @@ -436,9 +436,6 @@ void wxWindowMSW::Init() m_childrenDisabled = NULL; m_frozenness = 0; - // wxWnd - m_hMenu = 0; - m_hWnd = 0; m_xThumbSize = 0; @@ -1145,11 +1142,16 @@ WXDWORD wxWindowMSW::MSWGetStyle(long flags, WXDWORD *exstyle) const // wxTopLevelWindow) should remove WS_CHILD in their MSWGetStyle() WXDWORD style = WS_CHILD; - if ( flags & wxCLIP_CHILDREN ) - style |= WS_CLIPCHILDREN; + // using this flag results in very significant reduction in flicker, + // especially with controls inside the static boxes (as the interior of the + // box is not redrawn twice) + style |= WS_CLIPCHILDREN; + + // it doesn't seem useful to use WS_CLIPSIBLINGS here as we officially + // don't support overlapping windows and it only makes sense for them and, + // presumably, gives the system some extra work (to manage more clipping + // regions), so avoid it alltogether - if ( flags & wxCLIP_SIBLINGS ) - style |= WS_CLIPSIBLINGS; if ( flags & wxVSCROLL ) style |= WS_VSCROLL; @@ -1254,7 +1256,7 @@ void wxWindowMSW::OnInternalIdle() // changed by the time the OnInternalIdle function is called, so 'state' // may be meaningless. int state = 0; - if ( wxIsShiftDown() ) + if ( wxIsShiftDown() ) state |= MK_SHIFT; if ( wxIsCtrlDown() ) state |= MK_CONTROL; @@ -1528,7 +1530,8 @@ void wxWindowMSW::DoMoveWindow(int x, int y, int width, int height) width = 0; if (height < 0) height = 0; - if ( !::MoveWindow(GetHwnd(), x, y, width, height, IsShown() /*Repaint?*/) ) + + if ( !::MoveWindow(GetHwnd(), x, y, width, height, TRUE) ) { wxLogLastError(wxT("MoveWindow")); } @@ -1873,8 +1876,21 @@ bool wxWindowMSW::MSWProcessMessage(WXMSG* pMsg) case VK_ESCAPE: { #if wxUSE_BUTTON - wxButton *btn = wxDynamicCast(FindWindow(wxID_CANCEL), - wxButton); + wxButton *btn = wxDynamicCast(FindWindow(wxID_CANCEL),wxButton); + + // our own wxLogDialog should react to Esc + // without Cancel button but this is a private class + // so let's try recognize it by content + #if wxUSE_LOG_DIALOG + if ( !btn && + wxDynamicCast(this,wxDialog) && + FindWindow(wxID_MORE) && + FindWindow(wxID_OK) && + !FindWindow(wxID_CANCEL) && + GetTitle().MakeLower().StartsWith(wxTheApp->GetAppName().c_str()) + ) + btn = wxDynamicCast(FindWindow(wxID_OK),wxButton); + #endif // wxUSE_LOG_DIALOG if ( btn && btn->IsEnabled() ) { // if we do have a cancel button, do press it @@ -1915,7 +1931,7 @@ bool wxWindowMSW::MSWProcessMessage(WXMSG* pMsg) bProcess = false; } // FIXME: this should be handled by - // wxNavigationKeyEvent handler and not here!! + // wxNavigationKeyEvent handler and not here! else { #if wxUSE_BUTTON @@ -2224,11 +2240,16 @@ WXLRESULT wxWindowMSW::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM l (void)HandleDestroy(); break; + case WM_SIZE: + processed = HandleSize(LOWORD(lParam), HIWORD(lParam), wParam); + break; + case WM_MOVE: processed = HandleMove(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)); break; #if !defined(__WXWINCE__) + // TODO: move those in WM_WINDOWPOSCHANGING case above case WM_MOVING: { LPRECT pRect = (LPRECT)lParam; @@ -2246,13 +2267,7 @@ WXLRESULT wxWindowMSW::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM l } } break; -#endif - case WM_SIZE: - processed = HandleSize(LOWORD(lParam), HIWORD(lParam), wParam); - break; - -#if !defined(__WXWINCE__) case WM_SIZING: { LPRECT pRect = (LPRECT)lParam; @@ -2270,7 +2285,7 @@ WXLRESULT wxWindowMSW::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM l } } break; -#endif +#endif // !__WXWINCE__ #if !defined(__WXMICROWIN__) && !defined(__WXWINCE__) case WM_ACTIVATEAPP: @@ -4046,9 +4061,11 @@ WXHBRUSH wxWindowMSW::MSWGetSolidBgBrushForChild(wxWindow *child) return 0; } -wxColour wxWindowMSW::MSWGetBgColourForChild(wxWindow * WXUNUSED(child)) +wxColour wxWindowMSW::MSWGetBgColourForChild(wxWindow *child) { - return m_hasBgCol ? GetBackgroundColour() : wxNullColour; + return m_inheritBgCol || (m_hasBgCol && child == this) + ? GetBackgroundColour() + : wxNullColour; } WXHBRUSH wxWindowMSW::MSWGetBgBrushForSelf(wxWindow *parent, WXHDC hDC) @@ -4060,13 +4077,17 @@ WXHBRUSH wxWindowMSW::MSWGetBgBrush(WXHDC hDC) { for ( wxWindow *win = (wxWindow *)this; win; win = win->GetParent() ) { - // background is not inherited beyond the containing TLW - if ( win->IsTopLevel() ) - break; - WXHBRUSH hBrush = MSWGetBgBrushForSelf(win, hDC); if ( hBrush ) return hBrush; + + // background is not inherited beyond the windows which have their own + // fixed background such as top level windows and notebooks and for + // windows for which a custom colour had been explicitly set with + // SetOwnBackgroundColour() and so shouldn't affect its children + if ( win->ProvidesBackground() || + (win->m_hasBgCol && !win->m_inheritBgCol) ) + break; } return 0;