realbasic-nug.fr
[Top] [All Lists]

Re: passer au premier plan

To: REALbasic NUG French <realbasic-nug dot fr at lists dot realsoftware dot com>
Subject: Re: passer au premier plan
From: Arnaud Nicolet <arnaud at tribu dot ch>
Date: Mon, 3 Jul 2006 16:02:53 +0200
Delivered-to: listarchive at realsoftware dot com
Delivered-to: realbasic-nug dot fr at lists dot realsoftware dot com
References: <61789617-F2B0-40A2-B47C-149557105A7F at mac dot com> <B591136B-FE89-4183-91F4-C0067F6A3316 at realsoftware dot fr> <E5BB561C-B810-418D-A78A-058D45EBF8A0 at tribu dot ch> <D71B46AA-16C1-4087-99FC-5B29C3E839CD at mac dot com> <ED5BD140-E297-49F7-8140-58B47FFC3EE0 at tribu dot ch> <B219126F-6A22-4F92-A9EB-7C9F7BD8FAAA at mac dot com>
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.






<Prev in Thread] Current Thread [Next in Thread>