Как обрабатывать события мыши для панели с не-клиентской областью? - PullRequest
0 голосов
/ 11 апреля 2019

У меня есть панель, для которой я переопределил 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, хотя это мой предпочтительный метод, но мне нужно перехватывать события мыши, которые происходят в области, не являющейся клиентом.

Если кто-нибудь знает, как захватывать и обрабатывать события мыши, которые происходят в областях управления, не связанных с клиентом, в целом и, в частности, на панели, я был бы очень признателен.

Спасибо, Дэнни

...