Bonsoir à tous,
Je cherche à pouvoir créer le système de grip que l'on peut avoir sous PowerPoint lorsque l'on sélectionne l'objet que l'on vient de créer...
Il est plus facile ainsi de redimensionner l'objet et de le déplacer que de passer par une boite de propriétés où l'on change les valeurs inscrites...
L'organisation de la portion du programme est comme ceci :
Ici nous avons un objet Image qui contient le rendu de la surface XNA.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 <Grid x:Class="QuanticStorm.XNA.Controls.XnaControl" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:controls="clr-namespace:QuanticStorm.XNA.Controls" mc:Ignorable="d" d:DesignHeight="600" d:DesignWidth="800" SizeChanged="Grid_SizeChanged" Loaded="Grid_Loaded" Name="xnaGrid"> <Image Name="xnaImage" MouseMove="xnaImage_MouseMove"> <!-- Contient les input bindings et le context menu --> </Image> <Canvas Name="spriteGripContainer" MouseMove="spriteGripContainer_MouseMove"/> <Grid Name="cameraSettings" Visibility="Hidden"> <!-- Contient les données servant de "caméra" --> </Grid> </Grid>
Cette surface dessine en interne les sprites qu'on lui envoie et genère une image bitmap qui est renvoyé dans le composant Image.
Lorsqu'un nouveau sprite est ajouté, on recréé l'image bitmap et on demande à ce que ce nouveau sprite soit sélectionné.
Pour que l'on voit que le sprite est sélectionné, on créé un objet SpriteGrip.
Cet objet est un Canvas, qui a la taille du sprite, et sur lequelle 8 boutons sont ajoutés (haut-gauche, haut-centre, haut-droit, etc...)
Ce grip sera ajouté au canvas nommé spriteGripContainer (cela permet de positionner le grip sur le sprite).
Le système de caméra n'a aucune importance ici.
Maintenant le problème se situe sur le grip.
Le fichier est défini comme ceci :
L'evènement SizeChanged permet de replacer les grips en fonction de la taille du Canvas.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45 <Canvas x:Class="QuanticStorm.XNA.Controls.SpriteGrip" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="300" SizeChanged="Canvas_SizeChanged"> <Button Canvas.Top="-5" Canvas.Left="-5" x:Name="topLeftGrip" /> <Button Canvas.Top="-4" Canvas.Left="146" x:Name="topCenterGrip" MouseEnter="GripOnMouseEnter" MouseLeave="GripOnMouseLeave" Click="GripOnClick" /> <Button Canvas.Top="-5" Canvas.Right="-5" x:Name="topRightGrip" /> <Button Canvas.Top="146" Canvas.Left="-4" x:Name="middleLeftGrip"/> <Button Canvas.Top="146" Canvas.Right="-4" x:Name="middleRightGrip"/> <Button Canvas.Bottom="-5" Canvas.Left="-5" x:Name="bottomLeftGrip"/> <Button Canvas.Bottom="-4" Canvas.Left="146" x:Name="bottomCenterGrip" /> <Button Canvas.Bottom="-5" Canvas.Right="-5" x:Name="bottomRightGrip" /> </Canvas>
Ma question est : comment je peux faire pour que tant qu'un bouton est cliqué et que la souris bouge le canvas de grips se redimensionne ?
J'ai essayé les events MouseDown, MouseUp, Click et MouseMove des boutons mais jusqu'ici, bernique...
Si je fais un Click et que je quitte le bouton, le bouton n'est plus considéré comme cliqué et si je bouge en dehors de la zone du bouton (qui est relativement petit) les évènements MouseMove ne sont plus lancés, donc forcément je n'arrive pas à redimensionner le canvas ...
Quand aux évènements MouseDown et MouseUp, pour un bouton ils n'ont pas l'air de se lancer. (et ce malgré l'utilisation d'un point d'arrêt dans les méthodes)
A moins de m'y être mal pris, quels autres moyens y auraient-ils pour que je puisse parvenir à mes fins.
NOTE : Les évènements ont été enregistrés dans le XAML mais pour plus de simplicité de lecture je les ai retirés...
Partager