如何处理具有非客户区的面板的鼠标事件?

时间:2019-04-10 23:47:33

标签: c# winforms mouseevent panel nonclient-area

我有一个专门为WndProc覆盖的面板。我正在处理WM_NCCALCSIZE中的WndProc,以提供非客户区域作为边界,现在希望处理非客户区域内发生的鼠标事件。

我已经尝试处理WM_NCMOUSEMOVE消息,但是面板似乎从未收到此消息。我还尝试了其他“非客户”区域的“鼠标消息”,但这些都不起作用。客户端区域鼠标消息的方式一切正常。

protected RECT ResizeClient(RECT rc)
{
    rc.Top += 60;
    rc.Left += 30;
    rc.Right -= 30;
    rc.Bottom -= 30;

    return (rc);
}

protected override void WndProc(ref Message m)
{
    if (m.Msg == WinAPI.WM_NCCALCSIZE)
    {
        MessageBox.Show("Client Area.");
        if (m.WParam.ToInt32() == 0)
        {
            RECT rc = (RECT)(m.GetLParam(typeof(RECT)));
            rc = ResizeClient(rc);
            Marshal.StructureToPtr(rc, m.LParam, true);
        }
        else
        {
            NCCALCSIZE_PARAMS ncc = (NCCALCSIZE_PARAMS)(m.GetLParam(typeof(NCCALCSIZE_PARAMS)));
            ncc.rgrc0 = ResizeClient(ncc.rgrc0);
            Marshal.StructureToPtr(ncc, m.LParam, true);
        }
        m.Result = IntPtr.Zero;
    }

    if (m.Msg == WinAPI.WM_NCMOUSEMOVE)
    {
        MessageBox.Show("Mouse Move");
    }

    base.WndProc(ref m);
}

我不需要处理WndProc中的这些Mouse事件,尽管这是我的首选方法,但是我确实需要捕获非客户区域中发生的Mouse Events。

如果有人知道如何捕获和处理一般在非客户控制区域(尤其是面板)中发生的鼠标事件,我将不胜感激。

感谢丹尼

0 个答案:

没有答案