Page 1 sur 1
Passer une image au premier plan
Posté : jeu. 08 août 2019 17:42
par littlechiki
Bonjour !
J'ai créé un petit programme qui me permet de créer des images aléatoires sur une gui et je me retrouve avec un problème. En fait mes images sont créées aléatoirement selon la position de la souris et j'ai une image pour voir quelle est l'image que j'ai sélectionné, celle ci est donc supposé se retrouver au dessus. mon problème est donc de comprendre comment mettre cette image au dessus des autres. Comme rien ne vaut un petit exemple, voila une partie de mon code.
#Include <GUIConstantsEx.au3>#include <Misc.au3>Opt("PixelCoordMode", 0)Opt("MouseCoordMode", 0)$GUI = GUICreate("",1200,1000)Dim $pos[4] = [600,450,100,100]$start = GUICtrlCreatePic(".\0.gif",600,450,100,100)$zone = GUICtrlCreatePic(".\zone.gif",600,450,100,100)GUISetState(@SW_SHOW)While 1 If _IsPressed(01) Then $mouse = MouseGetPos() $color = PixelGetColor($mouse[0],$mouse[1]) For $u = 0 To 8 For $i = 1 To 11 If $mouse[0] >= $i*100+4 And $mouse[0] < $i*100+104 And $mouse[1] >= $u*100+77 And $mouse[1] < $u*100+177 Then If $color = 15790320 Then $pos[0] = $i*100 $pos[1] = $u*100+50 GUICtrlSetPos($zone,$i*100,$u*100+50) GUICtrlCreatePic(".\Cartes\0.gif",$pos[0],$pos[1]) EndIf EndIf Next Next EndIf If _IsPressed(02) Then $mouse = MouseGetPos() $color = PixelGetColor($mouse[0],$mouse[1]) For $u = 0 To 8 For $i = 1 To 11 If $mouse[0] >= $i*100 And $mouse[0] < $i*100+104 And $mouse[1] >= $u*100+77 And $mouse[1] < $u*100+177 Then If $color <> 15790320 Then $pos[0] = $i*100 $pos[1] = $u*100+50 GUICtrlSetPos($zone,$pos[0],$pos[1]) EndIf EndIf Next Next EndIf Switch GUIGetMsg() Case $GUI_EVENT_CLOSE Exit EndSwitchWEnd
Ici, le clic droit permet de sélectionner une image et de normalement mettre l'image zone par dessus, ce qui ne marche pas et voila donc mon problème.
Voila, je vous remercie par avance pour vos réponses (ce qui ne m'empêchera pas de vous remercier quand même après !) !
Re: Passer une image au premier plan
Posté : jeu. 08 août 2019 18:16
par walkson
Bonjour,
Le plus simple:
Un seul pic suffit pour plusieurs images
Après, si vous devez travailler beaucoup sur les images, je vous conseille GdiPlus (voir l'aide)
Voir exemple 2
On obtient de meilleurs résultats mais c'est plus compliqué (au début)
Si vous voulez jouer uniquement sur le pic, il y a
GUICtrlSetState ( controlID, state )
avec
$GUI_ONTOP (2048) Le contrôle aura l'attribut Ontop (au dessus des autres fenêtres) (zOrdering).
Re: Passer une image au premier plan
Posté : jeu. 08 août 2019 20:29
par littlechiki
Et bien me voila avec plein d'éléments de réponse ! Merci merci ! je vais m'empresser de tester tout cela ! merci beaucoup pour ça !
Re: Passer une image au premier plan
Posté : jeu. 08 août 2019 20:53
par walkson
Un p'tit bout de code, si cela vous inspire
#Include <GUIConstantsEx.au3>#include <Misc.au3>Opt("PixelCoordMode", 0)Opt("MouseCoordMode", 0)$GUI = GUICreate("",1200,1000)$start = GUICtrlCreatePic("",600,450,100,100)GUICtrlSetImage($start, ".\0.gif")$buton = GUICtrlCreateLabel("Clic droite ou gauche",50,50,100,25)$retour = TrueGUISetState(@SW_SHOW)While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE Exit Case $GUI_EVENT_PRIMARYDOWN ;clic gauche => vrai, faux $retour = Not $retour If $retour = True Then GUICtrlSetImage($start, ".\0.gif") Else GUICtrlSetImage($start, ".\zone.gif") EndIf Case $GUI_EVENT_SECONDARYDOWN; clic droit, la même image GUICtrlSetImage($start, ".\zone.gif") EndSwitchWEnd
Re: Passer une image au premier plan
Posté : ven. 09 août 2019 12:41
par littlechiki
Ça pourrait marcher mais dans ce cas, je n'ai qu'une seule image qui change. Ici le but serait de passer l'image zone au dessus de l'image 0 mais que l'image 0 reste quand même visible.
Ceci dit, ça m'inspire quand même parce que le $GUI_EVENT_PRIMARYDOWN et le GUI_EVENT_SECONDARYDOWN sont beaucoup plus pratique que mon _IsPressed qui se répète tant que la touche est enfoncé !
J'ai essayé le $GUI_ONTOP mais j'ai l'impression que ça ne marche que pour les images créées au lancement de la gui et pas pour celle qui sont rajoutées après la création.
Mais j'ai commencé a faire des test avec GDIPlus (c'est compliqué en effet mais je m'en sort) et j'en suis encore à la phase de test !
Mais merci, c'est gentil ! si je ne trouve toujours pas, je ne manquerai pas de redemander de l'aide ! Et je suis bien évidemment toujours ouvert à des proposition !
Re: Passer une image au premier plan
Posté : sam. 10 août 2019 13:10
par littlechiki
Bon je repasse le sujet en non résolu parce que malgré toutes ces tentatives, rien ne marche...
Pour le GDIPlus, ça marche mais je n'arrive pas à faire en sorte que l'image se déplace un fois créée.
Pour le
GUICtrlSetState($zone,$GUI_ONTOP)
, j'ai l'impression que il ne marche qu'avec les images créées avant et non pas pour les images que je créé pendant que la gui est active.
J'ai bien tente un
pour le passer en arrière plan mais en vain... Je suis perdu là.
Re: Passer une image au premier plan
Posté : sam. 10 août 2019 15:53
par mikell
En fait je ne comprends pas très bien ce que tu cherches à faire, le code du post #1 a l'air de marcher pas mal ?
Pourrais-tu reformuler la question plus précisément, avec explications claires et détaillées (façon instituteur de cours préparatoire)
![Mr. Green :mrgreen:](./images/smilies/icon_mrgreen.gif)
Re: Passer une image au premier plan
Posté : sam. 10 août 2019 17:50
par littlechiki
Oui bien sûr pas de problème. En fait j'ai l'intention de créer une appli de création de carte procédurale (il y à probablement plus simple que comme je le fait mais ça m'amuse de faire comme ça !) et j'ai donc réussi a faire quelque chose de bien mais j'aimerais pouvoir sélectionner une carte après l'avoir créée et mettre le focus dessus en l'entourant dans une case rouge (l'image zone).
Mon clic gauche servirait alors à créer une image et le clic droit d'afficher l'image zone par dessus l'image créée précédemment pour voir quelle est la carte sélectionnée.
Pour l'instant, faire le clic droit met b'in l'image zone au bon endroit mais malheureusement l'image n'est pas visible car elle est cachée par les cartes créées.
J'espère que c'est plus clair comme ça mais je peut reformuler si ce n'est toujours pas clair !
Re: Passer une image au premier plan
Posté : sam. 10 août 2019 19:06
par walkson
Bonjour,
ben, je n'ai pas tout compris
![Shocked :shock:](./images/smilies/icon_eek.gif)
C'est quoi une carte procédurale ?
Pour le
GUICtrlSetState($zone,$GUI_ONTOP)
je n'ai pas de problème
#include <GUIConstantsEx.au3>#include <StaticConstants.au3>#include <WindowsConstants.au3>Global $Form1 = GUICreate("", 615, 438, 192, 124)GUICtrlCreateLabel("Clic droit => image mobile / Reclic droit => image immobile", 5,5,290,20,$SS_SIMPLE)Global $Pic1 = GUICtrlCreatePic(".\zone.gif", 125, 85, 100, 100)Global $Pic2 = GUICtrlCreatePic(".\0.gif", 120, 80, 100, 100)GUISetState(@SW_SHOW)Global $retour = True, $suite = FalseWhile 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE Exit Case $GUI_EVENT_PRIMARYDOWN $retour = Not $retour If $retour = True Then GUICtrlSetState($Pic1,2048) If $retour = False Then GUICtrlSetState($Pic2,2048) WinSetTitle($Form1, "", $retour) Case $GUI_EVENT_SECONDARYDOWN $suite = Not $suite Case $GUI_EVENT_MOUSEMOVE If $suite = True Then $mouse = GUIGetCursorInfo($Form1) GUICtrlSetPos($Pic1,$mouse[0], $mouse[1]) GUICtrlSetPos($Pic2,$mouse[0] , $mouse[1]) WinSetTitle($Form1, "", $mouse[0] &"/"& $mouse[1]) EndIf EndSwitchWEnd
J'ai rajouté une image qui suit la souris (clic droit) et pas de problème non plus
Re: Passer une image au premier plan
Posté : sam. 10 août 2019 21:45
par littlechiki
En fait ce serait une carte(genre carte du monde) qui pourrait être dessinée aléatoirement si on clic à un endroit. Exemple : je clic gauche à un endroit de la gui et une image se place (choisie aléatoirement parmi d'autres cartes) et si je clic droit, cela met cette image précédemment choisie en évidence en l'entourant par un carré rouge.
Par exemple sur le premier code que j'ai donné (que j'ai modifié très légèrement parce que j'ai remarqué un problème qui empêchait le bon fonctionnement), si vous cliquez gauche juste à coté du 0 déjà présent, un autre 0 sera créé a coté. SI vous faites un clic droit sur l'image nouvellement créée, l'image zone disparaîtra du 0 de base mais ne réapparaîtra pas sur le nouveau 0, ce qu'il est censé faire.
#Include <GUIConstantsEx.au3>#include <Misc.au3>Opt("PixelCoordMode", 0)Opt("MouseCoordMode", 0)$GUI = GUICreate("",1200,1000)Dim $pos[4] = [600,450,100,100]$start = GUICtrlCreatePic(".\0.gif",600,450,100,100)$zone = GUICtrlCreatePic(".\zone.gif",600,450,100,100)GUISetState(@SW_SHOW)While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE Exit Case $GUI_EVENT_PRIMARYDOWN $mouse = MouseGetPos() $color = PixelGetColor($mouse[0],$mouse[1]) For $u = 0 To 8 For $i = 1 To 11 If $mouse[0] >= $i*100+4 And $mouse[0] < $i*100+104 And $mouse[1] >= $u*100+77 And $mouse[1] < $u*100+177 Then If $color = 15790320 Then $pos[0] = $i*100 $pos[1] = $u*100+50 GUICtrlCreatePic(".\0.gif",$pos[0],$pos[1]) EndIf EndIf Next Next Case $GUI_EVENT_SECONDARYDOWN $mouse = MouseGetPos() $color = PixelGetColor($mouse[0],$mouse[1]) For $u = 0 To 8 For $i = 1 To 11 If $mouse[0] >= $i*100 And $mouse[0] < $i*100+104 And $mouse[1] >= $u*100+77 And $mouse[1] < $u*100+177 Then If $color <> 15790320 Then $pos[0] = $i*100 $pos[1] = $u*100+50 GUICtrlSetPos($zone,$pos[0],$pos[1]) EndIf EndIf Next Next EndSwitchWEnd
J'aimerais que l'image zone (le carré rouge) apparaisse autour de la nouvelle image quand je fait un clic droit.
Re: Passer une image au premier plan
Posté : dim. 11 août 2019 12:42
par mikell
En fait le moyen le plus simple est de faire une 2ème gui pour "zone"
Dans le code ci-dessous, le clic gauche crée des images dans la gui 1, le clic droit crée la gui $zone sur l'image concernée (mais seulement si le pointeur de souris est sur une image)
J'ai fait compact pour montrer l'idée, n'hésite pas à demander si certains points te paraissent obscurs
#Include <GUIConstantsEx.au3>#include <WindowsConstants.au3> #include <WinAPI.au3>Opt("MouseCoordMode", 2)$GUI = GUICreate("",1200,1000, 150, 50)$start = GUICtrlCreatePic(".\0.gif",600,400,100,100)GUICtrlSetState($start,$GUI_DISABLE)GUISetState(@SW_SHOW, $gui)Global $zone = -1While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE Exit Case $GUI_EVENT_PRIMARYDOWN $pos = MouseGetPos() $x = Floor($pos[0]/100)*100 $y = Floor($pos[1]/100)*100 GUICtrlCreatePic(".\0.gif", $x, $y, 100,100) GUICtrlSetState(-1, $GUI_DISABLE) Case $GUI_EVENT_SECONDARYDOWN GuiDelete($zone) $a = GUIGetCursorInfo($gui) If $a[4] <> 0 Then $pos = ControlGetPos($gui, "", $a[4]) _Zone
($pos[0], $pos[1]) EndIf EndSwitchWEndFunc _Zone
($x, $y) $zone = GUICreate("", 100, 100, $x, $y, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_MDICHILD, $WS_EX_COMPOSITED), $gui) GuiSetBkColor(0xff0000) GuiCtrlCreateLabel("", 2, 2, 96, 96) GuiCtrlSetBkColor(-1, 0xabcdef) _WinAPI_SetLayeredWindowAttributes($zone, 0xabcdef) GUISetState(@SW_SHOW, $zone) GuiSwitch($gui) ; <<< retour à la gui principaleEndFunc
Re: Passer une image au premier plan
Posté : dim. 11 août 2019 22:18
par littlechiki
Ah oui en effet ça marche ! Merci bien, j'aurais jamais pensé à me servir d'une autre GUI pour faire apparaître ma zone tiens !
Merci beaucoup ! D'après ce que je vois sur le code, ça me paraît assez clair mais je vais m'y attarder un peu plus et voir si je comprend bien tout !
Cette fois je passe le sujet en résolu (j'espère définitivement) !
Re: Passer une image au premier plan
Posté : mar. 27 août 2019 09:16
par Pacome77
walkson a écrit : ↑jeu. 08 août 2019 18:16
Bonjour,
Le plus simple:
Un seul pic suffit pour plusieurs images
Après, si vous devez travailler beaucoup sur les images, je vous conseille GdiPlus (voir l'aide)
Rachat de crédit meilleur taux crédit Voir exemple 2 On obtient de meilleurs résultats mais c'est plus compliqué (au début)
![Razz :P](./images/smilies/icon_razz.gif)
Si vous voulez jouer uniquement sur le pic, il y a
GUICtrlSetState ( controlID, state )
avec
$GUI_ONTOP (2048) Le contrôle aura l'attribut Ontop (au dessus des autres fenêtres) (zOrdering).
Bonjour tout le monde. On vous remercie d’avoir partagé cela avec nous, je trouve cela vraiment intéressant ! Cependant j’ai une question à vous poser si c’est possible. Merci de votre retour Amicalement