Page 1 sur 2
[R] Barre d'images "glissante" ?
Posté : mar. 13 nov. 2012 11:28
par GhostLine
Salut à tous,
toujours pour mon projet en cours, je cherche un exemple de script qui me permette d'avoir une barre d'icônes (ou d'images) que je puisse faire défiler de gauche à droite au doigt (c'est à dire sans utiliser de barre de défilement mais en utilisant juste la souris).
Je ne sais pas trop comment cela s'appelle en anglais (j'ai tenté "sliding icon bar", "image carousel", sans tomber sur ce que je cherche) ... Help

Re: [..] Barre d'images "glissante" ?
Posté : mar. 13 nov. 2012 12:53
par GhostLine
Pour les intéressés, j'ai créé un topic sur le forum anglais (avec un montage photo) :
http://www.autoitscript.com/forum/topic ... ge-slider/
Re: [..] Barre d'images "glissante" ?
Posté : mar. 13 nov. 2012 14:25
par mikell
Pas trop difficile à réaliser
Mais...
Si tu cliques sur une image pour faire le drag, ça va aussi ouvrir la cible puisque tu veux que l'image soit cliquable
Tu vois le problème ?
Une solution qui me vient à l'idée : faire une gui à images popup standard avec un onevent sur le clic
droit qui déclenche une fonction à base de
Re: [..] Barre d'images "glissante" ?
Posté : mar. 13 nov. 2012 14:51
par GhostLine
Je pense que l'idée est plus de dire que tant que le clic est maintenu, il ne s'agit pas d'un clic de "sélection". Par contre, dès que le clic est "franc", à savoir une "tape", il s'agit bien d'une sélection. Le but avoué de ce procédé est de permettre une gestion complètement tactile de l'interface.
Re: [..] Barre d'images "glissante" ?
Posté : mar. 13 nov. 2012 15:18
par TommyDDR
ou sinon, vous stockez la position de la souris au moment du clic, et lors du relâchement, si celle-ci n'a pas bougé, vous faites votre action sinon rien (c'est que c'était un déplacement).
Re: [..] Barre d'images "glissante" ?
Posté : mar. 13 nov. 2012 19:48
par mikell
Effectivement c'est la meilleure solution (c'est comme ça que fonctionne explorer ? )
Ben voilà ya tout ce qu'il faut pour que tu te fasses ton script

Re: [..] Barre d'images "glissante" ?
Posté : mer. 14 nov. 2012 10:24
par GhostLine
Presque
Un point de départ pour un noob de la programmation de GDI+ m'aiderait aussi pas mal

Re: [..] Barre d'images "glissante" ?
Posté : mer. 14 nov. 2012 13:53
par mikell
Mais pourquoi tu veux y mettre du GDI+ ? c'est pas indispensable ^^
ça n'est nécessaire que si tu utilises des png, mais pour ça ya des exemples dans le fichier d'aide et d'autres inclus dans le dossier d'installation d'autoit
Pour faire l'image que tu as postée sur le forum US, des jpg ou des gif suffiraient largement
Re: [..] Barre d'images "glissante" ?
Posté : mer. 14 nov. 2012 14:00
par GhostLine
En fait, c'est plutôt pour la partie "glissement" que j'étais parti sur GDI+, car il me semblait plus adapté pour une zoulie animation bien fluide. Cela dit, je suis peut être complètement à coté de mes pompes ... mais j'ai du mal à trouver des exemples

