2011-06-09 91 views
3

使用C#WinForms我有一张表格,我在它上面绘制了一个渐变背景,从浅蓝色到深蓝色。我已经有一些按钮和一些标签,其中我已经尝试将背景颜色设置为透明,因为我希望背景能够显示 - 特别是对于标签,但这似乎不起作用。绘制表格上的透明控件

但我注意到,该绘画也是痛苦的标签,即使代码只在form_paint事件。

如何让标签不包含相同等级阴影,但要透明?例如表单顶部的标签将为浅蓝色,但底部的标签为深蓝色。

private void frmOptions_Paint(object sender, PaintEventArgs e) 
{ 
    e.Graphics.SmoothingMode = SmoothingMode.AntiAlias; 
    Rectangle rectangle = e.ClipRectangle; 

    using (Brush aBrush = new LinearGradientBrush(rectangle, Color.LightBlue, Color.DarkBlue, LinearGradientMode.Vertical)) 
    { 
     e.Graphics.FillRectangle(aBrush, rectangle); 
    } 
} 

非常感谢您的任何帮助。

编辑: 我刚刚被步进通过代码行调试它,发现油漆事件被称为为表单上的每个对象 - 标签&按钮,上面第2行的矩形有每次的大小。所以我现在非常困惑,为什么它会为窗体上的每个对象调用。

编辑2: 刚经过我的快速测试项目的分步执行代码(见下面的评论),并也注意到,油漆事件beening呼吁每个对象。不同之处在于测试项目没有“Rectangle rectangle = e.ClipRectangle;”这一行 - 它基本上使用表格的高度&。上面的代码将矩形设置为ClipRectangle - 这是每个标签的大小& button ...这是正常行为吗?如果是这样,那么它看起来像我需要由Reniuz下面的答案。

编辑3 我已经改变cliprectangle行“Rectangle rectangle = new Rectangle(0, 0, this.Width, this.Height);”这似乎使透明看看它是如何应该的,但是乳胶漆事件仍然被要求在表格上的每一个对象 - 好工作有只有7的,所以它的拉8次:(我想我还是会看“TransparentLabel”代码来测试

+0

您是否尝试过将这些标签的BackColor属性设置为Transparent?默认情况下,子控件继承父容器的可视属性... – 2011-06-09 15:19:58

+0

是的,标签和命令按钮的Backcolor属性设置为透明。 – harag 2011-06-09 15:25:30

+0

嗯。然后检查以确保只有表单已注册frmOptions_Paint处理程序。您的症状听起来像标签可能会附加此处理程序以及导致相同类型的绘画发生。 – 2011-06-09 15:27:51

回答

3

this文章看看

编辑:。

而且你可以使用这个代码:

public class TransparentLabel : Control 
{ 
    public TransparentLabel(Label label) 
    { 
     //setting default properties 
     this.Text = label.Text; 
     this.Font = label.Font; 
     this.Location = label.Location; 
     this.Size = label.Size; 
     this.Parent = label.Parent; 
     this.BringToFront(); 
     label.Dispose(); 

     TabStop = false; 
    } 

    protected override CreateParams CreateParams 
    { 
     get 
     { 
      CreateParams cp = base.CreateParams; 
      cp.ExStyle |= 0x20; 
      return cp; 
     } 
    } 

    protected override void OnPaintBackground(PaintEventArgs e) 
    { 
     // do nothing 
    } 

    protected override void OnPaint(PaintEventArgs e) 
    { 
     DrawText(); 
    } 

    protected override void WndProc(ref Message m) 
    { 
     base.WndProc(ref m); 
     if(m.Msg == 0x000F) 
     { 
      DrawText(); 
     } 
    } 

    private void DrawText() 
    { 
     using(Graphics graphics = CreateGraphics()) 
     using(SolidBrush brush = new SolidBrush(ForeColor)) 
     { 
      SizeF size = graphics.MeasureString(Text, Font); 

      // first figure out the top 
      float top = 0; 
      switch(textAlign) 
      { 
       case ContentAlignment.MiddleLeft: 
       case ContentAlignment.MiddleCenter: 
       case ContentAlignment.MiddleRight: 
        top = (Height - size.Height)/2; 
        break; 
       case ContentAlignment.BottomLeft: 
       case ContentAlignment.BottomCenter: 
       case ContentAlignment.BottomRight: 
        top = Height - size.Height; 
        break; 
      } 

      float left = -1; 
      switch(textAlign) 
      { 
       case ContentAlignment.TopLeft: 
       case ContentAlignment.MiddleLeft: 
       case ContentAlignment.BottomLeft: 
        if(RightToLeft == RightToLeft.Yes) 
         left = Width - size.Width; 
        else 
         left = -1; 
        break; 
       case ContentAlignment.TopCenter: 
       case ContentAlignment.MiddleCenter: 
       case ContentAlignment.BottomCenter: 
        left = (Width - size.Width)/2; 
        break; 
       case ContentAlignment.TopRight: 
       case ContentAlignment.MiddleRight: 
       case ContentAlignment.BottomRight: 
        if(RightToLeft == RightToLeft.Yes) 
         left = -1; 
        else 
         left = Width - size.Width; 
        break; 
      } 
      graphics.DrawString(Text, Font, brush, left, top); 
     } 
    } 

    public override string Text 
    { 
     get 
     { 
      return base.Text; 
     } 
     set 
     { 
      base.Text = value; 
      RecreateHandle(); 
     } 
    } 

    public override RightToLeft RightToLeft 
    { 
     get 
     { 
      return base.RightToLeft; 
     } 
     set 
     { 
      base.RightToLeft = value; 
      RecreateHandle(); 
     } 
    } 

    public override Font Font 
    { 
     get 
     { 
      return base.Font; 
     } 
     set 
     { 
      base.Font = value; 
      RecreateHandle(); 
     } 
    } 

    private ContentAlignment textAlign = ContentAlignment.TopLeft; 
    public ContentAlignment TextAlign 
    { 
     get { return textAlign; } 
     set 
     { 
      textAlign = value; 
      RecreateHandle(); 
     } 
    } 
} 

透明标签将取代现有的标签,所以你可以使用它像这样:

TransparentLabel transparentLabel1 = new TransparentLabel(label1); 
TransparentLabel transparentLabel2 = new TransparentLabel(label2); 

,然后你应该看到的结果(设计时就离开了,运行时间上右):

labels

+0

感谢您的详细文章和文章链接,明天我会在工作时看看这个。 – harag 2011-06-09 21:47:47