2010-03-19 6 views
0

im travaille actuellement sur visuel C++ 2008 édition express .. dans mon projet j'ai une image qui contient une image, maintenant je dois dessiner un rectangle pour permettre à l'utilisateur de sélectionner une partie de l'image. . J'utilise l'événement « MouseDown » du picturebox et le code ci-dessous pour tracer un rectangle:Dessin d'un rectangle continu

Void pictureBox1_MouseDown(System::Object^ sender, Windows::Forms::MouseEventArgs^ e) 
       { 
      Graphics^ g = pictureBox1->CreateGraphics(); 
      Pen^ pen = gcnew Pen(Color::Blue); 
      g->DrawRectangle(pen , e->X ,e->Y,width,ht);   
     } 

maintenant dans le « DrawRectangle » arguments « largeur » et « ht » sont statiques, de sorte que le dessus le code résulte dans le dessin d'un rectangle au point où l'utilisateur appuie sur le bouton de la souris sur l'image dans l'image ... Je veux permettre à l'utilisateur de pouvoir faire glisser le curseur et dessiner un rectangle de s iser qu'il souhaite .. plz help me .. sur ce Thanx ..

Répondre

0

Vous ne devriez pas tirer directement sur votre fenêtre dans vos gestionnaires d'événements - tout dessin doit être dans votre gestionnaire d'événements Paint.

Il y a beaucoup plus que vous pouvez faire pour bien travailler, mais le cœur de la technique dont vous avez besoin est:

Pour déplacer un rectangle autour de l'utilisateur fait glisser la souris, vous devez gérer la souris Déplacés événements. Chaque fois que vous en obtenez un, vous devez Invalidate() pour provoquer un redessin de votre fenêtre. Dans votre gestionnaire Paint, si le bouton de la souris est enfoncé, placez le pointeur de la souris et dessinez le rectangle à cet emplacement.

Cela vous aidera à démarrer, mais il y aura quelques problèmes - la fenêtre scintille pendant qu'elle est constamment redessinée, et elle peut être un peu lente.

Il y a d'autres choses que vous pouvez faire pour améliorer cette situation, y compris:

  • Seulement invalident les parties du formulaire que vous devez (où l'ancien rectangle doit être effacé, et où le nouveau rectangle doit être dessiné)

  • Après Invalidate(), appelez Update() immédiatement pour provoquer la Redessiner se produise le plus tôt possible

  • « double tampon » rendu, et/ou stocker le contenu de fenêtre un de bitmap fscreen afin que vous puissiez rendre l'arrière-plan avec le rectangle sur le dessus plus rapidement et sans scintillement. (Mais c'est une technique assez avancée).