Page 1 sur 1
[R] Drag Drop Image
Posté : ven. 24 juil. 2009 13:21
par TommyDDR
Bonjour,
Je suis sur un projet de puzzle sous autoit.
J'ai une fenêtre avec des images "GUICtrlCreatePic()" sur la gauche et une grille sur la droite, j'aimerai pouvoir faire un Drag&Drop des images vers la grille.
Est ce possible ?
(Si oui, comment ? Un style à ajouter ou autre ?)
Merci
Re: [..] Drag Drop Image
Posté : ven. 24 juil. 2009 17:21
par Iste
Oui c'est possible. Il suffit de crée une GUI sans rien d'autre que l'image qui suit le curseur.
Tien, regarde ce magnifique script :p
http://www.autoitscript.fr/forum/viewto ... f=6&t=2045
Plus précisément le "Case _IsPressed(1) = 1"
Re: [..] Drag Drop Image
Posté : ven. 24 juil. 2009 17:59
par TommyDDR
Désolé mais pour des raisons de sauvegarde je ne peux pas utilisé cette technique, il faut que cela se trouve dans la même fenêtre
Re: [..] Drag Drop Image
Posté : ven. 24 juil. 2009 18:30
par Iste
Ben, dans ce cas, suffit au lieux de créer une win et la déplacer, simplement supprimer l'image et la recréer (mais je reste persuadé que la solution proposée avant est meilleur, car moins lourde, et on évitera surement des clignotement. Par contre, ca demande plus de code bien sur.)
Je vais essayer de faire un exemple simple et j'edite
wala,
Code : Tout sélectionner
#Include <Misc.au3>
#include <WindowsConstants.au3>
$gui = GUICreate("",500,500)
Global $pic[4]
For $i = 0 To 3
$pic[$i] = GUICtrlCreatePic("pic"&$i&".JPG",Random(0,500-241),Random(0,500-181),241,181)
Next
GUISetState()
While 1
$msg = GUIGetMsg()
Select
Case $msg = -3
Exit
Case _IsPressed(1) = 1
$cursor = GUIGetCursorInfo($gui)
If WinActive($gui) And $cursor[4] - 2 > 0 Then
$sousgui = GUICreate("",241,181,MouseGetPos(0)-120,MouseGetPos(1)-90,$WS_POPUPWINDOW, $WS_EX_TOOLWINDOW+$WS_EX_TOPMOST )
GUICtrlCreatePic("pic"&$cursor[4] - 3&".JPG",0,0,241,181)
GUISetState()
GUICtrlDelete($cursor[4])
While 1
Sleep(10)
WinMove($sousgui, "", MouseGetPos(0)-120,MouseGetPos(1)-90)
If Not _IsPressed(1) Then ExitLoop
WEnd
GUIDelete($sousgui)
GUISwitch ($gui)
$cursor2 = GUIGetCursorInfo($gui)
$pic[$cursor[4] - 3] = GUICtrlCreatePic("pic"&$cursor[4] - 3&".JPG",$cursor2[0]-120,$cursor2[1]-90,241,181)
EndIf
EndSelect
WEnd
Et les images
- pic.rar
- (30.52 Kio) Téléchargé 76 fois
Re: [..] Drag Drop Image
Posté : sam. 25 juil. 2009 04:21
par SagePourpre
ou encore...
► Afficher le texte
Code : Tout sélectionner
#include <GUIConstants.au3>
#include <GUIConstantsEx.au3>
#include<WindowsConstants.au3>
#include<misc.au3>
#include <StaticConstants.au3>
Opt("GuiOnEventMode",1)
Opt("MouseCoordMode",2)
$width = 600
$height = 600
$GUI = GUICreate("test",$width,$height)
GUISetOnEvent($GUI_EVENT_CLOSE,"quitter")
$pic = "M:\Multimédia\Visuel\Images, Photos\1. Moi\Pouf\Pouf Icone\Pouf 50 .gif"
$picW = 200
$picH = 200
$picc = guictrlcreatepic($pic,0,0,$picW,$picH,$SS_NOTIFY)
GUICtrlSetOnEvent($picc,"move")
GUISetState()
While 1
$pos = MouseGetPos()
ToolTip($pos[0] & " / " & $pos[1],0,0)
Sleep(100)
WEnd
Func move()
while _IsPressed(01)
$pos = MouseGetPos()
ToolTip($pos[0] & " / " & $pos[1],0,0)
GUICtrlSetPos(@GUI_CtrlId,$pos[0] - $picW/2 ,$pos[1] - $pich/2,-1,-1)
Sleep(100)
WEnd
EndFunc
Func quitter()
Exit
EndFunc
En gros, j'ai utilisé
Opt("GuiOnEventMode",1)
Opt("MouseCoordMode",2)
ensuite il est important de rajouter $SS_NOTIFY comme style pour la pic
On crée un événement
GuiCtrlSetOnEvent($picc,"move")
et dans la fonction "move" on retrouve
Code : Tout sélectionner
while _IsPressed(01)
$pos = MouseGetPos()
ToolTip($pos[0] & " / " & $pos[1],0,0)
GUICtrlSetPos(@GUI_CtrlId,$pos[0] - $picW/2 ,$pos[1] - $pich/2,-1,-1)
Sleep(100)
WEnd
Le $picW et $picH de cet exemple sont la largeur et hauteur de l'image (pour que l'image soit déplacée selon son centre) .
Pour voir l'exemple complet, utilise le script dans les spoilers et remplace le chemin de $pic pour une image valide dans ton disque dur.
Ensuite, il devrait être relativement facile de faire un "aimant" (Si la personne lâche le morceaux dans la grille mais qu'il n'est pas parfaitement
positionné, le morceau se positionne de lui-même)
Voilà !
Re: [..] Drag Drop Image
Posté : sam. 25 juil. 2009 11:03
par TommyDDR
Merci Iste pour ta réponse mais celle de SagePourpre est celle qu'il me fallait
Un grand merci a SagePourpre
Résolu.
Re: [..] Drag Drop Image
Posté : sam. 25 juil. 2009 11:13
par SagePourpre
Re: [..] Drag Drop Image
Posté : sam. 25 juil. 2009 11:31
par TommyDDR
Rectification, j'ai un petit problème ^^'
Quand je veux déplacer une piece de la liste (qui se trouve dans une GUI Fille a la Gui de la grille), celle ci va en dessou de la GUI Mère.
Pour ceux qui connaissent, avec un pote nous essayons de faire Eternity 2 sur PC. (Et il est interdit de dévoilé les formes/couleur des pièces ^^' d'où le rouge)
Voici une impr :

