可拖动的WinForm问题

时间:2009-05-29 17:24:22

标签: c# .net winforms winapi wndproc

我有一个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和父级窗口句柄将其发送给父级。

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

1 个答案:

答案 0 :(得分:6)

尝试使用自己的ToolStripContainer的WndProc,在那里测试WM_NCHITTEST,为要进行拖动的区域返回HTTRANSPARENT(-1)。这将导致消息链接到您处理它的表单并返回HTCAPTION以便进行拖动。

希望这有帮助。