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.
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);
}
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).
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).
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.
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.