我有一个自定义控件,我用作橡皮筋,涂上蓝色边框和半透明中间。我正在处理鼠标按下/移动事件以调整面板的大小。当调用鼠标移动事件时,一切似乎都能正常工作,它都按照我的预期绘制,但是当鼠标停止移动时,半透明度下面的某些自定义控件会重新绘制在顶部。使用z顺序无所事事。
这是透明面板:
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x00000020; //WS_EX_TRANSPARENT
return cp;
}
}
protected override void OnPaint(PaintEventArgs pe)
{
pe.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(128, 101, 135, 196)), this.ClientRectangle);
pe.Graphics.DrawRectangle(Pens.DarkBlue,
pe.ClipRectangle.Left,
pe.ClipRectangle.Top,
this.Width - 1,
this.Height - 1);
}
protected override void OnPaintBackground(PaintEventArgs pevent)
{
//do not allow the background to be painted
}
protected override void OnSizeChanged(EventArgs e)
{
base.OnSizeChanged(e);
}
答案 0 :(得分:0)
因此,事实证明这是一个非常难以解决的半透明问题(即使微软已经在资源管理器中完成了这个问题)。最后,我破解了一个解决方案,中间现在完全透明,橡皮筋只是一个边界。
边框仍然在某些控件下面绘制,因此对于每个控件,如果rubberBand可见,我们在其Paint事件中添加一个调用ruberBand.Invalidate()
的语句。嘿presto,一个被束缚在一起的橡皮筋,它在控制之上。
IMO这比使用DrawReversibleRectangle
更好,因为你可以在边缘的autoscrolling面板内使用它,而且它不会闪烁。