【问题标题】:WinForm Controls + TransparencyWinForm 控件 + 透明度
【发布时间】:2011-01-21 08:03:46
【问题描述】:

不要被帖子的长度吓到,它应该非常简单。我只是想非常具体,因为当我之前解释问题时,很多人都误解了我。

我四处寻找解决方案,但没有找到我要找的东西。

我正在尝试在运行时动态添加的多个嵌套控件上设置透明度设置。我试过使用程序的整体透明颜色,但这似乎是在绘制控件之后绘制透明层。

我想要更多地控制哪些图层是透明的,所以我可以对面板、带有非矩形图像的 PictureBox 控件以及其他一些东西进行分层。我无法在 Paint() 事件中绘制图像(我已经在其他地方取得了巨大的成功),因为这些 PictureBox 具有单击、鼠标悬停、上下文菜单和其他相关内容。

所以有限制。

在下面的示例中,WinForm 应该模仿一本书,使用“标签”跳转到下一个“章节”,并在“书中”显示各种图形。下面的重要技术位。 Picture (slightly outdated)

FlowLayoutPanel FLP = 一个大的矩形面板。我希望它“完全透明”,因为它仅用于其 FlowLayout 功能,并且可以干净地移动/调整许多控件的大小。它包含以下控件。

1) Panel LeftTabs = 包含 LeftTabs 的面板。

2) 面板手册 = 包含大量子控件的面板。有背景图片(这里没有透明度问题,但子控件是个问题)。

3) Panel RightTabs = 包含 RightTabs 的面板。

***** 问题 1:透明标签面板 ***** 选项卡面板包含重叠的带有圆角的 PictureBox 控件 - 有点像归档文件夹选项卡。这些选项卡的缺失角显示下方控件的背景,而不是下一个进一步向下选项卡的图像。 在上图中,我仍然使用手工排列的 PictureBox,但现在我将选项卡移动到选项卡面板中,并且我希望 那些 的背景是透明的。

***** 问题 2:Book 面板中的子控件 ***** Book 面板控件包含 许多 个子面板(子层 1),这些 中的每一个都包含另一个 PictureBox 和数量不定的 NumericUpDown 控件(子层 2)。
NUD 很好,但 PictureBox (CL2) 有更多圆角。
面板 (CL1) 应该是完全透明的(仅将它们用于分组权力和逻辑),但这种透明度应该在 Book 面板级别停止。

希望这一切都说得通。 在放弃和解决这个问题之前,我过去尝试过无数次修复,但现在我决心正确地做到这一点。 我尝试更改控件的形状([control].Region),但该解决方案令人难以置信的混乱,并且使未来的更改(自定义皮肤)几乎不可能。

【问题讨论】:

  • 嗨,我看不到你的例子。请提供/
  • 你的意思是代码示例吗?我贴了一张图片,所以我只能假设这就是你想要的。我现在真的没有任何代码,因为我什至不知道如何开始尝试我想做的事情。目前,相关代码除了动态地将控件添加到其他控件之外什么都不做。我能想到的唯一其他相关的事情是我用于一些 PictureBox 控件的 Paint() 事件处理程序,但这些基本上只是一长串 e.Graphics.DrawImage() 命令。你能澄清你的问题吗?

标签: c# winforms transparency


【解决方案1】:

短版:

我找到了解决问题的方法。

这与使用控件的区域有关。

通过更改控件的区域,我设法伪造了一个功能透明系统。 它可能不是最有效或用户友好的方法,但它可以完成工作。

        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);
        }

【讨论】:

    猜你喜欢
    • 2011-08-31
    • 2010-10-30
    • 1970-01-01
    • 2012-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-15
    相关资源
    最近更新 更多