gpt4 book ai didi

c# - 创建半透明面板/控件。有万无一失的方法吗?

转载 作者:太空狗 更新时间:2023-10-30 01:04:09 25 4
gpt4 key购买 nike

我正在尝试创建一个派生自 System.Windows.Forms.Panel 的半透明控件。 [编辑:基本上我想要实现的是这个]:

enter image description here

我浏览了大量的网络文章以及 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);
}
}

结果如下(请注意,此代码也不会使其真正半透明。按钮以全彩色显示,与上图不同):

Custom control shows transparency as expected.

但是,一旦我做了一些导致重绘半透明面板边界内的任何其他控件的事情,它就会被 overdraw (在这种情况下,我已经滚动了底层控件):

Custom control incorrectly repainted.

所以我的问题是,我该如何避免这种情况? 必须有某种方式。毕竟,网络浏览器一直在处理这种渲染。

最佳答案

我现在已经做了一些测试。

您正在将多个问题混合为一个问题,所以让我们将它们分开:

  • 没有 WebBrowser 是使用 Winforms 用 C# 编写的。所以这不是为什么这必须成为可能的原因。

  • 您的按钮几乎可以肯定不在窗体的控件集合中。您需要将其编写为脚本或使用一些 UI 技巧 (*) 将其放置在另一个控件上而不将其添加到它。

  • 滚动时,您会看到滚动控件报告的任何内容。

这里有两个截图:

这是启动后的样子:

screenshot1

..这是在我向右滚动一点之后:

screenshot1

我已经使用这段代码来确保 Z 顺序是正确的:

button1.Parent = this;
panel1.BringToFront();
button1.BringToFront();
seeThroughPanel1.BringToFront();

注意按钮的空间是如何节省的;这显示了旧表面的使用情况。

要解决此问题,您必须获取当前的表单表面(可能通过 Control.DrawToBitmap),然后使用它的正确部分来绘制您的“半透明”面板。当然,在您捕获表单的当前表面之前,它必须隐藏起来。

在我有过的所有糟糕想法中,这似乎是最糟糕的想法之一..

* 诀窍是使用键盘而不是鼠标将其移动到容器上;而不是;有了这个技巧,它就可以移动而无需更改其父容器。对于将控件放置在 TabControl 的选项卡顶部也很有用...但是我太懒了,所以我编写了它..

关于c# - 创建半透明面板/控件。有万无一失的方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24592272/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com