gpt4 book ai didi

c# - 无边框形式 C# 中的自定义调整大小句柄

转载 作者:可可西里 更新时间:2023-11-01 03:08:25 26 4
gpt4 key购买 nike

我正在尝试制作从工具栏中弹出的无边框表单。我希望用户能够捕获右下角(“调整大小 handle ”)并能够调整表单大小,但不能以任何其他方式调整表单大小或重新定位。

我听说我可以拦截发送到表单的 WM_NCHITTEST 消息并将其结果设置为 HTBOTTOMRIGHT,这将使操作系统处理表格,就好像它有一个相当大的框架。我的想法是检测鼠标指针是否进入了我在角落定义的框,如果进入了则返回 HTBOTTOMRIGHT 结果。

Graphic illustrating the resize handle

这并不像我预期的那样有效。我能够拦截消息,但似乎只有当用户将鼠标光标放在表单的 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 (!handled)
base.WndProc(ref m);
}

我做错了什么或者有更好的方法来做我想做的事吗?

非常感谢。

最佳答案

我一直在寻找类似的东西,安东的代码是一个很好的基础。这就是我最终从各个方面调整大小的工作。我不确定 Dictionary 是否是存储 hitboxes 的最佳方式,但我想这并不重要。

由于我的表单中充满了使用 Fill 作为 Dock 参数的控件,我只需要向 Form 添加一个 5px 的填充就可以很好地工作。

protected override void WndProc(ref Message m)
{
const UInt32 WM_NCHITTEST = 0x0084;
const UInt32 WM_MOUSEMOVE = 0x0200;

const UInt32 HTLEFT = 10;
const UInt32 HTRIGHT = 11;
const UInt32 HTBOTTOMRIGHT = 17;
const UInt32 HTBOTTOM = 15;
const UInt32 HTBOTTOMLEFT = 16;
const UInt32 HTTOP = 12;
const UInt32 HTTOPLEFT = 13;
const UInt32 HTTOPRIGHT = 14;

const int RESIZE_HANDLE_SIZE = 10;
bool handled = false;
if (m.Msg == WM_NCHITTEST || m.Msg == WM_MOUSEMOVE)
{
Size formSize = this.Size;
Point screenPoint = new Point(m.LParam.ToInt32());
Point clientPoint = this.PointToClient(screenPoint);

Dictionary<UInt32, Rectangle> boxes = new Dictionary<UInt32, Rectangle>() {
{HTBOTTOMLEFT, new Rectangle(0, formSize.Height - RESIZE_HANDLE_SIZE, RESIZE_HANDLE_SIZE, RESIZE_HANDLE_SIZE)},
{HTBOTTOM, new Rectangle(RESIZE_HANDLE_SIZE, formSize.Height - RESIZE_HANDLE_SIZE, formSize.Width - 2*RESIZE_HANDLE_SIZE, RESIZE_HANDLE_SIZE)},
{HTBOTTOMRIGHT, new Rectangle(formSize.Width - RESIZE_HANDLE_SIZE, formSize.Height - RESIZE_HANDLE_SIZE, RESIZE_HANDLE_SIZE, RESIZE_HANDLE_SIZE)},
{HTRIGHT, new Rectangle(formSize.Width - RESIZE_HANDLE_SIZE, RESIZE_HANDLE_SIZE, RESIZE_HANDLE_SIZE, formSize.Height - 2*RESIZE_HANDLE_SIZE)},
{HTTOPRIGHT, new Rectangle(formSize.Width - RESIZE_HANDLE_SIZE, 0, RESIZE_HANDLE_SIZE, RESIZE_HANDLE_SIZE) },
{HTTOP, new Rectangle(RESIZE_HANDLE_SIZE, 0, formSize.Width - 2*RESIZE_HANDLE_SIZE, RESIZE_HANDLE_SIZE) },
{HTTOPLEFT, new Rectangle(0, 0, RESIZE_HANDLE_SIZE, RESIZE_HANDLE_SIZE) },
{HTLEFT, new Rectangle(0, RESIZE_HANDLE_SIZE, RESIZE_HANDLE_SIZE, formSize.Height - 2*RESIZE_HANDLE_SIZE) }
};

foreach (KeyValuePair<UInt32, Rectangle> hitBox in boxes)
{
if (hitBox.Value.Contains(clientPoint))
{
m.Result = (IntPtr) hitBox.Key;
handled = true;
break;
}
}
}

if (!handled)
base.WndProc(ref m);
}

关于c# - 无边框形式 C# 中的自定义调整大小句柄,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17748446/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com