Re: [..] Barre d'images "glissante" ?
Posté : mer. 14 nov. 2012 22:57
par mikell
Ben quelque chose comme ça (vite fait, c'est pour l'idée, ya certainement mieux et plus propre)
► Afficher le texte
Code : Tout sélectionner
#include <WindowsConstants.au3>
#include <Misc.au3>
Global $aSP
$gui = GuiCreate("test", @desktopwidth*3, 62, -@desktopwidth, 100, $WS_POPUP)
GUISetBkColor(0x000000, $gui)
$pic1 = GUICtrlCreatePic("logo.jpg", @desktopwidth*1.5, 10, 164, 42)
$pic2 = GUICtrlCreatePic("logo.jpg", @desktopwidth*1.5+174, 10, 164, 42)
GuiSetState()
WinSetTrans($gui, "", 200)
While 1
$msg = GUIGetMsg()
Switch $msg
Case $pic1, $pic2
Switch _Clic()
Case $pic1
Msgbox(0,"", "cliqué 1")
Case $pic2
Msgbox(0,"", "cliqué 2")
EndSwitch
EndSwitch
Wend
Func _Clic()
If _IsPressed("01") Then
$aSP = MouseGetPos()
$aWP = WinGetPos($gui)
Do
$aMP = MouseGetPos()
$dif = $aMP[0] - $aSP[0]
WinMove($gui, "", $aWP[0]+$dif, 100)
Until Not _IsPressed("01")
$aNP = MouseGetPos()
If $aNP[0] = $aSP[0] Then
$a = GUIGetCursorInfo()
Return $a[4]
EndIf
EndIf
EndFunc
à utiliser avec ça

- logo.jpg (5.83 Kio) Vu 5189 fois
Re: [..] Barre d'images "glissante" ?
Posté : jeu. 15 nov. 2012 12:31
par GhostLine
Allez, une petite dernière, pour manger avec ce super petit bout de script qui m'a bien aidé à comprendre le truc
Je suis en mode OnEvent activé dans mon programme : comment dois je modifier le code ci dessus pour réussir à avoir les mêmes fonctionnalités ?
Merci encore de votre patience les gars

Re: [..] Barre d'images "glissante" ?
Posté : jeu. 15 nov. 2012 13:49
par mikell
Véri izi

Le fait est, en mode onevent c'est bien plus propre ^^
► Afficher le texte
Code : Tout sélectionner
#include <WindowsConstants.au3>
#include <Misc.au3>
Opt("GUIOnEventMode", 1)
Global $aSP
$gui = GuiCreate("test", @desktopwidth*3, 62, -@desktopwidth, 100, $WS_POPUP)
$contextmenu = GUICtrlCreateContextMenu()
$exit = GUICtrlCreateMenuItem("Exit", $contextmenu)
GUICtrlSetOnEvent(-1, "_Exit")
GUISetBkColor(0x000000, $gui)
$pic1 = GUICtrlCreatePic("logo.jpg", @desktopwidth*1.5, 10, 164, 42)
GUICtrlSetOnEvent(-1, "_GereMoiCeTruc")
$pic2 = GUICtrlCreatePic("logo.jpg", @desktopwidth*1.5+174, 10, 164, 42)
GUICtrlSetOnEvent(-1, "_GereMoiCeTruc")
GuiSetState()
WinSetTrans($gui, "", 200)
While 1
Sleep(10)
Wend
;==================================
Func _Events()
Switch @GUI_CtrlId
Case $pic1
Msgbox(0,"", "cliqué 1")
Case $pic2
Msgbox(0,"", "cliqué 2")
EndSwitch
EndFunc
Func _GereMoiCeTruc()
If _IsPressed("01") Then
$aSP = MouseGetPos()
$aWP = WinGetPos($gui)
Do
$aMP = MouseGetPos()
$dif = $aMP[0] - $aSP[0]
WinMove($gui, "", $aWP[0]+$dif, 100)
Until Not _IsPressed("01")
$aNP = MouseGetPos()
If $aNP[0] = $aSP[0] Then _Events()
EndIf
EndFunc
Func _Exit()
Exit
EndFunc
Je t'en foutrai du "Merci les gars" , sur ce coup on dit "Merci mikell"

Re: [..] Barre d'images "glissante" ?
Posté : jeu. 15 nov. 2012 14:23
par GhostLine
Merki Michel ?

