Passer une image au premier plan

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
littlechiki
Niveau 3
Niveau 3
Messages : 30
Enregistré le : sam. 13 avr. 2019 12:58
Status : Hors ligne

Passer une image au premier plan

#1

Message par littlechiki » jeu. 08 août 2019 16:42

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
        EndSwitch
WEnd
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 !) !
Fichiers joints
zone.gif
zone.gif (316 Octets) Vu 222 fois
zone.gif
zone.gif (316 Octets) Vu 222 fois
0.gif
0.gif (643 Octets) Vu 222 fois
0.gif
0.gif (643 Octets) Vu 222 fois

Avatar du membre
walkson
Modérateur
Modérateur
Messages : 694
Enregistré le : ven. 12 août 2011 18:49
Localisation : Essonne
Status : Hors ligne

Re: Passer une image au premier plan

#2

Message par walkson » jeu. 08 août 2019 17:16

Bonjour,
Le plus simple:
GUICtrlSetImage ( controlID, filename [, iconname [, icontype]] )
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) :P

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).
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi

littlechiki
Niveau 3
Niveau 3
Messages : 30
Enregistré le : sam. 13 avr. 2019 12:58
Status : Hors ligne

Re: Passer une image au premier plan

#3

Message par littlechiki » jeu. 08 août 2019 19:29

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 !

Avatar du membre
walkson
Modérateur
Modérateur
Messages : 694
Enregistré le : ven. 12 août 2011 18:49
Localisation : Essonne
Status : Hors ligne

Re: Passer une image au premier plan

#4

Message par walkson » jeu. 08 août 2019 19:53

Un p'tit bout de code, si cela vous inspire :mrgreen:
#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 = True
GUISetState(@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")
        EndSwitch
WEnd
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi

littlechiki
Niveau 3
Niveau 3
Messages : 30
Enregistré le : sam. 13 avr. 2019 12:58
Status : Hors ligne

Re: Passer une image au premier plan

#5

Message par littlechiki » ven. 09 août 2019 11:41

Ç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 !

littlechiki
Niveau 3
Niveau 3
Messages : 30
Enregistré le : sam. 13 avr. 2019 12:58
Status : Hors ligne

Re: Passer une image au premier plan

#6

Message par littlechiki » sam. 10 août 2019 12:10

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
GUICtrlCreatePic(".\Cartes\0.gif",$pos[0],$pos[1])
GUICtrlSetState(-1,$GUI_DISABLE)
pour le passer en arrière plan mais en vain... Je suis perdu là.

Avatar du membre
mikell
Modérateur
Modérateur
Messages : 5866
Enregistré le : dim. 29 mai 2011 16:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: Passer une image au premier plan

#7

Message par mikell » sam. 10 août 2019 14:53

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) :mrgreen:
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )

littlechiki
Niveau 3
Niveau 3
Messages : 30
Enregistré le : sam. 13 avr. 2019 12:58
Status : Hors ligne

Re: Passer une image au premier plan

#8

Message par littlechiki » sam. 10 août 2019 16:50

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 !

Avatar du membre
walkson
Modérateur
Modérateur
Messages : 694
Enregistré le : ven. 12 août 2011 18:49
Localisation : Essonne
Status : Hors ligne

Re: Passer une image au premier plan

#9

Message par walkson » sam. 10 août 2019 18:06

Bonjour,
ben, je n'ai pas tout compris :shock: 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 = False
While 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

 EndSwitch
WEnd
J'ai rajouté une image qui suit la souris (clic droit) et pas de problème non plus
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi

littlechiki
Niveau 3
Niveau 3
Messages : 30
Enregistré le : sam. 13 avr. 2019 12:58
Status : Hors ligne

Re: Passer une image au premier plan

#10

Message par littlechiki » sam. 10 août 2019 20:45

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
        EndSwitch
WEnd
J'aimerais que l'image zone (le carré rouge) apparaisse autour de la nouvelle image quand je fait un clic droit.

Avatar du membre
mikell
Modérateur
Modérateur
Messages : 5866
Enregistré le : dim. 29 mai 2011 16:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: Passer une image au premier plan  

#11

Message par mikell » dim. 11 août 2019 11:42

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 = -1

While 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
    EndSwitch
WEnd


Func _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 principale
EndFunc
 
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )

littlechiki
Niveau 3
Niveau 3
Messages : 30
Enregistré le : sam. 13 avr. 2019 12:58
Status : Hors ligne

Re: Passer une image au premier plan

#12

Message par littlechiki » dim. 11 août 2019 21:18

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) !

Répondre