GUI changement d'image sur réception du focus

Aide sur les Interfaces Graphique Utilisateurs (GUI).
Règles du forum
.
Répondre
cdhl
Niveau 1
Niveau 1
Messages : 3
Enregistré le : lun. 09 janv. 2017 19:44
Status : Hors ligne

GUI changement d'image sur réception du focus

#1

Message par cdhl »

Bonjour

Débutant dans Autoit (et la programmation) je voudrais écrire une GUI avec plusieurs boutons liés chacun à une image différente, changeant en fonction du focus (ou avec les touches flèches du clavier) plutôt qu'un clic ou la touche enter.
Les exemples donnés dans l'aide déclenchent tous l'action sur un clic, ce que je voudrais éviter, mais je ne vois pas comment prendre le problème. En fait, c'est pour ouvrir un menu ultra simplifié ("voir film", "voir photo", "Skype") au démarrage d'un PC que je voudrais recycler et qui puisse être commandé à distance avec une télécommande (type logitech).
Merci d'avance pour votre aide, en espérant que la question est bien posée et n'a pas déjà été traitée ...
Avatar du membre
A2Energie
Niveau 5
Niveau 5
Messages : 140
Enregistré le : ven. 15 nov. 2013 20:22
Status : Hors ligne

Re: GUI changement d'image sur réception du focus

#2

Message par A2Energie »

Salut a toi jeune autoitien :)

Un exemple du code que tu as actuellement développé serait d'une grande aide pour pouvoir t'aider.
Dnas l'état j'ai un peu de mal à comprendre ce que tu cherche à faire.

Je pense que ta réponse doit se trouver dans la fonction GuiGetMsg :
https://www.autoitscript.fr/autoit3/doc ... GetMsg.htm
cdhl
Niveau 1
Niveau 1
Messages : 3
Enregistré le : lun. 09 janv. 2017 19:44
Status : Hors ligne

Re: GUI changement d'image sur réception du focus

#3

Message par cdhl »

Merci de votre aide.
En fait il s'agit de faire un menu simple de 3 boutons, parcouru avec la touche tabulation ou haut / bas (ce que permet la télécommande), le clic de la souris (ou envoi sur la télécommande) déclenchant un programme. Mais je voudrais lier les boutons à un contrôle image pour changer l'image à chaque tabulation ; une sorte d'aide en plus attachée à chaque bouton .
J'ai fait plusieurs tentatives mais ça ne marche pas et je me demande quelle focntion utiliser
il me semble que GuiGetMsg renvoie à des événements touchant au Gui plutôt qu'à un bouton.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: GUI changement d'image sur réception du focus

#4

Message par mikell »

Il y a plusieurs façons de faire ça, avec les fonctions : GUIGetCursorInfo, GUICtrlGetState, ControlGetFocus ...
Pour des infos plus détaillées, tu pourrais poster ton code avec ta gui
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
mdanielm
Membre émérite
Membre émérite
Messages : 254
Enregistré le : mer. 11 déc. 2013 19:48
Status : Hors ligne

Re: GUI changement d'image sur réception du focus

#5

Message par mdanielm »

Je suis curieux de voir d'autres solutions plus simples!
#include <GuiButton.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Global $hGui, $hBtn[3], $aImg[] = ["blue.bmp", "green.bmp", "red.bmp"]
;  Les images sont dans    c:\program files (x86)\AutoIt3\Examples\GUI\Advanced\Images
Boutons()

Func Boutons()
    $hGUI = GUICreate("Focus avec boutons", 300, 200)

   for $i=0 to 2
      $hBtn[$i] = _GUICtrlButton_Create($hGUI, "Bouton " & $i, 10, 10+50*$i, 90, 40, $BS_BITMAP)
   next

   GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")

    GUISetState(@SW_SHOW)

    Do
      sleep(100)
    Until GUIGetMsg() = $GUI_EVENT_CLOSE

EndFunc   ;==>Example

Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
    Local $iCode = BitShift($wParam, 16)

   ; Recherche le bouton dont le handle est $lParam
   local $i=0, $yest=False
   while not $yest and $i<3
      $yest = ($lParam=$hBtn[$i])
      $i+=1
   WEnd

   if not $yest Then Return

   $i-=1
   if $iCode = $BN_SETFOCUS Then
      _GUICtrlButton_SetImage($hBtn[$i], $aImg[$i])
   elseif $iCode = $BN_KILLFOCUS Then
      $hBtn[$i] = _GUICtrlButton_Create($hGUI, "Bouton " & $i, 10, 10+50*$i, 90,40, $BS_BITMAP)
   endif

EndFunc
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: GUI changement d'image sur réception du focus  

#6

Message par mikell »

Il a dit
je voudrais lier les boutons à un contrôle image
donc je pense qu'il voudrait plutôt ça :

