Question

Tout d'abord, ce n'est pas de faire le transparent contrôle PictureBox. Il est de la transparence bitmap sur la « toile » complètement opaque.

Le PictureBox aura toujours la taille de 300 * 300 avec un fond blanc. Pas de transparence est nécessaire pour le contrôle.

Ce que je dois est la façon de dessiner le rectangle transparent (ou tout autre chose) sur le picturebox, donc tout ce qui était déjà là on le verra « à travers » le rectangle.

Dire 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 dessinez un rectangle rouge au milieu de la toile blanche. Maintenant, je besoin d'un autre (transparent) « couche » sur l'image contenant un autre rectangle, mais qui est 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 se chevauchent pas le rouge restera complètement opaque. Cependant, si je mets la valeur alpha de la couleur à une valeur extrêmement faible (disons 1-5), le rectangle entier aspect transparent. Ce n'est pas normal à mon avis - que 5/255 est seulement la moitié transparente et que 128/255 n'est pas du tout transparent ... Et s'il y avait une chaîne drawed précédemment avec g.DrawString (), la chaîne est soit affichée derrière le rectangle vert ou il n'est pas, 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, il montrera, plus visible pour les petites valeurs alpha, jusqu'à alpha = 0.

Comment est cette brosse (lors de la création de la couleur ARGB) appliquée? Est-ce que je manque quelque chose? 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 ».

Merci pour toutes les réponses avec des suggestions.

[EDIT] Il semble que j'avais un vilain bug dans la logique de l'application, de sorte que la routine de dessin est passé dans une boucle, alors quand j'accumulais certain nombre de rectangles transparents, ils sont devenus de plus en plus épais.

Le code, lorsqu'il est pris hors de la boucle, fonctionne correctement.

Mon mauvais.

Était-ce utile?

La solution

texte alt 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 comme vous pouvez le 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 sont la même chose "plus visible" et l'objet "moins visible" ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top