2012-05-04 238 views
2

我認爲我必須錯過一些明顯的東西,但經過幾個小時的搜索後我無法找到它。是否沒有辦法使用PictureBox或其他控件來包含具有部分透明/ alpha混合像素的圖像,並將其放置在另一個圖像上並根據其下的圖像進行混合?Winforms半透明PNG半透明PNG

例如,這產生的結果欲:

  1. 放置窗體上的一個面板。
  2. 添加一個OnPaint處理程序。
  3. 在OnPaint處理程序中繪製1個PNG,然後在其上繪製另一個PNG,並使用Graphics.DrawImage。

這不:

  1. 將一個PictureBox窗體上,將其設置爲PNG。

  2. 將另一個PictureBox放在窗體上並將其設置爲PNG。

  3. 將第二個圖片框放在第一個圖片框上。

...即使第二個圖片框只是空的,並且具有透明背景色,它仍然覆蓋它下面的圖片。

我讀過這個源於所有winform控件是windows,所以本質上它們不透明。

...但即使是我從Borland的VCL遷移而來的15年前的平臺,有幾個無窗口的控件,所以很難成像winforms並沒有至少有一些簡單的解決方案?

我上面的第一個例子是一個答案,但是,當你只能使用一個大面板並在其中繪製所有「控件」時,這會增加很多工作量。如果您可以使用單獨的鼠標事件/等分開控制,則會更好。即使不是圖像控件,也不需要我自己繪製的控件,只要我可以在每個控件中放置一個圖像,就沒有問題。在VCL中,他們將這稱爲「顏料盒」,只是一個矩形區域,您可以將其放置在窗體上並在其上繪製任何您想要的內容。它有自己的鼠標事件,界限等。如果你沒有畫任何東西,它就像它甚至不存在(100%透明),除了它仍然獲得鼠標事件,因此可以用作「熱點現場「或」目標「。

回答

6

PictureBox控件支持透明度很好,只需將其BackColor屬性設置爲Transparent即可。這將使其父項的像素可見作爲背景。

擦是設計師不會讓你把第二個圖片盒做成第一個的孩子。你需要的只是構造函數中的一小段代碼來重新保存它。並給它一個新的位置,因爲這是相對於父母。像這樣:

public Form1() { 
     InitializeComponent(); 
     pictureBox1.Controls.Add(pictureBox2); 
     pictureBox2.Location = new Point(0, 0); 
     pictureBox2.BackColor = Color.Transparent; 
    } 

不要猶豫,使用OnPaint()順便說一句。

+3

+1爲「不要猶豫使用OnPaint」。重疊PictureBoxes顯示重疊的圖像增加了質量和複雜性,你真正需要做的就是自己繪製圖像。 – Tergiver

+0

比我想出的要好得多,謝謝!在我的情況下,我有一個很好的圖像作爲背景和3或4圖像,每個圖像都有點擊事件...因此更容易爲每個圖像分別控制,以處理鼠標事件而不必檢查位置等。也很好用IDE來移動它們與代碼。不喜歡有額外的窗口句柄,這是VCL很好的地方(無窗口控件)。 – eselk

+0

這是最好的答案! –

0

對不起,我剛剛發現這個......一旦我決定谷歌「的WinForms透明面板」,而不是以前我一直做的搜索,在TransPictureBox例如節目似乎做正是我需要的:

Transparency Problem by Overlapped PictureBox's at C#

看起來有由兩個部分組成的:

  1. 設置爲WS_EX_TRANSPARENT窗口樣式

  2. 重寫「繪製背景」方法(或者可能可能使控件樣式不透明)。