Должен ли я получить WM_NCPAINT, когда нет зоны клиента?

Есть кое-что, что я хотел бы понять в моем пользовательском элементе управления. Я обрабатываю WM_NCCALCSIZE, чтобы установить клиентскую область на все окно, другими словами, нет неклиентской области. Я ожидал, что не получу WM_NCPAINT, но все равно получаю его каждый раз, когда изменяется размер окна. Вот мой код WndProc:

if (m.Msg == Win32Calls.WM_NCPAINT)
{
    // I don't know why WM_NCPAINT is sent when WM_NCCALCSIZE has stated that there is no client area, so here is my workaround to stop processing here
    if (Bounds.Size == ClientSize)
        return;

    // Draw borders if any

    if (handled)
        return;
}
else if (m.Msg == Win32Calls.WM_NCCALCSIZE)
{
    if (m.WParam != IntPtr.Zero)
    {
        Win32Calls.NCCALCSIZE_PARAMS csp;

        csp = (Win32Calls.NCCALCSIZE_PARAMS)Marshal.PtrToStructure(m.LParam, typeof(Win32Calls.NCCALCSIZE_PARAMS));
        Rectangle rect = new Rectangle(csp.rgrc0.Left, csp.rgrc0.Top,
            csp.rgrc0.Right - csp.rgrc0.Left, csp.rgrc0.Bottom - csp.rgrc0.Top);

        _drawManager.NcCalcSize(ref rect);

        csp.rgrc0.Left = rect.X;
        csp.rgrc0.Right = rect.X + rect.Width;
        csp.rgrc0.Top = rect.Y;
        csp.rgrc0.Bottom = rect.Y + rect.Height;
        Marshal.StructureToPtr(csp, m.LParam, false);
    }
}

Итак, когда происходит изменение размера, я проверил, и WM_NCCALCSIZE правильно получен, _drawManager.NcCalcSize не изменяет "прямоугольник", затем принимается WM_NCPAINT, и я обязан сравнить границы и клиентский прямоугольник, чтобы проверить, должна ли происходить какая-либо не-клиентская картина, Это нормально?

1 ответ

Я думаю, что это

1) Для Windows проще сделать это таким образом (без особого случая пропуска границы), и преимущество в том, что оно не отправляется, лишь незначительное увеличение производительности.
2) Теперь его нельзя изменить, поскольку некоторые программы требуют отправки сообщения, так как они делают слишком много в обработчике. И если вы прочитаете блог Раймонда Чена, вы поймете, насколько это важно для команды Windows API.

Другие вопросы по тегам