Ajout d'un champ à un objet fiche pour faire le suivi des actions de la souris

De RAD Studio
Aller à : navigation, rechercher

Remonter à Techniques de dessin dans une application


Pour déterminer si un bouton de la souris a été enfoncé, vous devez ajouter un champ objet à l'objet fiche. Lorsque vous ajoutez un composant à une fiche, Delphi ajoute également un champ représentant ce composant dans l'objet fiche. Il est ensuite possible de faire référence à ce composant par le nom de son champ. Vous pouvez également ajouter vos propres champs en modifiant la déclaration de type dans le fichier d'en-tête de l'unité de la fiche.

Dans l'exemple suivant, il faut que la fiche détermine si l'utilisateur a enfoncé le bouton de la souris. Pour cela, un champ booléen a été ajouté dont la valeur est définie lorsque l'utilisateur enfonce le bouton de la souris.

Pour ajouter un champ à un objet, modifiez la définition de type de l’objet, en spécifiant l’identificateur du champ et son type après la directive public à la fin de la déclaration.

Delphi/C++Builder est "propriétaire" de toutes les déclarations placées avant la directive public : c'est là qu'il place tous les champs qui représentent les contrôles et les méthodes répondant aux événements.

Le code suivant ajoute dans la déclaration de l'objet fiche un champ de type bool, appelé Drawing. Il ajoute également deux champs afin de stocker les points de type TPoint : Origin et MovePt.

class TForm1 : public TForm {
__published: // IDE-managed Components
	void __fastcall FormMouseDown(TObject *Sender, TMouseButton Button,
		TShiftState Shift, int X, int Y);
	void __fastcall FormMouseMove(TObject *Sender, TShiftState Shift,
		int X, int Y);
	void __fastcall FormMouseUp(TObject *Sender, TMouseButton Button,
		TShiftState Shift, int X, int Y);

private: // User declarations

public: // User declarations
	__fastcall TForm1(TComponent* Owner);

	bool Drawing; // field to track whether button was pressed
	TPoint Origin, MovePt; // fields to store points
};

Nous disposons maintenant d’un champ Drawing permettant de déterminer s’il faut dessiner. Il faut donc l’initialiser à true lorsque l’utilisateur enfonce le bouton de la souris et à false lorsqu’il le relâche :

void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button,
	TShiftState Shift, int X, int Y) {
	Drawing = true; // set the Drawing flag
	Canvas->MoveTo(X, Y); // set pen position
}

void __fastcall TForm1::FormMouseUp(TObject *Sender, TMouseButton Button,
	TShiftState Shift, int X, int Y) {
	Canvas->LineTo(X, Y); // draw line from PenPos to (X, Y)
	Drawing = false; // clear the Drawing flag
}

Ensuite, vous pouvez modifier le gestionnaire de l'événement OnMouseMove de façon à ne dessiner que si Drawing est à true :

void __fastcall TForm1::FormMouseMove(TObject *Sender, TMouseButton Button,
    TShiftState Shift, int X, int Y) {
    if (Drawing)
        Canvas->LineTo(X, Y); // only draw if mouse is down }

Désormais, le dessin n’est effectué qu’entre les événements bouton de souris enfoncé et bouton de souris relâché, mais il y a toujours cette ligne brisée qui suit le déplacement de la souris au lieu d’une belle ligne droite.

Le problème tient à ce qu’à chaque déplacement de la souris, le gestionnaire de l’événement déplacement de souris appelle LineTo qui déplace la position du crayon. Par conséquent, le point d’origine de la ligne droite est perdu lorsque le bouton de la souris est relâché.

Voir aussi