gpt4 book ai didi

c# - 可拖动的 WinForm 问题

转载 作者:太空宇宙 更新时间:2023-11-03 19:36:59 24 4
gpt4 key购买 nike

我有一个窗口窗体,可以通过单击并拖动窗体的任何部分来移动它。我使用覆盖 WndProc 的方法,并将 NCHITTEST 函数的结果设置为 HTCAPTION,以欺骗表单以为我单击了标题 - 因此它启用了拖动。

此代码效果很好,如下所示:

protected override void WndProc(ref Message msg)
{
if (msg.Msg == (int)WinAPI.NCHITTEST)
{
DefWndProc(ref msg);
if ((int)msg.Result == (int)MousePositionCodes.HTCLIENT)
{
msg.Result = (IntPtr)MousePositionCodes.HTCAPTION;
return;
}
}
}
base.WndProc(ref msg);
}

当我将 ToolStripPanel 停靠到窗体中时出现问题(它充当可拖动的工具栏)。我需要 ToolStrip 未覆盖的 ToolStripPanel 的任何部分来传递使整个窗体进入拖动模式所需的消息。

我已经创建了自己的 ToolStripContainer 类来覆盖 WndProc 函数,并尝试使用与上面相同的函数,但是它导致 ToolStripContainer 表单中进入拖动模式,这不是我们想要的功能。

我还尝试将 NCHITTEST 消息传递给父级,以及使用当前鼠标坐标构建新消息并使用 WinAPI 和父级的窗口句柄将其发送给父级。

我必须在这里遗漏一些简单的东西......有人有任何想法吗?

最佳答案

尝试在您自己的 ToolStripContainer 的 WndProc 中测试 WM_NCHITTEST 返回 HTTRANSPARENT (-1) 作为您希望发生拖动的区域。这将导致消息链式上升到您处理它的表单并返回 HTCAPTION,因此发生拖动。

希望这对您有所帮助。

关于c# - 可拖动的 WinForm 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/927167/

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