Есть кое-что, что я хотел бы понять в моем пользовательском элементе управления.Я обрабатываю 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 не изменяет "rect", затем WM_NCPAINT получен, и я обязансравните границы и клиентский прямоугольник, чтобы проверить, должна ли происходить рисование, не относящееся к клиенту.Это нормально?