1

我有一个 Windows 窗体,可以通过单击并拖动窗体的任何部分来移动它。我使用了覆盖 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 和父级的窗口句柄将其发送给父级。

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

4

1 回答 1

6

尝试在您自己的 ToolStripContainer 的 WndProc 中测试 WM_NCHITTEST 返回 HTTRANSPARENT (-1) 以用于您想要拖动的区域。这将导致消息在您处理它的表单中链式上升并返回 HTCAPTION 以便发生拖动。

希望这可以帮助。

于 2009-05-29T17:30:38.417 回答