2010-01-13 7 views
0

Tout d'abord, il ne s'agit pas de rendre le contrôle PictureBox transparent. Il s'agit de la transparence bitmap sur la "toile" entièrement opaque.Transparence graphique sur PictureBox

Le PictureBox aura toujours la taille de 300 * 300 avec un fond blanc. Aucune transparence n'est nécessaire pour le contrôle. Ce dont j'ai besoin, c'est de la façon de dessiner le rectangle transparent (ou quoi que ce soit d'autre) sur le PictureBox, donc tout ce qui était déjà là sera vu "à travers" le rectangle.

que j'ai un code suivant

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; 

Cela dessiner un rectangle rouge au milieu de la toile blanche. Maintenant, j'ai besoin d'un autre "calque" (transparent) sur l'image contenant un autre rectangle, mais transparent.

Je peux essayer

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

Depuis que je suis en utilisant une couleur en spécifiant son alpha = 128, le rectangle résultant doit être transparent de sorte que le premier rectangle rouge doit être vu à travers cet autre vert.

Cependant, cela ne se produit pas correctement. Je peux voir le rectangle rouge derrière le nouveau vert, mais la partie du rectangle vert qui ne chevauche pas le rectangle rouge restera complètement opaque. Cependant, si je mets la valeur alpha de la couleur à une valeur extrêmement petite (disons 1 à 5), le rectangle entier apparaîtra transparent. Ce n'est pas normal à mon avis - que 5/255 soit seulement à moitié transparent et que 128/255 ne soit pas du tout transparent ... Et s'il y avait une chaîne dessinée précédemment avec g.DrawString(), la chaîne est soit affichée derrière le rectangle vert ou non, selon le niveau de transparence. Par exemple, si l'Alpha est supérieur ou égal à (environ) 40, la chaîne n'est pas visible du tout, et si elle est inférieure à 40, elle sera visible, pour les valeurs alpha plus petites, jusqu'à alpha = 0.

Comment cette brosse (lorsqu'elle est créée à partir de la couleur Argb) est-elle appliquée? Est-ce que je manque quelque chose? Pour moi, il semble que la définition d'un pinceau transparent rend l'arrière-plan "plus visible" au lieu de rendre l'objet "moins visible".

Merci pour les réponses avec des suggestions. Il semble que j'ai eu un bogue dans la logique de l'application, donc la routine de dessin s'est déroulée en boucle, alors quand j'ai accumulé un certain nombre de rectangles transparents, ils sont devenus de plus en plus épais.

Le code, lorsqu'il est retiré de la boucle, fonctionne correctement.

Mon mauvais.

Répondre

0

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

est fait par ce code:

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); 
    } 

La partie verte n'est pas opaque que vous pouvez voir ... La chaîne est parfaitement visible.

Pour moi, il semble que la mise en une brosse transparente rend l'arrière-plan « plus visible » au lieu de définir l'objet « moins visible ».

fond « plus visible » et l'objet « moins visibles » sont la même chose ...

+0

Ils sont la même chose que pour la partie qui se chevauchent. –

+0

Votre solution et mes exemples sont corrects. Il semble que j'avais un bug en boucle. –

+0

mis à jour avec l'exemple de chaîne. – serhio