Re,
Merci pour les infos.
beh, quand ta souris passe au dessus d'une image, c'est le controle image qui récupère la position de la souris...
Donc, il faut forcer à ce que le controle qui a le focus garde la souris...
de mémoire, MouseCapture() fait un peu celà
Il me semble que MouseCapture() n'est pas disponible en Winform Application.
par contre un timer et system.windows.forms.control.mouseposition ca marche tout le temps
Je suis donc partis là-dessus. Cela fonctionne bien. Merci.
il nous faudrait des indications sur ce que contient ton code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
int i = 0;
for(int y = 0; y < (CSTile.tileList.ElementAt(0).getImgSrcSizeHeight() + 2) - (CSTile.tileList.ElementAt(0).getTileHeight() + 2); y++)
{
for(int x = 0; x < (CSTile.tileList.ElementAt(0).getImgSrcWidth() + 2) - (CSTile.tileList.ElementAt(0).getTileWidth() + 2); x++)
{
pbx = new PictureBox();
pbx.BorderStyle = BorderStyle.FixedSingle;
pbx.Width = CSTile.tileList.ElementAt(i).getTileWidth();
pbx.Height = CSTile.tilList.ElementAt(i).getTileHeight();
pbx.Location = new Point(x, y);
pbx.Image = new Bitmap(CSTile.tileList.ElementAt(i).getBitmap();
this.panTest.Controls.Add(pbx);
x += CSTile.tileList.ElementAt(i).getTileWidth() + 2;
i++;
}
y += CSTile.tileList.ElementAt(i).getTileHeight() + 2;
} |
Voilà à quoi ressemble la boucle de remplissage du panel. Tous les tiles sont triés. i correspond à leur id.
Après, je me suis pas mal cassé la tête avec des calculs pour retrouver l'id de chaque tiles lorsque l'on clic dessus.
La méthode avec le timer permet d'avoir la position relative du control et ne prend pas en compte le scrolling (j'ai pas mal de tiles dans mon panel donc AutoScroll = true).
J'ai aussi intégré un petit espace entre chaque PictureBox (2px) histoire de m'emmerder un peu plus.
Voici le code de lévénement Tick du Timer :
1 2 3 4 5 6 7 8 9 10 11
|
private int scrollValueX;
private int scrollValueY;
private void timer_Tick(object sender, EventArgs e)
{
// Test
lblNbPosTest.Text = this.PointToClient(new Point(MousePosition.X + scrollValueX, MousePosition.Y + scrollValueY)).toString();
mousePosX = this.PointToClient(new Point(MousePosition.X + scrollValueX, MousePosition.Y + scrollValueY)).X
mousePosY = this.PointToClient(new Point(MousePosition.X + scrollValueX, MousePosition.Y + scrollValueY)).Y
} |
Pour prendre en compte le scrolling du panel, j'ai créé les 2 variables scrollValueX et scrollValueY auquelles on affecte la valeur du déplacement des scrollbars dans lévénement Scroll du panel.
Voici le code :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
private void pantTest_Scroll(object sender, ScrollEventArgs e)
{
if(e.ScrollOrientation == ScrollOrientation.HorizontalScroll)
{
// Test.
lblNbScrollValueX.Text = e.newValue.ToString();
scrollValueX = e.NewValue;
}
else
{
// Test.
lblNbScrollValueY.Text = e.NewValue.ToString();
scrollValueY = e.NewValue;
}
} |
Ensuite, pour retrouver l'id des tiles, je me suis un peut cassé les dents.
Ma formule n'est probablement pas parfaite mais elle fonctionne :
Tty correspond aux nombres de tiles sur la hauteur du panel.
Ttx correspond aux nombres de tiles sur la largeur du panel
E correspond à l'espacement entre chaque tile.
Th correspond à la hauteur d'un tile.
Tw correspond à la largeur d'un tile.
On a :
[(Tty(E + 1) + Tty + Tty(Th) + TtyE) / (Th + E + 4 ) x Ttx] + (Ttx(E + 1) + Ttx + Ttx(Tw) + TtxE) / (Tw + E + 4)
En fait, Tty(E + 1) + Tty + Tty(Th) = mousePosY (voir plus haut), et
Ttx(E + 1) + Ttx + Ttx(Ttw) = mousePosX.
Cette formule est à placé dans lévénement Clic du panel :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
private void panTest_Clic(object sender, EventArgs e)
{
if(mousePosX > panTest.Location.X) && (mousePosY > panTest.Location.Y) && (mousePosX < (CSTile.tileList.ElementAt(0).getImgSrcSizeWidth()) + (spacing * CSTile.tileList.ElementAt(0).getTileNbWidth())) && (mousePosY < (CSTile.tileList.ElementAt(0).getImgSrcSizeHeight()) + (spacing * CSTile.tileList.ElementAt(0).getTileNbHeight())))
{
int tileId = ((mousePosY + CSTile.tileList.ElementAt(0).getTileNbHeight() * spacing)
/ (CSTile.tileList.ElementAt(0).getTileHeight() + spacing + 4)
* CSTile.tileList.ElementAt(0).getTileNbWidth())
+ (mousePosX + CSTile.tileList.ElementAt(0).getTileNbWidth() * spacing)
/ (CSTile.tileList.ElementAt(0).getTileWidth() + spacing + 4);
// Test.
lblNbId.Text = tileId.ToString();
}
} |
Je récupère l'id car les tiles sont ensuite chargés via un fichier texte par une autre application.
Tout le code n'est pas présent par soucis de lisibilité ( j'ai déja écrit un pavé
). Je suppose que certaines parties sont mal optimisées, mais bon, ça fonctionne (jusqu'au prochain soucis
). C'est ma première expérience avec le C#, ne me fusillez pas
.
Merci pour vos réponses.
Partager