X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/2c66581eaae92045864aa8d0ab80fc27f8725e52..96b2cbe8b39292fed91654ff0d1f4b1c16561acb:/src/msw/dialog.cpp diff --git a/src/msw/dialog.cpp b/src/msw/dialog.cpp index 64d7f61bc6..1b66274cc1 100644 --- a/src/msw/dialog.cpp +++ b/src/msw/dialog.cpp @@ -184,9 +184,14 @@ bool wxDialog::Create(wxWindow *parent, CreateToolBar(); #endif - if( HasFlag(wxRESIZE_BORDER) ) + if ( HasFlag(wxRESIZE_BORDER) ) + { CreateGripper(); + Connect(wxEVT_CREATE, + wxWindowCreateEventHandler(wxDialog::OnWindowCreate)); + } + return true; } @@ -256,13 +261,15 @@ bool wxDialog::Show(bool show) if ( show ) { - // dialogs don't get WM_SIZE message after creation unlike most (all?) - // other windows and so could start their life non laid out correctly - // if we didn't call Layout() from here + // dialogs don't get WM_SIZE message from ::ShowWindow() for some + // reason so generate it ourselves for consistency with frames and + // dialogs in other ports // // NB: normally we should call it just the first time but doing it // every time is simpler than keeping a flag - Layout(); + const wxSize size = GetClientSize(); + ::SendMessage(GetHwnd(), WM_SIZE, + SIZE_RESTORED, MAKELPARAM(size.x, size.y)); } return true; @@ -276,7 +283,7 @@ void wxDialog::Raise() // show dialog modally int wxDialog::ShowModal() { - wxASSERT_MSG( !IsModal(), _T("wxDialog::ShowModal() reentered?") ); + wxASSERT_MSG( !IsModal(), _T("ShowModal() can't be called twice") ); m_endModalCalled = false; @@ -349,7 +356,7 @@ void wxDialog::SetWindowStyleFlag(long style) { wxDialogBase::SetWindowStyleFlag(style); - if( HasFlag(wxRESIZE_BORDER) ) + if ( HasFlag(wxRESIZE_BORDER) ) CreateGripper(); else DestroyGripper(); @@ -357,13 +364,15 @@ void wxDialog::SetWindowStyleFlag(long style) void wxDialog::CreateGripper() { - if( !m_hGripper ) + if ( !m_hGripper ) { + // just create it here, it will be positioned and shown later m_hGripper = (WXHWND)::CreateWindow ( wxT("SCROLLBAR"), wxT(""), - WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | + WS_CHILD | + WS_CLIPSIBLINGS | SBS_SIZEGRIP | SBS_SIZEBOX | SBS_SIZEBOXBOTTOMRIGHTALIGN, @@ -373,9 +382,6 @@ void wxDialog::CreateGripper() wxGetInstance(), NULL ); - - // position the gripper correctly after creation - ResizeGripper(); } } @@ -383,6 +389,11 @@ void wxDialog::DestroyGripper() { if ( m_hGripper ) { + // we used to have trouble with gripper appearing on top (and hence + // overdrawing) the other, real, dialog children -- check that this + // isn't the case automatically + wxASSERT_MSG( ::GetNextWindow((HWND)m_hGripper, GW_HWNDNEXT) == 0, + _T("Bug in wxWidgets: gripper should be at the bottom of Z-order") ); ::DestroyWindow((HWND) m_hGripper); m_hGripper = 0; } @@ -392,6 +403,9 @@ void wxDialog::ShowGripper(bool show) { wxASSERT_MSG( m_hGripper, _T("shouldn't be called if we have no gripper") ); + if ( show ) + ResizeGripper(); + ::ShowWindow((HWND)m_hGripper, show ? SW_SHOW : SW_HIDE); } @@ -410,6 +424,19 @@ void wxDialog::ResizeGripper() SWP_NOACTIVATE); } +void wxDialog::OnWindowCreate(wxWindowCreateEvent& event) +{ + if ( m_hGripper && IsShown() && + event.GetWindow() && event.GetWindow()->GetParent() == this ) + { + // Put gripper below the newly created child window + ::SetWindowPos((HWND)m_hGripper, HWND_BOTTOM, 0, 0, 0, 0, + SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE); + } + + event.Skip(); +} + // ---------------------------------------------------------------------------- // wxWin event handlers // ---------------------------------------------------------------------------- @@ -501,10 +528,6 @@ WXLRESULT wxDialog::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lPar case SIZE_RESTORED: ShowGripper(true); - // fall through - - default: - ResizeGripper(); } }