如何在WPF窗口中正确实现WM_NCCALCSIZE?

时间:2018-10-12 04:45:14

标签: .net wpf winapi window

我正在尝试在WPF中创建无边界窗口,并且正在处理WM_NCCALCSIZE本机窗口消息,以使客户区填充整个窗口。

但是,当窗口最大化时,它脱离了屏幕,好像正在考虑本机调整边​​框一样。为了解决这个问题,我设置了一个条件,在处理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消息错误吗?

0 个答案:

没有答案
相关问题