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 : 48
Enregistré le : sam. 13 avr. 2019 13:58
Status : Hors ligne

Passer une image au premier plan

#1

Message 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
   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 2410 fois
zone.gif
zone.gif (316 Octets) Vu 2410 fois
0.gif
0.gif (643 Octets) Vu 2410 fois
0.gif
0.gif (643 Octets) Vu 2410 fois
Avatar du membre
walkson
Modérateur
Modérateur
Messages : 825
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

Re: Passer une image au premier plan

#2

Message par walkson »

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
(Je ne compte que les heures heureuses)
littlechiki
Niveau 3
Niveau 3
Messages : 48
Enregistré le : sam. 13 avr. 2019 13:58
Status : Hors ligne

Re: Passer une image au premier plan

#3

Message 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 !
Avatar du membre
walkson
Modérateur
Modérateur
Messages : 825
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

Re: Passer une image au premier plan

#4

Message par walkson »

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
(Je ne compte que les heures heureuses)
littlechiki
Niveau 3
Niveau 3
Messages : 48
Enregistré le : sam. 13 avr. 2019 13:58
Status : Hors ligne

Re: Passer une image au premier plan

#5

Message 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 !
littlechiki
Niveau 3
Niveau 3
Messages : 48
Enregistré le : sam. 13 avr. 2019 13:58
Status : Hors ligne

Re: Passer une image au premier plan

#6

Message 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
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 : 6002
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: Passer une image au premier plan

#7

Message 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) :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 : 48
Enregistré le : sam. 13 avr. 2019 13:58
Status : Hors ligne

Re: Passer une image au premier plan

#8

Message 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 !
Avatar du membre
walkson
Modérateur
Modérateur
Messages : 825
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

Re: Passer une image au premier plan

#9

Message par walkson »

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
(Je ne compte que les heures heureuses)
littlechiki
Niveau 3
Niveau 3
Messages : 48
Enregistré le : sam. 13 avr. 2019 13:58
Status : Hors ligne

Re: Passer une image au premier plan

#10

Message 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
   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 : 6002
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: Passer une image au premier plan  

#11

Message 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 = -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 : 48
Enregistré le : sam. 13 avr. 2019 13:58
Status : Hors ligne

Re: Passer une image au premier plan

#12

Message 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) !
Pacome77
Niveau 1
Niveau 1
Messages : 1
Enregistré le : lun. 26 août 2019 19:48
Status : Hors ligne

Re: Passer une image au premier plan

#13

Message par Pacome77 »

walkson a écrit : jeu. 08 août 2019 18: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) 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) :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).
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
Répondre