- Eternity2.jpg
Comme on peut le voir, la pièce déplacée se glisse sous la GUI mère.
Pour l'instant je cliquai sur la pièce dans la liste puis cliquai sur la grille pour poser la pièce.
Voila.
Re: [..] Drag Drop Image
Posté : sam. 25 juil. 2009 13:34
par SagePourpre
Mouaip ... Il y'a moyen de faire ça ...
En gros, il faut que tu effaces le control (GuiCtrlDelete),
que tu mettes le focus sur l'autre gui (GuiSetState($GUI_FOCUS,$NOM_DE_LA_GUI)
et puis que tu recrée le contrôle aux nouvelles coordonnées, sans oublier
de le remettre en $SS_NOTIFY et de remettre le GuiCtrlSetOnEvent
Si tu ne fais pas ça, GuiCtrlSetPos va mettre le contrôle aux coordonnées désirées mais, comme
tu l'as déjà expérimenté, il ne change pas de GUI automatiquement. Il reste toujours sur la gui ou il a
été crée.
Re: [..] Drag Drop Image
Posté : sam. 25 juil. 2009 15:52
par Iste
Tien donc, comme c'est étrange
► Afficher le texte

Sage Pourpre = 0
Iste = 1

Enfin, 1 partout plutot, car vu le grand nombre de contrôle que tu as, le mode événementiel est un passage obligé.
Mais le coté [suppression d'image]->[création de GUI flotante] / [suppression de GUI flotante]->[création d'image] est vraiment le plus simple.
Surtout que avec un quadrillage, 'il suffit' de savoir au dessus de quel case se trouve ton curseur au moment du déclic pour savoir ou créer la nouvelle image
Re: [..] Drag Drop Image
Posté : sam. 25 juil. 2009 19:26
par SagePourpre
Bon bon ok... j'avoue que mon idée était idéale avant que je sache qu'il y'avait deux gui d'impliquées.
Mais pour ma défense, euh... le cri du petit canard chinois, en période de rut, émet le son suivant ...
Re: [..] Drag Drop Image
Posté : dim. 26 juil. 2009 02:26
par SagePourpre
Ceci fonctionne bien...
► Afficher le texte
Code : Tout sélectionner
#include <GUIConstants.au3>
#include <GUIConstantsEx.au3>
#include<WindowsConstants.au3>
#include<misc.au3>
#include <StaticConstants.au3>
Opt("GuiOnEventMode", 1)
Opt("MouseCoordMode", 2)
$width = 300
$height = 600
$GUI = GUICreate("test", $width, $height, 0)
GUISetOnEvent($GUI_EVENT_CLOSE, "quitter")
$picW = 200
$picH = 200
$pic = "M:\Multimédia\Visuel\Images, Photos\1. Moi\Pouf\Pouf Icone\Pouf 50 .gif"
$_pic = GUICtrlCreatePic($pic, 0, 0, $picW, $picH, $SS_NOTIFY)
GUICtrlSetOnEvent($_pic, "move")
$flag = 0
GUISetState()
$gui2 = GUICreate("test 2", $width, $height, 310)
GUISetOnEvent($GUI_EVENT_CLOSE, "quitter")
GUISetState()
While 1
Sleep(100)
WEnd
Func quitter()
Exit
EndFunc ;==>quitter
Func move()
While _IsPressed(01)
$pos = MouseGetPos()
ToolTip($pos[0] & " / " & $pos[1])
GUICtrlSetPos($_pic, $pos[0] - $picW / 2, $pos[1] - $picH / 2)
Sleep(40)
Select
Case $pos[0] > 300
createpic(1)
ExitLoop
Case $pos[0] < 0
createpic(0)
ExitLoop
EndSelect
WEnd
If _IsPressed(01) Then move()
EndFunc ;==>move
Func createpic($ctrl = 0)
GUICtrlDelete(@GUI_CtrlId)
Switch $ctrl
Case 0
GUISetState($GUI_FOCUS, $gui)
$left = 250
Case 1
GUISetState($GUI_FOCUS, $gui2)
$left = - 50
EndSwitch
$pos = MouseGetPos()
$_pic = GUICtrlCreatePic($pic,$left, $pos[1] - $picH/2, $picW, $picH, $SS_NOTIFY)
GUICtrlSetOnEvent($_pic, "move")
MouseUp("left")
MouseDown("left")
EndFunc ;==>createpic