不要被帖子的长度吓坏,应该非常简单。我只是想要非常特别,因为很多人在我之前解释过这个问题时误解了我。
我四处寻找解决方案,但我找不到我要找的东西。
我正在尝试在运行时动态添加的多个嵌套控件上设置透明度设置。我尝试过使用程序的整体透明色,但是在绘制控件之后,它似乎会绘制透明层。
我希望更多地控制哪些图层是透明的,因此我可以对图层,使用非矩形图像的PictureBox控件以及其他一些内容进行分层。我无法在Paint()事件中绘制图像(我在其他地方取得了巨大成功),因为这些PictureBox有点击,鼠标悬停,上下文菜单以及与之相关的其他内容。
所以有限制。
在下面的示例中,WinForm应该模仿一本书,“标签”跳转到下一个“章节”,各种图形显示在书中。以下重要技术部分。 Picture (slightly outdated)
FlowLayoutPanel FLP =一个大的矩形面板。我希望它“完全透明”,因为它仅用于其FlowLayout功能,并且可以干净地移动/调整大量控件。它包含以下控件。
1) Panel LeftTabs =包含LeftTabs的面板。
2) Panel Book =包含许多子控件的面板。有背景图像(此处没有透明度问题,但子控件有问题)。
3) Panel RightTabs =包含RightTabs的面板。
*****问题1:透明标签面板***** 选项卡面板包含带圆角的重叠PictureBox控件 - 有点像归档文件夹选项卡。这些选项卡的缺角显示下面控件的背景,而不是下一个下一个选项卡的图像。 在上面的图片中,我仍然使用手工排列的PictureBoxes,但现在我将标签移动到标签面板中,我希望那些的背景是透明的。
*****问题2:“书籍”面板中的子控件***** Book面板控件包含众多子面板(子图层1),每个那些包含另一个PictureBox和可变数量的NumericUpDown控件(子图层2)。 /> NUD很好,但PictureBox(CL2)有更多的圆角 面板(CL1)应该是完全透明的(仅用于分组功能和逻辑),但透明度应该在Book面板级别停止。
希望一切都有意义。 在放弃和克服问题之前,我曾经尝试了很多修复,但现在我决心做对了。 我尝试改变控件的形状([control] .Region),但是这个解决方案难以理解,使得未来的更改(自定义皮肤)几乎不可能。
答案 0 :(得分:2)
简短版本:
我找到了解决问题的方法。
它与使用控件的REGION有关。
通过改变控件的区域,我设法伪造了功能透明系统。 它可能不是最有效或用户友好的方法,但它可以完成工作。
int SizeW = this.Size.Width;
int SizeH = this.Size.Height;
int ArcSize = (int)((float)SizeW * 0.40 );
if (tabType == TabType.LeftTab)
{
//Make a six-sided polygon, a rectangle with the "outside" corners cut off.
//The next step will round the corners with Arcs
Point[] points = new Point[] {
new Point(SizeW, 0), new Point(ArcSize, 0),
new Point(0,ArcSize), new Point(0,SizeH-ArcSize),
new Point(ArcSize,SizeH), new Point(SizeW,SizeH)};
Byte[] bytes = new byte[] {
1, 1,
1, 1,
1, 1};
System.Drawing.Drawing2D.FillMode fm =
System.Drawing.Drawing2D.FillMode.Winding;
System.Drawing.Drawing2D.GraphicsPath tempGP =
new System.Drawing.Drawing2D.GraphicsPath(points, bytes, fm);
//add the arcs
ArcSize = ArcSize * 2;
tempGP.AddArc(0, 0, ArcSize, ArcSize, -90, -90);
tempGP.CloseFigure();
tempGP.AddArc(0, SizeH - ArcSize, ArcSize, ArcSize, 180, -90);
tempGP.CloseFigure();
Region tempRegion = new Region(tempGP);
this.Region = new Region(tempGP);
}