我想为我的无边界forms添加一个很好的阴影,我发现以最小的性能损失来实现的最好方法是使用DwmExtendFrameIntoClientArea 。 但是,这似乎导致Windows在窗口上画一个经典的标题栏,但它是无function的(即故障仅仅是graphics)。
这是我正在使用的代码:
int v = (int) DWMNCRENDERINGPOLICY.DWMNCRP_ENABLED; NativeApi.DwmSetWindowAttribute(Handle, DwmWindowAttribute.NCRENDERING_POLICY, ref v, sizeof(int)); int enable = 0; NativeApi.DwmSetWindowAttribute(Handle, DwmWindowAttribute.ALLOW_NCPAINT, ref enable, sizeof(int)); MARGINS margins = new MARGINS() { leftWidth = 0, topHeight = 0, rightWidth = 0, bottomHeight = 1 }; NativeApi.DwmExtendFrameIntoClientArea(Handle, ref margins);
我曾尝试将ALLOW_NCPAINT
设置为1,并且我甚至试图在窗口接收WM_NCPAINT
而不调用DefWndProc
时返回0,但是没有任何区别。
有没有办法解决这个奇怪的问题,同时仍然使用DwmExtendFrameIntoClientArea
?
非常感谢@Erik Philips,根据这个答案的建议我终于解决了这个问题 。 这个问题在CreateParams
:
/// <summary> /// Gets the parameters that define the initial window style. /// </summary> protected override CreateParams CreateParams { get { CreateParams cp = base.CreateParams; if (!DesignMode) { cp.ClassStyle |= (int) ClassStyle.DoubleClicks; cp.Style |= unchecked((int) (WindowStyle.Popup | WindowStyle.SystemMenu | WindowStyle.ClipChildren | WindowStyle.ClipSiblings)); cp.ExStyle |= (int) ExtendedWindowStyle.Layered; } return cp; } }
|
必须从cp.Style
删除:
protected override CreateParams CreateParams { get { CreateParams cp = base.CreateParams; if (!DesignMode) { cp.ClassStyle |= (int) ClassStyle.DoubleClicks; cp.Style = unchecked((int) (WindowStyle.Popup | WindowStyle.SystemMenu | WindowStyle.ClipChildren | WindowStyle.ClipSiblings)); cp.ExStyle |= (int) ExtendedWindowStyle.Layered; } return cp; } }
这解决了这个问题,显然WinForms默认添加了WS_BORDER
到类样式,即使FormBorderStyle
稍后被设置为None
。