C# 如何调整无边框MDI窗体的大小?

C# 如何调整无边框MDI窗体的大小?,c#,winforms,mdi,window-resize,C#,Winforms,Mdi,Window Resize,我想要这个: 基本上,如果BorderStyle设置为None并且isMDIContainer=false,则我的表单可以调整大小 但是,如果BordeStyle设置为None并且isMDICOntainer=true,如何使表单可调整大小 这是一个例子。您可以看到表单的大小可以调整得很好。但一旦MDI发挥作用,它就不再工作了 以下是当前代码: private const int cCaption = 62; private const int cGrip = 16; protected ov

我想要这个:

基本上,如果
BorderStyle
设置为
None
并且
isMDIContainer=false,则我的表单可以调整大小

但是,如果
BordeStyle
设置为
None
并且
isMDICOntainer=true
,如何使表单可调整大小

这是一个例子。您可以看到表单的大小可以调整得很好。但一旦MDI发挥作用,它就不再工作了

以下是当前代码:

private const int cCaption = 62;
private const int cGrip = 16;
protected override void OnPaint(PaintEventArgs e)
{
    Rectangle rc = new Rectangle(this.ClientSize.Width - cGrip, this.ClientSize.Height - cGrip, cGrip, cGrip);
    ControlPaint.DrawSizeGrip(e.Graphics, this.BackColor, rc);
        
    rc = new Rectangle(0, 0, this.ClientSize.Width, cCaption);
        
    // e.Graphics.FillRectangle(Brushes.Blue, rc);
}

protected override void WndProc(ref Message m)
{
    if (m.Msg == 0x84)
    {  // Trap WM_NCHITTEST
        Point pos = new Point(m.LParam.ToInt32());
        pos = this.PointToClient(pos);
        if (pos.Y < cCaption)
        {
            m.Result = (IntPtr)2;  // HTCAPTION
            return;
        }
        if (pos.X >= this.ClientSize.Width - cGrip && pos.Y >= this.ClientSize.Height - cGrip)
        {
            m.Result = (IntPtr)17; // HTBOTTOMRIGHT
            return;
        }
    }
    base.WndProc(ref m);
}
private const int ccoption=62;
私有常量int cGrip=16;
受保护的覆盖无效OnPaint(PaintEventArgs e)
{
矩形rc=新矩形(this.ClientSize.Width-cGrip,this.ClientSize.Height-cGrip,cGrip,cGrip);
ControlPaint.DrawSizeGrip(例如图形,此背景色,rc);
rc=新矩形(0,0,this.ClientSize.Width,cOption);
//e.图形。填充矩形(画笔。蓝色,rc);
}
受保护的覆盖无效WndProc(参考消息m)
{
如果(m.Msg==0x84)
{//Trap WM_NCHITTEST
点位置=新点(m.LParam.ToInt32());
pos=此点到客户端(pos);
如果(位置Y=this.ClientSize.Width-cGrip和&pos.Y>=this.ClientSize.Height-cGrip)
{
m、 结果=(IntPtr)17;//HTBOTTOMRIGHT
返回;
}
}
基准WndProc(参考m);
}

吉米的解释是正确的。
OnPaint
事件仅在主窗体上绘制您的
矩形
,而您看到的是
MdiClient
控件。此控件覆盖主窗体的背景(就像设置面板控件和设置
Dock=fill
),因此无法查看并单击右下角的矩形来调整大小

您可以查看并单击
矩形
来调整大小的一种方法是设置MainForm的填充,如下所示:

        protected override void OnClientSizeChanged(EventArgs e)
        {
            if (this.WindowState != lastState || lastState == FormWindowState.Normal)
            {
                lastState = this.WindowState;
                OnWindowStateChange(e);
            }
            base.OnClientSizeChanged(e);
        }

        private void OnWindowStateChange(EventArgs e)
        {
            if (WindowState == FormWindowState.Maximized)
            {
                Padding = new Padding(0);
            }
            else
            {
                Padding = new Padding(7);
            }
        }
因此,在正常窗口状态(非全屏)下,
MdiClient
不会覆盖mainform的所有表面

我发现这个颜色不好。因此,您可能希望更改主窗体的背景,使其与
MdiClient
的背景相匹配,或者使用此方法在窗体周围绘制
矩形,以便像正常情况一样调整大小


看到覆盖MDI父级客户端区域的灰色东西了吗?这是一个控件,它的类型是MdiClient。创建MdiClient后,表单不会收到任何与客户端区域相关的绘制事件(也不会收到任何
WM\u NCHITTEST
),这仅仅是因为您实际看到的是MdiClient容器,而不是MDI父背景。MdiClient有一个句柄,不过…顺便说一句,如果您决定使用NativeWindow来处理MdiClient事件(
WM_nChitter
WM_PAINT
),则必须切换
base.WndProc(ref m)的位置调用:将其移动到WndProc覆盖的顶部,并在
WM_PAINT
处理程序中设置
m.result=IntPtr.Zero
。不需要使用
返回