Usercontrol permettant d'afficher une carte (ou n'importe quelle img) et de placer des points d'intéret mobiles

Soyez le premier à donner votre avis sur cette source.

Vue 10 576 fois - Téléchargée 1 017 fois

Description

Bonjour, je me suis mis à VB.net depuis une semaine, voici ma première contribution.

Il s'agit d'un usercontrol qui affiche une image dans laquelle on peut évoluer avec l'aide des scrollbars. On peut également ajouter des points d'intéret et les faire bouger.
PAR CONTRE, les points d'intérêt étant créer dynamiquement (dans une simple boucle pour cet exemple. Dans la version finale une BDD alimentera), je n'arrive pas à les repositionner lors de l'utilisation du zoom.

Je pense que malgrés ce problème, cette source pourra en aider quelques un.

1°) Vos commentaires (et critiques) sont les bienvenus et
2°) Vos astuces pour mon problème le sont également.

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
2
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
6 septembre 2007

Encore deux petites améliorations :
Lorsque tu commence de déplacer tes images elles sautent en positionnant leur centre sur la souris. Normal puisque
Top = Top + e.Y - Height / 2; //idem pour left
Si sur le MouseDown tu enregistre deux champs StartX et StartY avec e.X et e.Y et que tu modifie le code du MouseMove en :
Top = Top + e.Y - StartY; c'est beaucoup plus propre, surtout si tu as de grandes images.

Pour ce qui est du décalage des images lors du redimentionnement de l'image de fond, il ne s'agit pas du tout de l'arrondi entre double et int comme je l'ai dis dans le précédent commentaire. C'est simplement que le coin haut gauche reste toujours à la même place sur l'image mais que la taille de l'image ne suit pas celle du fond. Cela donne une impression de décalage. Pour palier à cela je définis deux champs supplémentaire à mon image soit fTopC et fLeftC. Je définis des propriétés TopC et LeftC sur le Set desquelles je recalcule de Top et le Left en fonction de la taille de l'image soit (bon c'est du C# mais ça ne doit pas être difficile à traduire...)
private int fTopC;
private int fLeftC;
public int TopC
{
get
{
return fTopC;
}
set
{
fTopC = value;
Top = Convert.ToInt32(fTopC - (Height / 2));
}
}
public int LeftC
{
get
{
return fLeftC;
}
set
{
fLeftC = value;
Left = Convert.ToInt32(fLeftC - (Width / 2));
}
}
puis tu modifie le code du MouseMove en :
TopC = TopC + e.Y - StartY;

le MouseUp :
VRate = (double)TopC / Parent.Height;
HRate = (double)LeftC / Parent.Width; //enregistrement des rapports en image de font et punaise (voir commentaire précédent)
BtnOn = false;
Cursor.Current = Cursors.Default;

et la fonction pour déplacer l'image de la punaise :
public void MoveOnResize()
{
TopC = Convert.ToInt32(Parent.Height * VRate);
LeftC = Convert.ToInt32(Parent.Width * HRate);
}
Messages postés
2
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
6 septembre 2007

Pour faire suivre tes punaises lors du changement de dimension de ton image de base tu peux jouer sur les rapports entre le Top et Left de chaque punaise et le Heigth et Width de l'image de base.
Pour tester j'ai fait une classe dérivée de PictureBox à laquelle j'ai ajouté deux champs soit pCentH et pCentV de type double (pour les punaises).
Lors du déplacement d'une punaise, sur le MouseUp tu mets à jour ces champs en divisant le Top de la punaise par le Height de l'image de base et idem pour le Left avec le Width.
Lors du redimentionnement de l'image de base, tu reprends les Height et Width de l'image et tu les multiplie par les pCentV et pCentH pour obtenir les nouveaux Top et Left des punaises.
Ca joue pas mal sauf que l'on se retrouve avec un petit décalage du aux arrondissements entre les double (pCentV-H) et les entiers (Top-Left).
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
51
Trimballer une instance de PictureBox pour chaque point... très mauvaise idée !
T'as meilleurs temps de définir toi-même ton object qui sera dessiner et qui représentera un tel point, sera bien plus performant (et plus modularisé par la même occasion).
Messages postés
48
Date d'inscription
lundi 1 août 2005
Statut
Membre
Dernière intervention
10 juillet 2008
1
Je me disais bien que ça venais de l'image mais je n'avais pas pensé à ça ^^
Messages postés
2
Date d'inscription
mardi 22 juillet 2003
Statut
Membre
Dernière intervention
10 août 2007

Merci pour vos commentaires.

Je me suis effectivement rapidement rendu compte du problème de la taille des images ... j'y travaille.

Pour ce qui est de mon problème, je viens de le résoudre avec la boucle suivante ... et ca marche !:

Dim aControl As Control
For Each aControl In Me.FondCarte.Controls
acontrol.Top .....
Next

Pour ce qui est du décalage, j'ai la solution :

aControl.Left = (aControl.Left + PointeurPicto_X) * 1.5 - PointeurPicto_X

où pointeurPicto_X = 4
et pointeurPicto_Y = 31

Ces valeurs correspondent aux coordonnées de la pointe représentée sur l'image.

Je mets à jour les sources ASAP.
Afficher les 7 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.