Я пытаюсь создать окно без полей в WPF и обрабатываю сообщение WM_NCCALCSIZE
native window, чтобы клиентская область заполняла все окно.
Однако, когда окно развернуто,он выходит из экрана, как если бы он рассматривал собственные границы изменения размера.Чтобы решить эту проблему, я установил условие, которое учитывает эти границы при обработке WM_NCCALCSIZE
, и, похоже, оно работает довольно хорошо.Проблема в том, что когда я восстанавливаю развернутое окно, оно падает вниз примерно на 16 пикселей по вертикали после восстановления.Как ни странно, он скачет «периодически», когда я развертываю и восстанавливаю окно.
Прямо сейчас мой код, обрабатывающий WM_NCCALCSIZE
, выглядит следующим образом:
private IntPtr WM_NcCalcSize(WmParams parameters)
{
bool wParamBool = parameters.WParam.ToInt32() != 0;
if (wParamBool && UseCustomFrame)
{
NCCALCSIZE_PARAMS calcSize = (NCCALCSIZE_PARAMS)Marshal
.PtrToStructure(parameters.LParam, typeof(NCCALCSIZE_PARAMS));
// Get the desktop work area in device coordinates.
RECT workArea = Dpi.ToDeviceWin32(SystemParameters.WorkArea);
// If the suggested window rectangle contains the work area rectangle
// inside of it, the window is likely maximized. If this is the case,
// set the work area as the client rectangle.
if (calcSize.Rectangles[0].Contains(workArea))
{
calcSize.Rectangles[0] = workArea;
}
Marshal.StructureToPtr(calcSize, parameters.LParam, true);
parameters.Handled = true;
return new IntPtr((int)(WVR.REDRAW));
}
return IntPtr.Zero;
}
Я могу 'Кажется, это не является источником проблемы.Я не обрабатываю никаких других оконных сообщений, и эта проблема возникает, только если я изменяю calcSize.Rectangles[0]
, чтобы установить его в положение и размер области рабочего стола.
Я неправильно обрабатываю сообщение WM_NCCALCSIZE
?