2012-02-20 85 views
14

我目前正在開發一個簡單的圖像編輯工具,使用Winforms.NET 3.5(工作環境)。使控件透明

我有一個要求,當用戶點擊選擇工具按鈕時,會出現一個正方形(C#中的矩形),它們可以在100x100400x400之間縮放。我修正了這個問題 - 問題在於使矩形的背景變得透明。

我有點不清楚。如果透明度在.NET 3.5支持,我已經試過如下:

SetStyle(ControlStyles.SupportsTransparentBackColor, true); 
pnlSelectArea.BackColor = Color.Transparent; 
pnlSelectArea.ForeColor = Color.Transparent; 
selectArea1.BackColor = Color.Transparent; 
selectArea1.ForeColor = Color.Transparent; 

但這並沒有影響 - 任何建議,將不勝感激。

+0

入住這http://stackoverflow.com/questions/72994/net-windows-forms-transparent-control – papaiatis 2012-02-20 09:10:29

+0

感謝您的幫助 - 我無法將這些應用到我的解決方案,但我很欣賞這種努力。 – 2012-02-20 10:17:05

+0

您可以在帖子[here:](http://stackoverflow.com/a/34404064/1529012) – aleksandaril 2015-12-21 21:28:57

回答

42

這是我其中包含一個不透明性質特殊的控制,它100%的工作原理:

using System; 
using System.Collections; 
using System.ComponentModel; 
using System.ComponentModel.Design; 
using System.Drawing; 
using System.Windows.Forms; 
using System.Windows.Forms.Design; 

public class TranspCtrl : Control 
{ 
    public bool drag = false; 
    public bool enab = false; 
    private int m_opacity = 100; 

    private int alpha; 
    public TranspCtrl() 
    { 
     SetStyle(ControlStyles.SupportsTransparentBackColor, true); 
     SetStyle(ControlStyles.Opaque, true); 
     this.BackColor = Color.Transparent; 
    } 

    public int Opacity 
    { 
     get 
     { 
      if (m_opacity > 100) 
      { 
       m_opacity = 100; 
      } 
      else if (m_opacity < 1) 
      { 
       m_opacity = 1; 
      } 
      return this.m_opacity; 
     } 
     set 
     { 
      this.m_opacity = value; 
      if (this.Parent != null) 
      { 
       Parent.Invalidate(this.Bounds, true); 
      } 
     } 
    } 

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

    protected override void OnPaint(PaintEventArgs e) 
    { 
     Graphics g = e.Graphics; 
     Rectangle bounds = new Rectangle(0, 0, this.Width - 1, this.Height - 1); 

     Color frmColor = this.Parent.BackColor; 
     Brush bckColor = default(Brush); 

     alpha = (m_opacity * 255)/100; 

     if (drag) 
     { 
      Color dragBckColor = default(Color); 

      if (BackColor != Color.Transparent) 
      { 
       int Rb = BackColor.R * alpha/255 + frmColor.R * (255 - alpha)/255; 
       int Gb = BackColor.G * alpha/255 + frmColor.G * (255 - alpha)/255; 
       int Bb = BackColor.B * alpha/255 + frmColor.B * (255 - alpha)/255; 
       dragBckColor = Color.FromArgb(Rb, Gb, Bb); 
      } 
      else 
      { 
       dragBckColor = frmColor; 
      } 

      alpha = 255; 
      bckColor = new SolidBrush(Color.FromArgb(alpha, dragBckColor)); 
     } 
     else 
     { 
      bckColor = new SolidBrush(Color.FromArgb(alpha, this.BackColor)); 
     } 

     if (this.BackColor != Color.Transparent | drag) 
     { 
      g.FillRectangle(bckColor, bounds); 
     } 

     bckColor.Dispose(); 
     g.Dispose(); 
     base.OnPaint(e); 
    } 

    protected override void OnBackColorChanged(EventArgs e) 
    { 
     if (this.Parent != null) 
     { 
      Parent.Invalidate(this.Bounds, true); 
     } 
     base.OnBackColorChanged(e); 
    } 

    protected override void OnParentBackColorChanged(EventArgs e) 
    { 
     this.Invalidate(); 
     base.OnParentBackColorChanged(e); 
    } 
} 
+0

爲我工作很好。 – Rob 2014-08-27 09:06:13

+0

ppl只需複製並粘貼您的自定義類並更改構造函數名稱即可。完美的作品!謝謝 – hasan83 2015-08-08 15:46:04

+1

這目前有一個嚴重的錯誤。在OnPaint覆蓋中,它調用e.Graphics對象上的Dispose,不應該這樣做。如果您丟棄了傳入的Graphics對象,該應用程序可能會崩潰。如果您沒有創建它,則不應該處理它。 – Tim 2016-05-18 22:01:43

4

您將需要使用Opacity屬性並將其設置爲零以使表單不可見。

如果你想控制透明的,因爲你在你的例子已經盡力了,請參閱本文

How to: Give Your Control a Transparent Background

它說你寫的代碼,必須在控制的構造。因此,我想,您需要創建一個自定義控件,這個控件可以從您的pnlSelectArea的類型中最可能是一個按鈕。在該自定義控件的構造函數中,您可以編寫代碼來設置其樣式和顏色。

+0

中找到我的簡單方法。我不想讓控件不可見。我想讓它的內容不可見,所以我可以使用它將鼠標懸停在圖像的不同部分,並將其用作'選擇工具' – 2012-02-20 10:16:44

+0

然後設置這些內容的不透明度。 – Maheep 2012-02-20 10:20:38

+1

WPF中的winforms兄弟Mahepp no Opacity屬性 – 2012-02-20 10:29:07

0

偉大的! 我終於設法繪製透明的形狀。 我添加了一個虛擬方法

Draw(g); 

bckColor.Dispose(); 
g.Dispose(); 
base.OnPaint(e); 

,並在年底右邊的虛方法的聲明

protected virtual void Draw(Graphics g){ } 

現在我可以繼續創建我自己的透明形狀,圖形等...

1

這是什麼爲我工作是導致其他解決方案無法正常工作。

這是透明的用戶控件添加到ListView控件/ TreeView控件集合

我知道它說ButtonRenderer但它應該對任何控制工作。

在用戶控件:

protected override void OnPaint(PaintEventArgs e) 
{ 
    ButtonRenderer.DrawParentBackground(e.Graphics, this.ClientRectangle, this); 
} 
在家長控制

protected override void WndProc(ref Message m) 
{ 
    if(m.Msg == 0xF) 
     foreach(Control c in this.Controls) { c.Invalidate(); c.Update(); } 

    base.WndProc(ref m); 
}