我想在无边界表单中添加漂亮的阴影,而发现这样做却将性能损失降至最低的最佳方法是使用DwmExtendFrameIntoClientArea。但是,这似乎导致Windows在窗口上绘制经典的标题栏,但是它不起作用(即,故障只是图形化的)。

c# - 防止Win32绘制经典标题栏-LMLPHP

这是我正在使用的代码:

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,我终于按照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添加到类样式中,即使FormBorderStyle之后又设置为None

关于c# - 防止Win32绘制经典标题栏,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46776425/

10-14 17:56