c# - 调整无边框窗体的大小,控件无处不在,没有空白区域

标签 c# winforms resize

我有一个将 FormBorderStyle 设置为 None 的程序。我一直在网上寻找并找到了一个用于调整表单大小的工作代码,但它仅在表单有空白且没有控件的情况下才有效。虽然我的整个表单充满了控件,每个边缘都有控件,但我无法在边缘腾出空间。有没有一种方法可以使用 Windows API 或其他方法来扩展调整大小控制,或者在 MouseDown 时使用控件来触发调整大小事件?

最佳答案

它可以通过不同的方式完成。这个答案的主要思想是将面板放在表单上作为内容容器,然后排除它的右下角区域(大小控制矩形),这样这个区域就不再属于面板,并且该矩形的所有鼠标事件都将被路由到表单,甚至面板也不会绘制该区域。

为此,请执行以下步骤:

  1. 创建 Form 并将 BorderStyle 属性设置为 None

  2. 在Form中添加一个Panel作为content holder,并将其Name设置为panel1,将panel的Dock属性设置为Fill

  3. 覆盖 OnSizeChanged的形式和设置面板的区域与形式相同的大小,然后排除其右下角。这样,排除的区域不再属于面板,所有消息包括 WM_NCHITTEST将由我们的 WndProc 接收;面板甚至不绘制该区域。

  4. 覆盖 WndProc获取 WM_NCHITTEST 消息,如果该点位于我们在 OnSizeChanges 中定义的区域中,则显示调整大小指针并准备调整大小。

  5. 覆盖 OnPaint绘制尺寸抓地力

截图:

enter image description here

这是在其容器面板中带有一些控件的表单:

enter image description here

如果将鼠标移到大小控制点上,您会看到鼠标指针变为右下大小指针,您可以使用它调整表单大小。

可以设置表单的MinimumSizeMaximumSize来防止太小或太大的表单难看。

代码:

完整代码如下:

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/

相关文章:

c# - MVC5 抛出 401 的 HttpException 返回 500

c# - 在 C# 中序列化 - 使用自己的格式?

c# - Windows 窗体调用 Web 服务但需要模拟不同的 Windows 用户

c# - 访问选择 winforms 组合框上的属性

c# - 外发光圆角 TextBox

c# - 从字符串中创建 JSON

c# - 如何在图片框上绘制并保存在 Winforms C# 中?

c# - 如何使用 XNA 调整窗口大小

text - JavaFX 使用窗口调整文本大小

c# - 嵌套 UserControl 的自动调整大小不起作用