我正在尝试制作从工具栏中弹出的无边框表单.我希望用户能够抓住右下角("调整大小句柄")并能够调整表单大小,但无法以任何其他方式调整表单大小或重新定位.
我听说我可以拦截WM_NCHITTEST发送到表单的消息,并设置其结果HTBOTTOMRIGHT,让操作系统处理重新调整表单的大小,就像它有一个相当大的框架一样.我的想法是检测鼠标指针是否已进入我在角落中定义的框,如果它已经,则返回HTBOTTOMRIGHT结果.

这并不像我预期的那样有效.我能够拦截消息,但似乎只有当用户将鼠标光标放在窗体的1px粗边框上时才会发送消息.这意味着它可以按照我想要的方式工作,如果你将光标精确地放在右下角的边缘上.
这是我的WndProc覆盖:
protected override void WndProc(ref Message m)
{
const UInt32 WM_NCHITTEST = 0x0084;
const UInt32 HTBOTTOMRIGHT = 17;
const int RESIZE_HANDLE_SIZE = 40;
bool handled = false;
if (m.Msg == WM_NCHITTEST)
{
Size formSize = this.Size;
Point screenPoint = new Point(m.LParam.ToInt32());
Point clientPoint = this.PointToClient(screenPoint);
Rectangle hitBox = new Rectangle(formSize.Width - RESIZE_HANDLE_SIZE, formSize.Height - RESIZE_HANDLE_SIZE, RESIZE_HANDLE_SIZE, RESIZE_HANDLE_SIZE);
if (hitBox.Contains(clientPoint))
{
m.Result = (IntPtr)HTBOTTOMRIGHT;
handled = true;
}
}
if …Run Code Online (Sandbox Code Playgroud) 我希望用户在右下角调整无边框窗口的大小,就像我可以调整组合框控件的自动完成窗口一样.
我无法找到以这种方式配置表单的属性.
也许有人可以帮我解决这个问题.
可以在这里找到一张图片:

可能重复:
C# - 使无边框形式可移动?
我通过设置在C#中创建了一个没有边框的表单
this.FormBorderStyle = FormBorderStyle.None;
现在,问题是如何用鼠标拖动它?
我想创建一个没有标题栏的表单,同时保留边框,这样我仍然可以调整大小并捕捉它。设置FormBorderStyle为None可以,但它会破坏边界。
在 Google 搜索了一下后,我多次遇到一种方法,也在这里:设置ControlBox为False以及Text空字符串似乎在旧版本的 Windows 上有效,在 Windows 10 上,但它看起来像这样:
请注意顶部丑陋的栏,我想将其删除。我发现的所有其他解决方案 - 例如覆盖 WndProc - 要么根本不起作用,要么也删除了边框。
编辑:白色栏位于非客户区域,它是删除窗口按钮和标题文本后标题栏剩下的内容。
我使用 c# 创建了一个无边框表单,但可以使自定义标题栏可移动,因此我搜索互联网并找到了以下代码:
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
if (m.Msg == WM_NCHITTEST)
m.Result = (IntPtr)(HT_CAPTION);
}
private const int WM_NCHITTEST = 0x84;
private const int HT_CLIENT = 0x1;
private const int HT_CAPTION = 0x2;
Run Code Online (Sandbox Code Playgroud)
应用此代码后,可以在除标题栏之外的表单的每一英寸中单击并拖动我的表单。
我在 C# 中有无边框的简单 win 表单。现在我想在表单状态为 时使用鼠标调整表单大小WindowState = FormWindowState.Normal。调整大小行为应该与带边框的正常形式相同。
我用了this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
附上表格图片供参考。
请建议我执行此任务的最佳方法。要求具有无边框形式。因为表单 UI 应该像平面 UI 一样。