Re: [R] Barre d'images "glissante" ?
Posté : jeu. 15 nov. 2012 15:02
par mikell
C'est très bien
Tiens, pour un user sympathique, voilà la version GDI+ pour png (qui permet d'utiliser des png intégrant de la transparence)
Re: [R] Barre d'images "glissante" ?
Posté : jeu. 15 nov. 2012 15:26
par sylvanie
C'est rigolo comme idée.
Je suis reparti du premier script avec logo de Mikell, pour cette fois ne pas bouger la GUI, mais les contrôles.
Du coups on peut s'amuser à les faire réapparaître de l'autre côté de l'écran comme si c'était un carrousel :
► Afficher le texte
Code : Tout sélectionner
#include <WindowsConstants.au3>
#include <Misc.au3>
#include <Array.au3>
Global $aSP
$gui = GuiCreate("test", @desktopwidth*3, 62, -@desktopwidth, 100, $WS_POPUP)
GUISetBkColor(0x000000, $gui)
$pic1 = GUICtrlCreatePic("logo.jpg", @desktopwidth*1.5, 10, 164, 42)
$pic2 = GUICtrlCreatePic("logo.jpg", @desktopwidth*1.5+174, 10, 164, 42)
GuiSetState()
WinSetTrans($gui, "", 200)
Dim $Liste_pic[2]=[$pic1,$pic2]
$longueur_image=164
While 1
$msg = GUIGetMsg()
Switch $msg
Case $pic1, $pic2
Switch _Clic()
Case $pic1
Msgbox(0,"", "cliqué 1")
Case $pic2
Msgbox(0,"", "cliqué 2")
EndSwitch
EndSwitch
Wend
Func _Clic()
If _IsPressed("01") Then
$aSP = MouseGetPos()
$aWP = WinGetPos($gui)
$aMP = MouseGetPos()
$cpt=0
Do
$dif = $aMP[0] - $aSP[0]
;WinMove($gui, "", $aWP[0]+$dif, 100)
For $ind=0 to UBound($Liste_pic)-1
$poscrl = ControlGetPos("test","",$Liste_pic[$ind])
If $poscrl[0] < @DesktopWidth - $longueur_image Then
GUICtrlSetPos($Liste_pic[$ind],@DesktopWidth*2 -$longueur_image-10)
For $ind2=$ind-1 To 0 Step -1
GUICtrlSetPos($Liste_pic[$ind2],@DesktopWidth*2 -($ind-$ind2+1)*($longueur_image+10))
Next
ElseIf $poscrl[0] <= 2*@DesktopWidth Then
GUICtrlSetPos($Liste_pic[$ind],$poscrl[0]-$dif)
Else
GUICtrlSetPos($Liste_pic[$ind],@DesktopWidth)
For $ind2=$ind+1 To UBound($Liste_pic)-1
GUICtrlSetPos($Liste_pic[$ind2],@DesktopWidth + ($ind2-$ind)*($longueur_image+10))
Next
EndIf
Next
$aMP = $aSP
$aSP = MouseGetPos()
If $dif <> 0 Then $cpt+=1
Until Not _IsPressed("01")
If $cpt>1 Then Return
$aNP = MouseGetPos()
If $aNP[0] = $aSP[0] Then
$a = GUIGetCursorInfo()
Return $a[4]
EndIf
EndIf
EndFunc
Re: [R] Barre d'images "glissante" ?
Posté : jeu. 15 nov. 2012 17:54
par mikell
sylvanie qui aime toujours autant les complications
Je sais bien que
http://www.autoitscript.fr/forum/viewto ... 643#p73643
mais tout de même, 2 lignes de code à rajouter c'est suffisant
► Afficher le texte
Code : Tout sélectionner
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Misc.au3>
#include <GDIPlus.au3>
Opt("GUIOnEventMode", 1)
Global Const $AC_SRC_ALPHA = 1
Global $aSP, $gui[3][2]
_GDIPlus_Startup()
$logo = @ScriptDir & "\logo.png"
For $i = 0 to 2
$gui[$i][0] = _CreateGui($i, $logo)
Next
_GDIPlus_Shutdown()
While 1
Sleep(10)
Wend
;==========================================
Func _CreateGui($n, $img)
Local $hImage = _GDIPlus_ImageLoadFromFile($img)
$iX = _GDIPlus_ImageGetWidth ($hImage)
$iY = _GDIPlus_ImageGetHeight ($hImage)
Local $gui0 =GuiCreate("", $iX, $iY, @desktopwidth/2+($iX+10)*$n, 110, $WS_POPUP, $WS_EX_LAYERED)
GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, "_GereMoiCeTruc")
GUISetOnEvent($GUI_EVENT_SECONDARYUP, "_Exit")
SetBitMap($gui0, $hImage, 200)
GuiSetState()
_GDIPlus_ImageDispose($hImage)
Return $gui0
EndFunc
Func _GereMoiCeTruc()
$aSP = MouseGetPos()
For $i = 0 to 2
$posall = WinGetPos($gui[$i][0])
$gui[$i][1] = $posall[0]
Next
Do
$aMP = MouseGetPos()
$dif = $aMP[0] - $aSP[0]
For $i = 0 to 2
If $gui[$i][1]+$dif > @desktopwidth-$posall[2] Then $gui[$i][1] -= @desktopwidth-$posall[2]
If $gui[$i][1]+$dif < 0 Then $gui[$i][1] += @desktopwidth-$posall[2]
WinMove($gui[$i][0], "", $gui[$i][1]+$dif, 110)
Next
Until Not _IsPressed("01")
$aNP = MouseGetPos()
If $aNP[0] = $aSP[0] Then _Events()
EndFunc
Func _Events()
Switch @GUI_WinHandle
Case $gui[0][0]
Msgbox(0,"", "cliqué 1")
Case $gui[1][0]
Msgbox(0,"", "cliqué 2")
Case $gui[2][0]
Msgbox(0,"", "cliqué 3")
EndSwitch
EndFunc
Func _Exit()
Exit
EndFunc
Func SetBitmap($hGUI, $hImage, $iOpacity)
Local $hScrDC, $hMemDC, $hBitmap, $hOld, $pSize, $tSize, $pSource, $tSource, $pBlend, $tBlend
$hScrDC = _WinAPI_GetDC(0)
$hMemDC = _WinAPI_CreateCompatibleDC($hScrDC)
$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
$hOld = _WinAPI_SelectObject($hMemDC, $hBitmap)
$tSize = DllStructCreate($tagSIZE)
$pSize = DllStructGetPtr($tSize )
DllStructSetData($tSize, "X", _GDIPlus_ImageGetWidth ($hImage))
DllStructSetData($tSize, "Y", _GDIPlus_ImageGetHeight($hImage))
$tSource = DllStructCreate($tagPOINT)
$pSource = DllStructGetPtr($tSource)
$tBlend = DllStructCreate($tagBLENDFUNCTION)
$pBlend = DllStructGetPtr($tBlend)
DllStructSetData($tBlend, "Alpha" , $iOpacity )
DllStructSetData($tBlend, "Format", $AC_SRC_ALPHA)
_WinAPI_UpdateLayeredWindow($hGUI, $hScrDC, 0, $pSize, $hMemDC, $pSource, 0, $pBlend, $ULW_ALPHA)
_WinAPI_ReleaseDC (0, $hScrDC)
_WinAPI_SelectObject($hMemDC, $hOld)
_WinAPI_DeleteObject($hBitmap)
_WinAPI_DeleteDC ($hMemDC)
EndFunc
à tester avec le logo ci-dessous, mais c'est plus spectaculaire avec le logo Autoit en haut à droite de cette page

