2013-06-05 71 views
3

我試圖在擴散Web內容的表單上添加一個按鈕。該按鈕應該是帶有一些透明區域的圓形PNG圖像(因爲這些區域不能使用GraphicPath圓來管理它)。帶有透明區域的C#PNG圖像作爲按鈕

當然,我的PNG很好的保存了透明背景。在設計師中,我將前景色和背景色都設置爲透明。這樣,如果我從按鈕中刪除圖像,該按鈕是完全透明的。但與PNG圖像assigne它不是。

我發現這個代碼: C# transparent PNG for buttons, panels...how?

我的問題是,我不能去使用它。如果我只是在我的應用程序的命名空間中複製,MainForm的設計師給我一個錯誤:

 this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); 

「不可能找到指定的文化撥款源」。

我這樣做的好方法嗎?僅僅創建這個類的一個實例就足以讓它起作用了?

謝謝

+0

我對你確切的問題有點困惑。您是否遇到透明度問題(如果是這樣,請閱讀GDI和GDI +中的透明度)......您是否創建了自己的控件以充當按鈕?該按鈕是否找不到您正在查找的資源或其他資源? – series0ne

+0

另外,「擴散網頁內容」是什麼意思? – series0ne

+0

我必須放下一個帶透明區域的PNG圖像,這個透明區域可以充當按鈕。在我發現的代碼中,人們說我們可以通過創建一個「自定義」控件來獲得這個結果。 –

回答

1

Windows窗體使用GDI繪製和GDI +,這是在他們的正確處理透明度的能力有限,因爲在最初創建GDI時,透明度是不是在因素的特徵。話雖這麼說,有一些功能會在某種程度上處理透明度,如AlphaBlend函數。

因此,您可能想知道「您如何在Windows Forms中實現透明度?」 - 它不是「真正的」透明度,更多的是爲GDI(因此也就是Windows窗體控件)提供「透明度」的後事(或破解)。

這個技巧是UXTheme的一部分,稱爲DrawThemeParentBackground,它基本上查看控件下方的內容,並在繪製子控件之前將其繪製到表面。

嘗試子類控制和Color.Transparent填充它的客戶區:

public class TestControl : Control 
{ 
    protected override void OnPaint(PaintEventArgs e) 
    { 
     e.Graphics.Clear(System.Drawing.Color.Transparent); 
    } 

    protected override void OnPaintBackground(PaintEventArgs pevent) 
    { 
     pevent.Graphics.Clear(System.Drawing.Color.Transparent); 
    } 
} 

控制繪製完全黑了吧?那是因爲GDI並不知道「透明」是什麼。

所以你需要重寫你的OnPaintBackground事件,並在那裏執行對DrawThemeParentBackground的調用。

而且,試試這個:

  1. 創建一個表單,並設置它的背景圖片(使用牆紙或東西)
  2. 面板添加到窗體,並設置它的背景爲透明(它使用DrawThemeParentBackground要做到這一點!)
  3. 將您的透明PNG添加到面板中... PNG將與背景融合在一起。

現在,由於GDI缺乏UI開發人員所需的許多功能,他們都轉移到了WPF,這是一個完全不同的野獸,但會做你正在問的問題,沒有太大麻煩!

+0

謝謝。我認爲我會以一種「受限制」的方式來做 - 我會放棄內部透明度,並使用一些Graphic Path類來使用透明窗體,只顯示一個圓圈,在其中放置我的按鈕。 –

+0

@GrigoryKornilov,沒問題。實際上,我花了很多時間來研究Windows Forms,GDI,GDI +,Windows Glass等不可能實現的功能。因此,如果您可以更新您的問題幷包含您嘗試實現的某些圖片(理想情況下),目前看起來像什麼等等。如果我可以直觀地看到問題,我可能會多提供一些幫助。 – series0ne