Index: System.Windows.Forms/Control.cs =================================================================== --- System.Windows.Forms/Control.cs (revision 74849) +++ System.Windows.Forms/Control.cs (working copy) @@ -4282,11 +4282,16 @@ } if (IsHandleCreated) { - XplatUI.SetVisible(Handle, is_visible, true); - // Explicitly move Toplevel windows to where we want them; - // apparently moving unmapped toplevel windows doesn't work - if (is_visible && (this is Form)) { - XplatUI.SetWindowPos(window.Handle, bounds.X, bounds.Y, bounds.Width, bounds.Height); + XplatUI.SetVisible (Handle, is_visible, true); + + if (is_visible && this is Form) { + // If we are Min or Max, we won't get a WM_SHOWWINDOW from SetWindowState, + // so we need to manually create our children, and set them visible + // (This normally happens in WmShowWindow.) + if ((this as Form).WindowState != FormWindowState.Normal) + OnVisibleChanged (EventArgs.Empty); + else + XplatUI.SetWindowPos(window.Handle, bounds.X, bounds.Y, bounds.Width, bounds.Height); } } else { @@ -4901,13 +4906,14 @@ private void WmShowWindow (ref Message m) { if (m.WParam.ToInt32() != 0) { - CreateControl (); - /* if we're being shown, make sure our child controls all have their handles created */ - Control [] controls = child_controls.GetAllControls (); - for (int i=0; i