防止Win32绘制经典标题栏
Prevent Win32 from drawing classic title bar
我想为我的无边界表单添加一个漂亮的阴影,我发现以最小的性能损失来实现它的最佳方法是使用 DwmExtendFrameIntoClientArea。然而,这似乎导致 Windows 在 window 上绘制一个经典的标题栏,但它是 non-functional(即故障仅仅是图形上的)。
这是我使用的代码:
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,我什至尝试在 window 接收到 WM_NCPAINT
而不调用 DefWndProc
时返回 0,但没有任何区别。
有没有办法在仍然使用 DwmExtendFrameIntoClientArea
的情况下解决这个奇怪的问题?
非常感谢@Erik Philips,我终于按照this answer的建议解决了这个问题。问题出在 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
添加到 class 样式,即使 FormBorderStyle
后来设置为 None
.
我想为我的无边界表单添加一个漂亮的阴影,我发现以最小的性能损失来实现它的最佳方法是使用 DwmExtendFrameIntoClientArea。然而,这似乎导致 Windows 在 window 上绘制一个经典的标题栏,但它是 non-functional(即故障仅仅是图形上的)。
这是我使用的代码:
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,我什至尝试在 window 接收到 WM_NCPAINT
而不调用 DefWndProc
时返回 0,但没有任何区别。
有没有办法在仍然使用 DwmExtendFrameIntoClientArea
的情况下解决这个奇怪的问题?
非常感谢@Erik Philips,我终于按照this answer的建议解决了这个问题。问题出在 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
添加到 class 样式,即使 FormBorderStyle
后来设置为 None
.