我正在尝试创建一个源自的半透明控件System.Windows.Forms.Panel
。 [编辑:基本上我想要实现的是这样的]:
我浏览了大量的网络文章以及SO问题,并提出了这个:
class SeeThroughPanel : Panel
{
public SeeThroughPanel()
{
}
protected override CreateParams CreateParams {
get {
var cp = base.CreateParams;
cp.ExStyle |= 0x00000020;
return cp;
}
}
protected override void OnPaint(PaintEventArgs e)
{
//base.OnPaint(e);
e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(50, 0, 0, 0)), this.ClientRectangle);
}
}
结果如下(请注意,此代码也不会使其真正半透明。该按钮以全色显示,与上图不同):
但是,一旦我执行的操作导致半透明面板边界内的任何其他控件重新绘制,它就会过度绘制(在这种情况下,我滚动了底层控件):
所以我的问题是,我怎样才能避免这种情况?那里has以某种方式。毕竟,网络浏览器一直在处理这种渲染。
我现在已经做了一些测试。
您将几个问题混为一谈,所以让我们将它们分开:
没有 WebBrowser 是使用 Winforms 用 C# 编写的。所以这并不是为什么这一定是可能的理由。
您的按钮几乎肯定不在表单的控件集合中。您需要编写脚本或使用一些 UI 技巧 (*) 将其放置在另一个控件上而不将其添加到其中。
当您滚动时,您将看到滚动控件报告的任何内容作为其表面。
这是两个屏幕截图:
启动后是这样的:
..这是我向右滚动一点之后的结果:
我使用此代码来确保 Z 顺序正确:
button1.Parent = this;
panel1.BringToFront();
button1.BringToFront();
seeThroughPanel1.BringToFront();
注意按钮的空间是如何节省的;这显示了旧表面的使用方式。
要解决此问题,您必须获取当前的表单表面(可能通过 Control.DrawToBitmap),然后使用其右侧部分来绘制“半透明”面板。当然,在捕获表单的当前表面之前,它必须隐藏。
在我有过的所有可怕的想法中,这似乎是最糟糕的之一。
* 技巧是用键盘将其移动到容器上,not鼠标;通过这个技巧,它只是移动而不改变其父容器。对于将控件放置在选项卡控件的选项卡顶部也很有用...但我太懒了,所以我编码了它..
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)