繁体   English   中英

无边形上的忽隐忽现的阴影

[英]Flickering Shadow on Borderless Form

有没有一种方法可以为无边界表单创建阴影,当表单调整大小时该阴影不会闪烁? 现在,我正在使用CreateParams。

protected override CreateParams CreateParams
{
    get
    {
        const int CS_DROPSHADOW = 0x20000;
        CreateParams cp = base.CreateParams;
        cp.ClassStyle |= CS_DROPSHADOW;
        return cp;
    }
}

但是,当调整表单大小时,阴影部分变成白色,然后又回到阴影,闪烁。 表单的其余部分不是因为我使用了this.DoubleBuffered = true;
任何帮助表示赞赏,谢谢!

编辑
我通过使用SendMessage调整窗体的大小

private const int WM_NCLBUTTONDOWN = 0xa1;
SendMessage(handle, WM_NCLBUTTONDOWN, dir, 0);

dir是一个整数,该整数根据我要调整表单大小的方向而变化。

我认为您的问题是由您的实现导致的,因为该实现支持使用问题中发布的SendMessage进行自定义大小调整。 我尝试使用WndProc捕获消息WM_NCHITTEST来实现调整大小,并根据结果返回到鼠标位置。 调整顶部和左侧边缘的大小时,似乎没有太多闪烁,而其他边缘则完全没有闪烁。 因此,我认为您可以尝试以下代码,它对我有用:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        DoubleBuffered = true;
        FormBorderStyle = FormBorderStyle.None;
    }
    protected override CreateParams CreateParams
    {
        get
        {
            const int CS_DROPSHADOW = 0x20000;
            CreateParams cp = base.CreateParams;
            cp.ClassStyle |= CS_DROPSHADOW;
            return cp;
        }
    }
    protected override void WndProc(ref Message m)
    {
        if (m.Msg == 0x84) //WM_NCHITTEST = 0x84
        {
            int x = m.LParam.ToInt32() & 0xffff;
            int y = m.LParam.ToInt32() >> 16;
            int codex, codey;
            Point p = PointToClient(new Point(x, y));
            codey = p.Y < 5 ? 2 : p.Y > ClientSize.Height - 5 ? 1 : 0;
            codex = p.X < 5 ? 2 : p.X > ClientSize.Width - 5 ? 1 : 0;
            switch (codex + (codey<<2))
            {
                case 10://Top-Left
                    m.Result = (IntPtr)13;
                    return;
                case 8://Top
                    m.Result = (IntPtr)12;
                    return;
                case 9://Top-Right
                    m.Result = (IntPtr)14;
                    return;
                case 2://Left
                    m.Result = (IntPtr)10;
                    return;
                case 1://Right
                    m.Result = (IntPtr)11;
                    return;
                case 6://Bottom-Left
                    m.Result = (IntPtr)16;
                    return;
                case 4://Bottom
                    m.Result = (IntPtr)15;
                    return;
                case 5://Bottom-Right;
                    m.Result = (IntPtr)17;
                    return;
            }                
        }
        base.WndProc(ref m);
    }
}

请注意,请勿将您的自定义大小调整与SendMessage ,而应与上面的代码一起使用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM