C# GDI+ événement Clic
the_morpher
Messages postés
4
Statut
Membre
-
the_morpher Messages postés 4 Statut Membre -
the_morpher Messages postés 4 Statut Membre -
Bonsoir,
j'aimerai créer un jeux 2D en c# GDI+ et on faisons les testes préliminaires j'ai été confronté à un problème d'événement clic que je n'arrive pas à mettre sur mes composants graphiques à savoir une bitmap/rectangles ...
après avoir vérifié sur google, j'ai compris qu'il faut faire ça manuellement .
j'ai aussi compris que pour réaliser cela il faut passer par 3 choses:
1-détecter le clic de la souris à l'intérieur de l'objet
2-vérifier la où la souris à cliqué si ça correspond à une pixel coloré est non transparente.
3-en cas de superposition de plusieurs objets l'un sur l'autre, seul l'objet visible (celui qui est sur le devant) qui dois être concerné par le clic.
pour la 1ere partie, j'ai ajouté l'événement MouseClick à la Form comme suit:
bon cela marche pour le rectangle grâce à la méthode Contains mais j'aimerai faire autant pour l'objet bitmap pour dessiner des images mais la méthode Contains n'est pas accessible pour l'objet Bitmap.
j'ai du passé par une alternative, c'est de créer un rectangle temporaire qui a les mêmes proportions du bitmap que je veux et puis faire le teste sur ce rectangle et non sur la bitmap comme ceci :
ma question est donc, est se qu'il n y à pas une autre façon plus implicite de faire cela, plus propre.
et pour les autres étapes je vois vraiment pas comment faire.
j'ai essayer le code suivant :
ensuite je récupère la couleur du pixel du bitmap (c2) à la position de la sourie mais cela provoque une erreur au niveau de la ligne suivante :
donc la comparaison ne se fait pas comme il faut, étant donné que "e" retourne la position de la souris depuis la Form et GetPixel retourne la position du pixel depuis la bmp,
c'est vrais que la pixel pointé par la souris se situe sur la position 120 de la Form, mais la pixel pointé par la souris sur la bitmap dois être inférieur a 40 vus que c'est la taille maximale, cela ne se compare pas comme la méthode Contains du Rectangle :s.
une autre question pour quelqu'un qui a expérimenter les graphismes sous gdi, est se que le faite de faire un jeu style RPG en gdi ne ralentira pas mon application en sachons qu'il aura plusieurs bitmap a dessiner fixe et/ou animés + map ...
Merci beaucoup
j'aimerai créer un jeux 2D en c# GDI+ et on faisons les testes préliminaires j'ai été confronté à un problème d'événement clic que je n'arrive pas à mettre sur mes composants graphiques à savoir une bitmap/rectangles ...
après avoir vérifié sur google, j'ai compris qu'il faut faire ça manuellement .
j'ai aussi compris que pour réaliser cela il faut passer par 3 choses:
1-détecter le clic de la souris à l'intérieur de l'objet
2-vérifier la où la souris à cliqué si ça correspond à une pixel coloré est non transparente.
3-en cas de superposition de plusieurs objets l'un sur l'autre, seul l'objet visible (celui qui est sur le devant) qui dois être concerné par le clic.
pour la 1ere partie, j'ai ajouté l'événement MouseClick à la Form comme suit:
private void Form1_MouseClick(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
if(rectangle.Contains(e.Location))
{
MessageBox.Show("cliqué avec le boutton gauche");
}
}
else if (e.Button == MouseButtons.Right)
{
if(rectangle.Contains(e.Location))
{
MessageBox.Show("cliqué avec le bouton droit");
}
}
}
bon cela marche pour le rectangle grâce à la méthode Contains mais j'aimerai faire autant pour l'objet bitmap pour dessiner des images mais la méthode Contains n'est pas accessible pour l'objet Bitmap.
j'ai du passé par une alternative, c'est de créer un rectangle temporaire qui a les mêmes proportions du bitmap que je veux et puis faire le teste sur ce rectangle et non sur la bitmap comme ceci :
private void Form1_MouseClick(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
if (new Rectangle(cnt, 100, bmp.Width, bmp.Height).Contains(e.Location))
{
MessageBox.Show("Cliqué avec le boutton droit sur l'image");
}
}
}
ma question est donc, est se qu'il n y à pas une autre façon plus implicite de faire cela, plus propre.
et pour les autres étapes je vois vraiment pas comment faire.
j'ai essayer le code suivant :
la j'ai récupéré la couleur du pixel pointé par la souris "c1" grâce à la méthode GetPixel(), c'est une méthode externe que j'ai déniché quelque part ^^,
if (e.Button == MouseButtons.Left)
{
if (new Rectangle(cnt, 100, bmp.Width, bmp.Height).Contains(e.Location))
{
Color c1 = GetPixel(this, e.X, e.Y);
Color c2 = bmp.GetPixel(e.X, e.Y);
if(bmp.GetPixel(e.X,e.Y)== GetPixel(this,e.X,e.Y))
MessageBox.Show("Cliqué avec le boutton droit sur l'image");
}
}
ensuite je récupère la couleur du pixel du bitmap (c2) à la position de la sourie mais cela provoque une erreur au niveau de la ligne suivante :
Color c2=bmp.GetPixel(e.X,e.Y);"e.Y" ne correspond a aucune pixel vus que l'image est de taille 40/40 et e.Y = 120,
donc la comparaison ne se fait pas comme il faut, étant donné que "e" retourne la position de la souris depuis la Form et GetPixel retourne la position du pixel depuis la bmp,
c'est vrais que la pixel pointé par la souris se situe sur la position 120 de la Form, mais la pixel pointé par la souris sur la bitmap dois être inférieur a 40 vus que c'est la taille maximale, cela ne se compare pas comme la méthode Contains du Rectangle :s.
une autre question pour quelqu'un qui a expérimenter les graphismes sous gdi, est se que le faite de faire un jeu style RPG en gdi ne ralentira pas mon application en sachons qu'il aura plusieurs bitmap a dessiner fixe et/ou animés + map ...
Merci beaucoup
A voir également:
- C# GDI+ événement Clic
- Atout clic - Télécharger - Éducatifs
- Evenement whatsapp - Accueil - WhatsApp
- Windows 11 clic droit afficher plus d'options par défaut - Guide
- Clic gauche souris ne fonctionne plus - Forum souris / Touchpad
- Clic droit sans souris - Forum Windows 10
1 réponse
Bonjour,
voila je pense que j'ai trouvé comment contourner ceci,
en effet c'est été tout bêtement simple, question de logique
si on suppose que j'ai mis une Bitmap a la position (X=100, Y=100)
donc la où le curseur de la souris à pointé à l'intérieure de l'image dois être :
Code :
Sélectionner tout - Visualiser dans une fenêtre à part
la on soustrait la position de l'image de la position du curseur
chose résolue, j'espère que ca va aider au moins quelqu'un
*pour l'étape 3, rien de plus facile que d'ajouter une List<Bitmap> qui contiens tout mes graphics et faire la vérification par ordre decroissant (le dernier affiché vers celui qui est le plus bas affiché)
voila je pense que j'ai trouvé comment contourner ceci,
en effet c'est été tout bêtement simple, question de logique
si on suppose que j'ai mis une Bitmap a la position (X=100, Y=100)
donc la où le curseur de la souris à pointé à l'intérieure de l'image dois être :
Code :
Sélectionner tout - Visualiser dans une fenêtre à part
bmp.GetPixel(e.X - 100, e.Y - 100);
la on soustrait la position de l'image de la position du curseur
chose résolue, j'espère que ca va aider au moins quelqu'un
*pour l'étape 3, rien de plus facile que d'ajouter une List<Bitmap> qui contiens tout mes graphics et faire la vérification par ordre decroissant (le dernier affiché vers celui qui est le plus bas affiché)