2015-10-23 80 views
1

在我的設置中,我有5個圖片框,我嘗試分層。如何在分層圖片框時獲得透明度?

我對這個代碼是:

  pbCoin1.Parent = pbMap; 
      pbCoin1.BackColor = Color.Transparent; 
      pbCoin2.Parent = pbMap; 
      pbCoin2.BackColor = Color.Transparent; 
      pbCoin3.Parent = pbMap; 
      pbCoin3.BackColor = Color.Transparent; 

      pbFlashlight.Parent = pbMap; 
      pbFlashlight.BackColor = Color.Transparent;` 

所有5 pictureboxes包含圖像。我使用的方法工作正常,但問題是PbCoin 1,2,3正在通過我的pbFLashlight(請參見圖像)。

有人可以提供一個解決方案,使硬幣只有當黑色層的透明部分結束時纔可見嗎?

Link to image

+2

的WinForms?透明度不會按照您的要求運行。 –

+0

是它的WinForms,但爲什麼它的底層顯示底層,以便透明性正常。但是這3個硬幣是這樣的毛刺?它是WinForms嗎? – BramSnoek

+1

WinForms不能正確支持透明度。你最好的選擇是使用WPF。 –

回答

0

不要使用多個圖片框。使用單個PictureBox來表示遊戲區域並處理.Paint事件。使用GDI調用.Painte發送給Graphics的引用進行所有繪圖。您需要在Paint事件結束時調用PictureBox.Invalidate以使其排隊到下一幀

爲了獲得更好的性能,請創建一個新的Bitmap實例,並在遊戲的整個生命週期中保留一個引用。清除所有繪製到每個幀的位圖,然後將該位圖繪製到.Paint中的PictureBox。

爲了獲得更好的性能,請不要使用WinForms。

的基本模式應該是這樣的:

private void Canvas_Paint(object sender, PaintEventArgs e) 
{ 
    e.Graphics.DrawImage(...); 

    Canvas.Invalidate(); 
} 
+0

我試過這個,但是當我嘗試這樣做時,我的表單變爲灰色,然後自行關閉...... – BramSnoek

+0

您是否在'.Paint'內手動調用'.Paint'?如果是這樣,不要,那會鎖定應用程序。您需要使用'.Invalidate'使Windows在不扼殺消息泵的情況下排隊進行下一次更新。 –

+0

我只是添加一個繪畫事件到我的圖片框,然後有picturebox_paint(等,等),這確實鎖定了我的應用程序 – BramSnoek