我正在尝试在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
消息错误吗?