nShowCmd = SW_HIDE;
}
+ // we only set pending size if we're maximized before being shown, now that
+ // we're shown we don't need it any more (it is reset in size event handler
+ // for child windows but we have to do it ourselves for this parent window)
+ //
+ // make sure to reset it before actually showing the window as this will
+ // generate WM_SIZE events and we want to use the correct client size from
+ // them, not the size returned by WM_NCCALCSIZE in DoGetClientSize() which
+ // turns out to be wrong for maximized windows (see #11762)
+ m_pendingSize = wxDefaultSize;
+
DoShowWindow(nShowCmd);
#if defined(__WXWINCE__) && (_WIN32_WCE >= 400 && !defined(__POCKETPC__) && !defined(__SMARTPHONE__))
frame->GetMenuBar()->AddAdornments(GetWindowStyleFlag());
#endif
- // we only set pending size if we're maximized before being shown, now that
- // we're shown we don't need it any more (it is reset in size event handler
- // for child windows but we have to do it ourselves for this parent window)
- m_pendingSize = wxDefaultSize;
-
return true;
}
if ( m_pendingSize != wxDefaultSize )
{
// we need to calculate the client size corresponding to pending size
+ //
+ // FIXME: Unfortunately this doesn't work correctly for the maximized
+ // top level windows, the returned values are too small (e.g.
+ // under Windows 7 on a 1600*1200 screen with task bar on the
+ // right the pending size for a maximized window is 1538*1200
+ // and WM_NCCALCSIZE returns 1528*1172 even though the correct
+ // client size of such window is 1538*1182). No idea how to fix
+ // it though, setting WS_MAXIMIZE in GWL_STYLE before calling
+ // WM_NCCALCSIZE doesn't help and AdjustWindowRectEx() doesn't
+ // work in this direction neither. So we just have to live with
+ // the slightly wrong results and relayout the window when it
+ // gets finally shown in its maximized state (see #11762).
RECT rect;
rect.left = m_pendingPosition.x;
rect.top = m_pendingPosition.y;