Как правильно реализовать WM_NCCALCSIZE в окне WPF? - PullRequest
0 голосов
/ 12 октября 2018

Я пытаюсь создать окно без полей в 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?

...