(Et ce n'est PAS simple pour quelqu'un qui débute en AutoIt, d'ailleurs il y a probablement des solutions plus simples - pas forcément plus propres, mais plus accessibles pour un débutant)

Code : Tout sélectionner

#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
     
Global $hGui, $hBtn[3], $aImg[3] = ["blue.bmp", "green.bmp", "red.bmp"]
    ;  Les images sont dans    c:\program files (x86)\AutoIt3\Examples\GUI\Advanced\Images

     
GUICreate("Focus avec boutons", 300, 200)
For $i = 0 to 2
    $hBtn[$i] = GuiCtrlCreateButton($aImg[$i], 10, 10+50*$i, 90, 40, $BS_NOTIFY)
Next
$pic = GuiCtrlCreatePic("", 110, 10, 180, 150)
GUICtrlSetState($hBtn[0], $GUI_FOCUS)
GuiCtrlSetImage($pic, $aImg[0])
GUISetState(@SW_SHOW)
     
GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")

Do
   sleep(10)
Until GUIGetMsg() = $GUI_EVENT_CLOSE
     

Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
   Local $iCode = BitShift($wParam, 16)
   Local $nID = BitAND($wParam, 0x0000FFFF)

   If $iCode = $BN_SETFOCUS Then
      For $i = 0 to 2
          If $nID = $hBtn[$i] Then GuiCtrlSetImage($pic, $aImg[$i])
      Next
   EndIf    
   Return $GUI_RUNDEFMSG
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 )
cdhl
Niveau 1
Niveau 1
Messages : 3
Enregistré le : lun. 09 janv. 2017 19:44
Status : Hors ligne

Re: GUI changement d'image sur réception du focus

#7

Message par cdhl »

Merci pour ces réponses !!! :D
Je suis parti du code de Mikell qui correspond à ce que je voulais et marche bien (j'ai testé les autres). Bon alors c'est vrai que je ne suis pas sur d'avoir tout compris... et que sans votre aide... j'ai mets quand même le résultat (sans les fonctions que je n'ai pas encore faites et avec les MSGBOX provisoires) ; ça peut servir à d'autres et ça permet de faire comprendre la logique ...
#AutoIt3Wrapper_Icon=Icons.ico
#AutoIt3Wrapper_Compile_Both=y
#AutoIt3Wrapper_UseX64=y
#AutoIt3Wrapper_Res_Language=1036
#AutoIt3Wrapper_Res_Icon_Add=Icons.ico
#AutoIt3Wrapper_Res_File_Add=Icons.ico
#include <ButtonConstants.au3>
#include <ColorConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <ProgressConstants.au3>
#include <AutoItConstants.au3>
#include <MsgBoxConstants.au3>
#include <Timers.au3>
#include <StaticConstants.au3>


; Declaration des var.
Global $hGui, $hBtn[3]
Global $aTxt[3] = ["Videos", "Photos", "Skype"]
Global $aImg[3] = ["c:\program files (x86)\AutoIt3\Examples\GUI\Advanced\Images\blue.bmp", "c:\program files (x86)\AutoIt3\Examples\GUI\Advanced\Images\green.bmp", "c:\program files (x86)\AutoIt3\Examples\GUI\Advanced\Images\red.bmp"]
;  Les images sont dans c:\program files (x86)\AutoIt3\Examples\GUI\Advanced\Images
Global $Color[3] = [0x000000FF, 0x0033FF00, 0x00FF33CC]    ; pour les codes couleurs voir http://www.proftnj.com/RGB3.htm

; Creation GUI avec parametres generaux
GUICreate("Focus avec boutons", 1900, 1050)
GUISetBkColor(0x000000)
GUICtrlSetDefBkColor(0x3399CC)

;Creation des boutons
For $i = 0 to 2
    $hBtn[$i] =GuiCtrlCreateButton($aTxt[$i], 100, 120+300*$i, 700, 200, $BS_NOTIFY)
   GUICtrlSetColor(-1, $Color[$i])
   GUICtrlSetFont(-1, 72, 800, 0, "Open Sans")
Next
;Creation des images
$pic = GuiCtrlCreatePic("", 1200, 120, 500, 200)
GUICtrlSetState($hBtn[0], $GUI_FOCUS)
GuiCtrlSetImage($pic, $aImg[0])

GUISetState(@SW_SHOW)
GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")

Do
   sleep(10)
Until GUIGetMsg() = $GUI_EVENT_CLOSE

Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)  ;Renvoie l'image
   Local $iCode = BitShift($wParam, 16)
   Local $nID = BitAND($wParam, 0x0000FFFF)

; Action sur focus sans clic
If $iCode = $BN_SETFOCUS Then
      For $i = 0 to 2
          If $nID = $hBtn[$i] Then GuiCtrlSetImage($pic, $aImg[$i])
      Next
   EndIf

;~  Action sur Clic
If $iCode = $BN_CLICKED Then

   Select
      case $nID = "3"
         Videos()
      case $nID = "4"
         Photos()
      case $nID = "5"
         Skype()
   EndSelect

EndIf

Return $GUI_RUNDEFMSG

EndFunc

; Et maintenant les fonctions appellées par le menu
Func Videos()
 MsgBox($MB_SYSTEMMODAL,"Appellé :","Videos",10)

EndFunc

Func Photos()
 MsgBox($MB_SYSTEMMODAL,"Appellé :","Photos",10)

EndFunc

Func Skype()
 MsgBox($MB_SYSTEMMODAL,"Appellé :","Skype",10)

EndFunc
Merci encore.
Répondre