public void PerformNCCalc(CGSize newSize) { //FIXME! Should not reference Win32 variant here or NEED to do so. var ncp = new XplatUIWin32.NCCALCSIZE_PARAMS(); ncp.rgrc1 = new XplatUIWin32.RECT(0, 0, (int)newSize.Width, (int)newSize.Height); IntPtr ptr = Marshal.AllocHGlobal(Marshal.SizeOf(ncp)); Marshal.StructureToPtr(ncp, ptr, true); NativeWindow.WndProc(Handle, Msg.WM_NCCALCSIZE, (IntPtr)1, ptr); ncp = (XplatUIWin32.NCCALCSIZE_PARAMS)Marshal.PtrToStructure(ptr, typeof(XplatUIWin32.NCCALCSIZE_PARAMS)); Marshal.FreeHGlobal(ptr); var savedBounds = ClientBounds; ClientBounds = CGRect.FromLTRB(ncp.rgrc1.left, ncp.rgrc1.top, ncp.rgrc1.right, ncp.rgrc1.bottom); // Update subview locations var offset = new CGPoint(ClientBounds.X - savedBounds.X, ClientBounds.Y - savedBounds.Y); if (offset.X != 0 || offset.Y != 0) { foreach (var subView in Subviews) { subView.SetFrameOrigin(subView.Frame.Location.Move(offset.X, offset.Y)); } } }
public void PerformNCCalc(CGSize newSize) { //FIXME! Should not reference Win32 variant here or NEED to do so. XplatUIWin32.NCCALCSIZE_PARAMS ncp = new XplatUIWin32.NCCALCSIZE_PARAMS(); IntPtr ptr = Marshal.AllocHGlobal(Marshal.SizeOf(ncp)); Rectangle rect = new Rectangle(0, 0, (int)newSize.Width, (int)newSize.Height); ncp.rgrc1.left = rect.Left; ncp.rgrc1.top = rect.Top; ncp.rgrc1.right = rect.Right; ncp.rgrc1.bottom = rect.Bottom; Marshal.StructureToPtr(ncp, ptr, true); NativeWindow.WndProc(Handle, Msg.WM_NCCALCSIZE, (IntPtr)1, ptr); ncp = (XplatUIWin32.NCCALCSIZE_PARAMS)Marshal.PtrToStructure(ptr, typeof(XplatUIWin32.NCCALCSIZE_PARAMS)); Marshal.FreeHGlobal(ptr); var clientRect = new Rectangle(ncp.rgrc1.left, ncp.rgrc1.top, ncp.rgrc1.right - ncp.rgrc1.left, ncp.rgrc1.bottom - ncp.rgrc1.top); var savedBounds = ClientBounds; ClientBounds = clientRect.ToCGRect(); // Update subview locations var offset = new CGPoint(ClientBounds.X - savedBounds.X, ClientBounds.Y - savedBounds.Y); if (offset.X != 0 || offset.Y != 0) { foreach (var subView in Subviews) { var frameOrigin = subView.Frame.Location; frameOrigin.X += offset.X; frameOrigin.Y += offset.Y; subView.SetFrameOrigin(frameOrigin); } } }