[英]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.