Couleur sélection en fonction de l'arrière plan

ArnaudEIC Messages postés 13 Date d'inscription mercredi 28 février 2007 Statut Membre Dernière intervention 17 septembre 2007 - 8 août 2007 à 14:52
ShareVB Messages postés 2676 Date d'inscription vendredi 28 juin 2002 Statut Membre Dernière intervention 13 janvier 2016 - 12 août 2007 à 23:32
Bonjour,


j'ai un picturebox dans lequel je souhaite que l'on puisse faire une
zone de sélection. Pour dessiner la zone de sélection je fais
simplement un "DrawRectangle" avec un "pen" dont je précise dans le
style que c'est en pointillé.

Le problème c'est que j'aimerai que la couleur change en fonction de
l'image qu'il y a en arrière-plan. Comme dans Paint par exemple, les
pointillés passent de noir à gris à blanc selon la couleur qu'il y a
derrière, pour que cela sois toujours bien visible.

Quelqu'un a une idée de comment faire ça ?

merci d'avance

7 réponses

Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
8 août 2007 à 15:03
Salut,

ControlPaint.DrawReversibleFrame( .. )
0
ArnaudEIC Messages postés 13 Date d'inscription mercredi 28 février 2007 Statut Membre Dernière intervention 17 septembre 2007
8 août 2007 à 16:07
Salut,
J'avais effectivement trouvé un exemple qui utilisai cette fonction dans le lien suivant
Après j'utilise peut être mal la fonction mais si je l'utilise sur le MouseMove, la zone de sélection que je dessine disparai dès que qu'une autre fenêtre ou appli se met devant, et si je l'utilise sur le Paint c'est pareil mais en plus de cela ça cligonte.
Quand j'utilise le DrawRectangle cela dessine directement sur le graphics donc je me dis que c'est pour ça que dans ce cas la le rectangle reste..
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
9 août 2007 à 15:40
Comme ça par exemple..

public partial class Form1 : Form
{
    private PictureBox pb = null;
    private Point start = Point.Empty;
    private Point end = Point.Empty;
    private Rectangle frame = Rectangle.Empty;
    private bool draw = false;
   
    public Form1( )
    {
        InitializeComponent( );


        pb = new PictureBox( );
        pb.Parent = this;
        pb.Dock = DockStyle.Fill;
        pb.SizeMode = PictureBoxSizeMode.StretchImage;
        pb.Image = this.Icon.ToBitmap( ); // pour l'exemple.


        pb.MouseDown += delegate( object sd, MouseEventArgs args )
        {
            if ( args.Button == MouseButtons.Left )
            {
                draw = true;
                start = pb.PointToScreen( args.Location );
            }
        };


        pb.MouseUp += delegate( object sd, MouseEventArgs args )
        {
            draw = false;
        };


        pb.MouseMove += delegate( object sd, MouseEventArgs args )
        {
            if ( draw )
            {
                end = pb.PointToScreen( args.Location );


                ControlPaint.DrawReversibleFrame
                (
                    frame, Color.Black, FrameStyle.Dashed
                );


                frame = new Rectangle
                (
                    start.X, start.Y, end.X - start.X, end.Y - start.Y
                );


                ControlPaint.DrawReversibleFrame
                (
                    frame, Color.Black, FrameStyle.Dashed
                );
            }
        };
    }
}
0
ArnaudEIC Messages postés 13 Date d'inscription mercredi 28 février 2007 Statut Membre Dernière intervention 17 septembre 2007
9 août 2007 à 16:00
Tout d'abord merci beaucoup pour ta réponse !

Ensuite, j'ai recopié ton exemple ( j'avais fais a peu près le même en fait ) et il a les même sympthome que mon exemple.
C'est a dire que si je bouge ma fenêtre ou si je met une autre fenêtre devant et fais réapparaitre ma fenêtre, ma zone de sélection n'est plus affichée.
Il y a peut être quelque chose que je fais mal mais sur mon poste cela fais ça.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
10 août 2007 à 03:35
Oui exact.. comme tu le sais surement les dessins de GDI+ ( System.Drawing ) ne sont pas persistants, il faut dessiner dans l'évènemment Paint ( OnPaint ) pour que les dessins soient re-dessiner à chaque fois que c'est nécessaire.. Mais malgré ça, là y'a un effet de bord assez génant avec la fonction DrawReversibleFrame, le code devient vite inutilement compliqué juste pour une petite selection, ( j'ai pas insité, dsl ) Finalement dessiner directement un rectangle en pointillé dans le OnPaint de la PictureBox c'était peut être pas si mal. : ) Si ça clignotte, utilise un double buffer.
0
ArnaudEIC Messages postés 13 Date d'inscription mercredi 28 février 2007 Statut Membre Dernière intervention 17 septembre 2007
10 août 2007 à 14:19
merci de ta réponse, surtout vu l'heure a laquel tu l'a écrite
J'avais effectivement compris pourquoi le dessins ne persistai pas.
C'est vrais que j'espérai trouver quelque chose au niveau du PEN ou du BRUSH et utiliser le drawrectangle tout simplement, mais apparement il n'y a rien.
Qu'entend tu par doucle buffer pour éviter le clignotement ?
0
ShareVB Messages postés 2676 Date d'inscription vendredi 28 juin 2002 Statut Membre Dernière intervention 13 janvier 2016 26
12 août 2007 à 23:32
salut,

double buffer : http://www.bobpowell.net/doublebuffer.htm

ShareVB
0
Rejoignez-nous