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
。不需要使用返回
。