Tracer sur picturebox en deplacant la souris

olibara Messages postés 666 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 11 mars 2010 - 19 mars 2008 à 08:10
olibara Messages postés 666 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 11 mars 2010 - 19 mars 2008 à 13:21
Bonjour

Je pensait avec un peu de reflexion resoudre un probleme certainement bien connu.
Mais ca ne semble pas si simple
Je fais donc appel a l'experience pour me guider

J'ai un picture box
j'aimerais permettre a l'utilisateur de definir un rectangle dans ce pb

1- je detecte l'event mousedown, je prends un point de reference
2- A partir de la, l'utilisateur s'il garde le bouton pressé peut deplacer sa souris visualiser le rectangle construit entre le point de reference et sa nouvelle position.
3- Il lache le bouton et je prends les coordonées du rectangle pour traitement

Considérant 2 et 3 c'est donc une double condition que je dois gerer : mousemove d'une part et mousedown d'autre part

en 1 je teste l'event mousedown
mais comment en 2 je peux lors de l'event mousemove savoir si mouse est aussi down ?
Et d'une maniere generale avez vous quelques trucs ou astuces sur  ce sujet

Merci beaucoup !

3 réponses

cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
19 mars 2008 à 10:11
Salut,
L'exemple a déjà été donné plusieurs fois sur le forum, regardes les messages écrit par Lutinore; je sais qu'il a posté un tel code sur le forum (c'est pas très récent)...

<hr />
-My Blog-
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
19 mars 2008 à 13:03
Salut, ControlPaint.DrawReversibleFrame ou comme ça :

public class MyPictureBox : PictureBox
{
    private bool down = false;
    private Color frameColor = Color.White;
    private Rectangle frameRect = Rectangle.Empty;


    public MyPictureBox( ) : base( )
    {
        //this.SetStyle
        //(
        //    ControlStyles.UserPaint |
        //    ControlStyles.AllPaintingInWmPaint |
        //    ControlStyles.OptimizedDoubleBuffer,
        //    true
        //);
    }


    protected override void OnMouseDown( MouseEventArgs args )
    {
        // base.OnMouseDown( args );


        frameRect.X = args.X;
        frameRect.Y = args.Y;
        down = true;
    }


    protected override void OnMouseUp( MouseEventArgs args )
    {
        // base.OnMouseUp( args );


        down = false;
        this.Invalidate( );
        this.Update( );
    }


    protected override void OnMouseMove( MouseEventArgs args )
    {
        // base.OnMouseMove( args );


        if ( down )
        {
            frameRect.Width = args.X - frameRect.X;
            frameRect.Height = args.Y - frameRect.Y;
            this.Invalidate( );
            this.Update( );
        }
    }


    protected override void OnPaint( PaintEventArgs args )
    {
        base.OnPaint( args );


        Graphics g = args.Graphics;


        if ( down )
        {
            Pen framePen = new Pen( frameColor );
            framePen.DashStyle = DashStyle.Dash;
            g.DrawRectangle( framePen, frameRect );
            framePen.Dispose( );
            framePen = null;
        }
    }
}
0
olibara Messages postés 666 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 11 mars 2010 6
19 mars 2008 à 13:21
Merci Lutinore


Oui, j'avais déja trouvé en chipotant et je suis content du truc


Dans le cas present je definis un rectangle pour prendre une portion d'image et faire un zoom dessus
Ca devient amusant quand il faut gerer le passage en négatif par rapport a la reference mais c'est de la bete logique arithmetique

Par contre le plus subtil c'est quand tu veux imposer non pas un rectangle mais un carré.
Difficile dans ce cas de correctement fixer la reference si tu passe en négatif !
C'est evidement un truc logique mais j'ai laissé les neurones refroidir car j'ai du flotement dans mon point de rference.


 


 


     //**************************************************************************************************
    void pbDrawRectangle(int X,int Y)
    {
      pb_cont.Refresh();


      int dX = Math.Abs(X-pRef.X);
      int dY = Math.Abs(Y-pRef.Y);


      int Z = Math.Max(dX, dY);
      dX = Z;
      dY = Z;


      int rX = pRef.X;
      int rY = pRef.Y;


      if (X - pRef.X < 0) rX = X;
      if (Y - pRef.Y < 0) rY = Y;


      Graphics graphics = pb_cont.CreateGraphics();
      graphics.DrawRectangle(Pens.Black, rX, rY, dX, dY);


    }
    //**********************************************************************************************
    private void pb_cont_MouseDown(object sender, MouseEventArgs e)
    {
     if (e.Button == MouseButtons.Right)
      {
        pRef.X = e.X;
        pRef.Y = e.Y;
      }
    }
    private void pb_cont_MouseMove(object sender, MouseEventArgs e)
    {
      if (e.Button == MouseButtons.Right)
      {
        pbDrawRectangle(e.X, e.Y);
        return;
      }
    }
    private void pb_cont_MouseUp(object sender, MouseEventArgs e)
    {
      if (e.Button == MouseButtons.Right)
      {
        pbZoom(e.X, e.Y);
        return;
      }
   }
0
Rejoignez-nous