alors là .... tu ne fais pas les choses à moitié!
je vais immédiatement le mettre en pratique, cela m'ouvre de
nouvelles perspectives dès la première lecture... je vais approfondir.
Hubert
Le 3 juil. 06 à 16:02, Arnaud Nicolet a écrit :
D'abord, trouver quelle image a été cliquée. Pour ce faire, il faut
d'abord faire en sorte que les images sachent où elles se trouvent
(elles n'ont pas de coordonnées x et y). Pour ça, il va falloir
faire une classe et l'utiliser à la place d'une "bête" image. Par
exemple, une nouvelle classe nommée:
MyPict (super=none)
Ajouter les propriétés suivantes:
x As integer
y As integer
Pict As Picture
(les mettre en "public")
La collection n'est donc plus de type "Picture" mais de type "MyPict".
Donc, pour dessiner les images, on aura quelque chose de ce genre
("AllMyPicts" est une propriété déclarée comme ça: "AllMyPicts(-1)
As MyPict"):
Sub Paint(g As Graphics)
dim i As integer
dim m As MyPict
dim p As Picture
for i=0 to UBound(AllMyPicts) 'On dessine toutes les images
contenues dans la collection
m=AllMyPicts(i)
if m<>nil then
p=m.Pict
if p<>nil then
g.DrawPicture p,m.x,m.y
end if
end if
next
end sub
Pour ajouter une image:
Sub AddImage(Pict as Picture)
dim m As MyPict
m=new MyPict
if m=nil then return
m.Pict=Pict
'On peut éventuellement assigner quelque chose à m.x et m.y pour
les coordonnées de départ
AllMyPicts.Append m
Canvas1.Refresh
end sub
Quand on clique dans le "canvas", pour trouver l'image cliquée, il
faut parcourir la collection, dans l'ordre inverse où les images
sont dessinées (puisque la dernière apparaît dessus) et faire ça:
Ajouter une propriété ("ClickedPicture As Integer") qui va se
souvenir quelle image a été cliquée (son index dans la collection).
Ajouter deux propriétés pour qu'on puisse déplacer les images (se
souvenir où se trouve la souris par rapport à l'image):
"PictMouseDeltaX As Integer" et "PictMouseDeltaY As Integer".
'x et y sont les coordonnés fournies par l'événement "mouseDown" du
"canvas".
dim i As Integer
dim m As MyPict
dim p As Picture
for i=UBound(AllMyPicts) downto 0
m=AllMyPicts(i)
if m<>nil then
p=m.Pict
if p<>nil then
if m.x<x and m.y<y and m.x+p.width>x and m.y+p.height>y
then
'C'est l'image cliquée!
ClickedPicture=i
PictMouseDeltaX=x-m.x
PictMouseDeltaY=y-m.y
return True 'Autoriser les événements MouseDrag
et MouseUp
end if
end if
end if
next
Dans "MouseDrag":
dim m As MyPict
dim p As Picture
if ClickedPicture<0 or ClickedPicture>UBound(AllMyPicts) then
return 'Hors de rangée
m=AllMyPicts(ClickedPicture)
if m=nil then Return
m.x=x-PictMouseDeltaX
m.y=y-PictMouseDeltaY
me.refresh 'À consolider pour éviter des rafraîchissements
excessifs sous les OS non-MacOS X.
Je sais, ça complique un tant soit peu les choses, mais:
1: ça fonctionne
2: ça supprime des limites
3: si la programmation était simple, ce serait moins drôle.
(je l'ai testé en même temps que j'ai écrit)
Le 3 juil. 06 à 11:49 Matin, Hubert JACQUOT-DION a écrit:
Dans le cas d'une collection, comment procèder pour qu'une image
intercepte le clic-maintenu pour le déplacement par souris?
Hubert
Le 1 juil. 06 à 16:47, Arnaud Nicolet a écrit :
Ne pourriez-vous pas utiliser un seul "canvas" avec une
collection ("array") d'images?
Ensuite, ce serait simplement une interversion de deux images
dans cette collection.
La seule chose (simple à faire) à modifier serait de connaître
quelle image a été cliquée (puisque, dans le cas du "canvas",
c'est le système qui distribue l'événement).
Le 1 juil. 06 à 11:31 Matin, Hubert JACQUOT-DION a écrit:
oui c'est çà, c'est bien dommage que l'on ne puisse pas
simplement changer cette valeur sans passer par une
reconstruction complète de la structure pour "simplement" passer
d'un plan à un autre. Car si cela est relativement simple avec
deux images, cela devient plus complexe avec x images, sans
compter la place importante en mémoire que cela engendre...
Hubert
Le 1 juil. 06 à 01:30, Arnaud Nicolet a écrit :
Le 30 juin 06 à 23:12 Soir, Stéphane Pinel a écrit:
Hubert,
Je ne comprends pas bien la question (pardonnez-moi).
"Existe-t-il un moyen plus élégant d'échanger le contenu d'un
canevas par un autre sans passer par la reconstitution de tout
le contenu dans des variables de passages ?"
Je pense avoir compris, il voudrait, étant donné que les
"canvas" peuvent être déplacés par la souris, changer celui qui
se trouve en avant plan (sans intervertir le contenu des deux
"canvas"). C'est ça, non?
Seulement, l'utilisation d'une variable de type image semble
être la seule solution étant donné qu'on ne peut pas, en RB,
changer l'ordre de l'axe Z des éléments.
|