2010-01-13 90 views
0

首先,這不是要使PictureBox控件透明。這是關於完全不透明的「畫布」上的位圖透明度。PictureBox上的圖形透明度

PictureBox將始終具有300 * 300的大小與白色背景。控制不需要透明度。

我需要的是將透明矩形(或其他任何東西)繪製到pictureBox上的方式,因此任何已經存在的東西都將被視爲「通過」矩形。

說我有一個下面的代碼

Bitmap bmp = new Bitmap(300, 300); 
Graphics g = Graphics.FromImage(bmp); 
g.FillRectangle(new SolidBrush(Color.White), 0, 0, 300, 300); 
g.FillRectangle(new SolidBrush(Color.Red), 100, 100, 100, 100); 
pictureBox.Image = bmp; 

這將在白色帆布中間畫一個紅色矩形。現在,我需要另一個(透明的)「圖層」上的圖片包含另一個矩形,但一個是透明的。

我可以嘗試

Brush brush = new SolidBrush(Color.FromArgb(128, 0, 80, 0)); 
g.FillRectangle(brush, 50, 50, 200, 200); 

由於我使用的顏色通過指定其alpha = 128,得到的矩形應該是透明的,所以第一紅色矩形應該通過此其他綠色一個可見。

但是,這並不正確。我可以看到新的綠色矩形後面的紅色矩形,但綠色矩形的不與紅色矩形重疊的部分將保持完全不透明。但是,如果我將顏色的alpha值設置爲一個非常小的值(比如1-5),整個矩形將看起來透明。這在我看來是不正常的 - 5/255只有一半透明,128/255根本不透明...如果之前使用g.DrawString()繪製了一個字符串,則該字符串顯示在後面綠色矩形或不是,取決於透明度級別。例如,如果Alpha大於或等於(大約)40,則字符串根本不可見,並且如果它小於40,則它將顯示,對於較小的alpha值,對於alpha = 0,更明顯。

這個畫筆(從Argb顏色創建時)如何應用?我錯過了什麼嗎?對我來說,設置透明畫筆似乎使背景「更明顯」,而不是將對象設置爲「不可見」。

感謝您的任何建議答覆。

[編輯]看來我不得不在應用邏輯一個討厭的錯誤,所以繪圖程序發生在一個循環中,所以當我積累了一定數量透明的矩形,他們變得越來越厚。

從循環中取出的代碼正常工作。

我的不好。

回答

0

alt text http://lh4.ggpht.com/_1TPOP7DzY1E/S02ivAoGgTI/AAAAAAAAC6s/ZQvZQ5GdwSU/s800/Capture4.png

由該代碼實現:

private void pictureBox1_Paint(object sender, PaintEventArgs e) 
    { 
     Bitmap bmp = new Bitmap(300, 300); 
     Graphics g = Graphics.FromImage(bmp); 
     g.FillRectangle(new SolidBrush(Color.White), 0, 0, 300, 300); 
     g.FillEllipse(new SolidBrush(Color.Blue), 25, 25, 100, 200); 
     g.FillRectangle(new SolidBrush(Color.Red), 100, 100, 300, 100); 
     g.DrawString("this is a STRING", SystemFonts.DefaultFont, 
      Brushes.Black, new Point(150, 150)); 
     pictureBox1.Image = bmp; 

     Brush brush = new SolidBrush(Color.FromArgb(40, 0, 80, 0)); 
     g.DrawRectangle(Pens.Black, 50, 50, 200, 200); 
     g.FillRectangle(brush, 50, 50, 200, 200); 
    } 

綠色的部分是透明的,你可以看到...該字符串是完全可見。

對我來說,設置透明畫筆似乎使背景「更明顯」,而不是設置對象「不明顯」。

背景「更明顯」的對象「不太明顯」是一樣的東西......

+0

他們只對重疊部分中的同樣的事情。 – 2010-01-13 10:37:30

+0

您的解決方案和我的例子都可以。看起來我有一個循環錯誤。用字符串示例更新了 – 2010-01-13 10:38:03

+0

。 – serhio 2010-01-13 10:41:22