2011-06-09 88 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