我有一个将 FormBorderStyle
设置为 None
的程序。我一直在网上寻找并找到了一个用于调整表单大小的工作代码,但它仅在表单有空白且没有控件的情况下才有效。虽然我的整个表单充满了控件,每个边缘都有控件,但我无法在边缘腾出空间。有没有一种方法可以使用 Windows API 或其他方法来扩展调整大小控制,或者在 MouseDown
时使用控件来触发调整大小事件?
最佳答案
它可以通过不同的方式完成。这个答案的主要思想是将面板放在表单上作为内容容器,然后排除它的右下角区域(大小控制矩形),这样这个区域就不再属于面板,并且该矩形的所有鼠标事件都将被路由到表单,甚至面板也不会绘制该区域。
为此,请执行以下步骤:
创建 Form 并将 BorderStyle 属性设置为 None
在Form中添加一个Panel作为content holder,并将其Name设置为panel1,将panel的Dock属性设置为Fill
覆盖
OnSizeChanged
的形式和设置面板的区域与形式相同的大小,然后排除其右下角。这样,排除的区域不再属于面板,所有消息包括WM_NCHITTEST
将由我们的WndProc
接收;面板甚至不绘制该区域。覆盖
WndProc
获取WM_NCHITTEST
消息,如果该点位于我们在OnSizeChanges
中定义的区域中,则显示调整大小指针并准备调整大小。覆盖
OnPaint
绘制尺寸抓地力
截图:
这是在其容器面板中带有一些控件的表单:
如果将鼠标移到大小控制点上,您会看到鼠标指针变为右下大小指针,您可以使用它调整表单大小。
可以设置表单的MinimumSize
和MaximumSize
来防止太小或太大的表单难看。
代码:
完整代码如下:
private int tolerance = 16;
private const int WM_NCHITTEST = 132;
private const int HTBOTTOMRIGHT = 17;
private Rectangle sizeGripRectangle;
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case WM_NCHITTEST:
base.WndProc(ref m);
var hitPoint = this.PointToClient(new Point(m.LParam.ToInt32() & 0xffff, m.LParam.ToInt32() >> 16));
if (sizeGripRectangle.Contains(hitPoint))
m.Result = new IntPtr(HTBOTTOMRIGHT);
break;
default:
base.WndProc(ref m);
break;
}
}
protected override void OnSizeChanged(EventArgs e)
{
base.OnSizeChanged(e);
var region = new Region(new Rectangle(0, 0, this.ClientRectangle.Width, this.ClientRectangle.Height));
sizeGripRectangle = new Rectangle(this.ClientRectangle.Width - tolerance, this.ClientRectangle.Height - tolerance, tolerance, tolerance);
region.Exclude(sizeGripRectangle);
this.panel1.Region = region;
this.Invalidate();
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
ControlPaint.DrawSizeGrip(e.Graphics, Color.Transparent, sizeGripRectangle);
}
关于c# - 调整无边框窗体的大小,控件无处不在,没有空白区域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32310319/