- logo.png (3.18 Kio) Vu 5158 fois
Re: [R] Barre d'images "glissante" ?
Posté : jeu. 15 nov. 2012 18:06
par sylvanie
Bah, c'est pas vraiment le goût de la complication, c'est surtout que je n'avais pas pensé à simplement incrémenter la coordonnée en cours de déplacement avec la longueur d'écran. Bien vu !
Comme dans mon code, plusieurs abscisses étaient candidates à un renvoie fixe à gauche ou à droite, je me trouvais dans la situation que je devait réarmoniser ce qui avait été déplacé avant (ou après ...) sous peine de voir mes images se chevaucher ou s'éloigner.
Maintenant le top, c'est de merger les deux méthode pour ne plus avoir qu'une Gui, mais là j'ai la flemme

Re: [R] Barre d'images "glissante" ?
Posté : jeu. 15 nov. 2012 18:12
par mikell
Je t'avoue que j'avais rien compris à ton code...
Maintenant avoir une seule gui, je vois pas bien comment faire avec du png, et le png est quand même vachement plus sympa, t'as testé mon code au-dessus ? (je viens de l'éditer)
Re: [R] Barre d'images "glissante" ?
Posté : jeu. 15 nov. 2012 18:32
par sylvanie
Oui, je viens d'essayer la conversion, et effectivement, une fois les GDI dessinés, on n' a pas de retours d'identifiant de contrôle ...
Sinon de visu, la version png est très belle.
j'ai rectifié quand même la mouture "contrôles" pour faire disparaître le bandeau :
► Afficher le texte
Code : Tout sélectionner
#include <WindowsConstants.au3>
#include <Misc.au3>
#include <Array.au3>
#include <WinAPI.au3>
Global $aSP
$gui = GuiCreate("test", @desktopwidth*3, 62, -@desktopwidth, 100, $WS_POPUP,$WS_EX_LAYERED)
GUISetBkColor(0x000000, $gui)
$pic1 = GUICtrlCreatePic("logo.jpg", @desktopwidth*1.5, 10, 164, 42)
$pic2 = GUICtrlCreatePic("logo.jpg", @desktopwidth*1.5+174, 10, 164, 42)
GuiSetState()
_WinAPI_SetLayeredWindowAttributes($gui, 0x000000,200);,3,true)
ConsoleWrite(@error&@CRLF)
;WinSetTrans($gui, "", 200)
Dim $Liste_pic[2]=[$pic1,$pic2]
$longueur_image=164
While 1
$msg = GUIGetMsg()
Switch $msg
Case $pic1, $pic2
Switch _Clic()
Case $pic1
Msgbox(0,"", "cliqué 1")
Case $pic2
Msgbox(0,"", "cliqué 2")
EndSwitch
EndSwitch
Wend
Func _Clic()
If _IsPressed("01") Then
$aSP = MouseGetPos()
$aWP = WinGetPos($gui)
$aMP = MouseGetPos()
$cpt=0
Do
$dif = $aMP[0] - $aSP[0]
;WinMove($gui, "", $aWP[0]+$dif, 100)
For $ind=0 to UBound($Liste_pic)-1
$poscrl = ControlGetPos("test","",$Liste_pic[$ind])
If $poscrl[0] < @DesktopWidth - $longueur_image Then
GUICtrlSetPos($Liste_pic[$ind],@DesktopWidth*2 -$longueur_image-10)
For $ind2=$ind-1 To 0 Step -1
GUICtrlSetPos($Liste_pic[$ind2],@DesktopWidth*2 -($ind-$ind2+1)*($longueur_image+10))
Next
ElseIf $poscrl[0] <= 2*@DesktopWidth Then
GUICtrlSetPos($Liste_pic[$ind],$poscrl[0]-$dif)
Else
GUICtrlSetPos($Liste_pic[$ind],@DesktopWidth)
For $ind2=$ind+1 To UBound($Liste_pic)-1
GUICtrlSetPos($Liste_pic[$ind2],@DesktopWidth + ($ind2-$ind)*($longueur_image+10))
Next
EndIf
Next
$aMP = $aSP
$aSP = MouseGetPos()
If $dif <> 0 Then $cpt+=1
Until Not _IsPressed("01")
If $cpt>1 Then Return
$aNP = MouseGetPos()
If $aNP[0] = $aSP[0] Then
$a = GUIGetCursorInfo()
Return $a[4]
EndIf
EndIf
EndFunc
Re: [R] Barre d'images "glissante" ?
Posté : jeu. 15 nov. 2012 18:51
par mikell
Hum avec l'autoit 3.3.6.1, si on met pas la coordonnée y dans le ControlSetPos, on a une erreur
Et surtout ya du flicker quand on déplace les controles... il avait pas tort GhostLine quand il évoquait la fluidité avec GDI
Décidément la version png reste clairement la plus mieux
