用于tabcontrol的透明背景在windows窗体中

时间:2011-04-25 01:42:53

标签: windows windows-mobile compact-framework

我正在尝试在紧凑的框架中自定义tabcontrol但我找不到此控件的设置透明背景的解决方案。我试图覆盖“OnPaintBackground()”方法开始设置背景但不调用此函数。如何在控件创建时使用此函数进行调用?

2 个答案:

答案 0 :(得分:1)

编辑:我读到了关于尝试设置容器背景颜色的评论,而不是单个标签,我做了一些实验和研究。

TabControl类的OnDrawItem方法似乎用于绘制选项卡“headers”(包含每个选项卡文本的控件部分,用户单击以选择选项卡),以及容器(除了选定选项卡的内容之外的所有内容,由选项卡本身在其OnPaintBackground方法中绘制)。

您可以通过覆盖其OnDrawItem方法使TabControl的背景透明,但只需填充DrawItemEventArgs传递的边界也会使标签标题透明,使其无法点击(点击将通过表单,在其后面的任何内容上)。

我看到它的方式,你有几个选择来尝试解决这个问题:

  1. 清除传递给OnDrawItem的边界,然后手动重绘每个TabPage的标题。这是一个痛苦,因为没有办法获得每个标签的标题而不使用页面的文本,字体大小,边框以及谁知道还有什么来手动计算它。似乎没有任何公开的API可以单独从TabControl的背景中绘制TabPages的标题。
  2. 不要让TabControl的背景和TabPages的标题完全透明,而只是使它们半透明,让标题可以点击。这可能看起来不那么漂亮,但它比第一个选项容易得多。为此,您需要将表单的AllowTransparency属性设置为true,然后使用以下代码:
  3.     class TransparentisTabControl : TabControl
        {
            //Without declaring this as new, you'd probably get a warning saying this property hides a member of the base class.
            //The base class's BackColor property, as I'm sure you've found out,
            //is hidden with attributes anyway, so it doesn't really matter.
            public new Color BackColor {get; set;}
    
            public TransparentishTabControl(Color backColor)
            {
                if (backColor.A == 0)
                    throw new ArgumentException("The alpha component of backColor cannot be zero, or this TransparentisTabControl's tab pages won't be selectable.");
                BackColor = backColor;
            }
    
            protected override void OnDrawItem(DrawItemEventArgs e)
            {
                base.OnDrawItem(fake);
                e.Graphics.Clear(BackColor);
            }
        }
    

    此代码适用于我,但在目标平台上可能会有不同的行为。如果您需要更多帮助/澄清,请告诉我:))

    您是否尝试使标签控件透明,或单个标签页?在TabControl-derrived类中重写OnPaintBackground是不够的,因为每个TabPage也会自行绘制。您需要一个派生自TabPage的自定义类,并重写OnPaintBackground。

        class TransparentTabPage : TabPage
        {
            public TransparentTabPage()
                : base("TransparentTabPage")
            {
    
            }
    
            protected override void OnPaintBackground(PaintEventArgs e)
            {
                base.OnPaintBackground(e);
    
                Form form = FindForm();
    
                e.Graphics.CompositingMode = CompositingMode.SourceCopy;
                using (SolidBrush sb = new SolidBrush(form.TransparencyKey))
                    e.Graphics.FillRectangle(sb, Bounds);
            }
        }
    

    为此,您的表单需要将其TransparencyKey设置为某个值,并且其AllowTransparency属性的值必须为true。

答案 1 :(得分:1)

我无法在tabcontrol中找到ondrowitem来覆盖它。 Windows CE环境(smartDevice)不支持Windows窗体中的所有功能