Page 1 sur 1

[R] Bouton non utilisable car superposer sur un label

Posté : ven. 13 mai 2016 19:18
par iCitron
Bonsoir,

Alors voilà, un des problèmes avec lequel j'essaie de vivre depuis des mois: La superposition de deux control les rend inutilisables.
L'action de cliquer sur un bouton est detecté via un GUIGetMsg() des plus basiques. Seulement, il s'avère que si un label est déjà crée derrière le bouton, il est prioritaire. Si on inverse l'ordre de création (d'abord le bouton, ensuite le label), un clic dans la zone du bouton est detecté, mais le bouton n'apparait pas graphiquement lors de la création de la fenêtre (seulement après avoir cliqué dessus).

Voilà un exemple illustrant le PB, sûrement plus clair que ma tentative d'explication;
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
GUICreate("Form1", 200, 120)

$L1 = GUICtrlCreateLabel("L1",0,0,100,100)
GUICtrlSetBkColor(-1,0xAA5500)
$B1 = GUICtrlCreateButton("B1",25,25,50,50)

$B2 = GUICtrlCreateButton("B2",125,25,50,50)
$L2 = GUICtrlCreateLabel("L2",100,0,100,100)
GUICtrlSetBkColor(-1,0x0055AA)

$Display = GUICtrlCreateLabel("",0,100,200,20)
GUICtrlSetBkColor(-1, 0x00AA55)
GUICtrlSetStyle(-1,0x01)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
   $nMsg = GUIGetMsg()
   Switch $nMsg
      Case $GUI_EVENT_CLOSE
         Exit
      Case $B1
         GuiCtrlSetData( $Display,"B1")
      Case $L1
         GuiCtrlSetData( $Display,"L1")
      Case $B2
         GuiCtrlSetData( $Display,"B2")
      Case $L2
         GuiCtrlSetData( $Display,"L2")
   EndSwitch
WEnd
Ce problème s'est avéré particulièrement contraignant quand j'ai voulu créer des boutons un peu stylisés et encadrés. Les boutons étaient alors déconnectés. Une manière de contourner le problème et de créer plusieurs labels (4) encadrant le bouton sans se superposer. Mais elle reste peu pratique et très contraignante.
Si quelqu'un à une solution contre ça (Une autre manière de determiner un clic sur un bouton ou un trick pour contourner ce glitch), je suis preneur.

Merci d'avance.

PS: Si c'est un sujet déjà traité, je ne l'ai ni trouvé sur le forum ici, ni sur le forum anglais.

EDIT: Sujet résolu, fix:
$Label = GUICtrlCreateLabel("L1",0,0,100,100)
GUICtrlSetBkColor(-1,0xAA5500)
GUICtrlSetState( $Label, $GUI_DISABLE )    ; <--- Cette ligne
$Button = GUICtrlCreateButton("B1",25,25,50,50)

Re: [...] Bouton non utilisable car superposer sur un label

Posté : ven. 13 mai 2016 20:11
par orax
En attendant que quelqu'un propose une meilleure solution, voici ce que j'ai à proposer. C'est inspiré de ce code (en cherchant label behind button).
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
GUICreate("Form1", 200, 120)

$L1 = GUICtrlCreateLabel("L1", 0, 0, 100, 100)
GUICtrlSetBkColor(-1, 0xAA5500)
$B1 = GUICtrlCreateButton("B1", 25, 25, 50, 50)

$B2 = GUICtrlCreateButton("B2", 125, 25, 50, 50)
$L2 = GUICtrlCreateLabel("L2", 100, 0, 100, 100)
GUICtrlSetBkColor(-1, 0x0055AA)

$Display = GUICtrlCreateLabel("", 0, 100, 200, 20)
GUICtrlSetBkColor(-1, 0x00AA55)
GUICtrlSetStyle(-1, 0x01)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
   $nMsg = GUIGetMsg()
   Switch $nMsg
      Case $GUI_EVENT_MOUSEMOVE
         Switch GUIGetCursorInfo()[4]
            Case $B1
               GUICtrlSetState($L1, $GUI_DISABLE)
                    ConsoleWrite('$L1 $GUI_DISABLE' & @CRLF)
            Case $L1
               GUICtrlSetState($L1, $GUI_ENABLE)
                    consoleWrite('$L1 $GUI_ENABLE' & @CRLF)
         EndSwitch
      Case $GUI_EVENT_CLOSE
         Exit
      Case $B1
         GUICtrlSetData($Display, "B1")
      Case $L1
         GUICtrlSetData($Display, "L1")
      Case $B2
         GUICtrlSetData($Display, "B2")
      Case $L2
         GUICtrlSetData($Display, "L2")
   EndSwitch
WEnd

Re: [...] Bouton non utilisable car superposer sur un label

Posté : ven. 13 mai 2016 20:19
par iCitron
Un simple DISABLE? C'est parfait, magnifique, vu que les encadrements ne contiennent pas de texte, le résultat graphique est identique!
Merci beaucoup, juste le GUICtrlSetState($L1, $GUI_DISABLE) est suffisant lors de la creation des controls.
Je laisse le topic ouvert encore voir des solutions alternatives au cas ou :)

Re: [...] Bouton non utilisable car superposer sur un label

Posté : ven. 13 mai 2016 23:12
par mikell
Comme solution alternative ya aussi une variante simple

Code : Tout sélectionner

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

GUICreate("Form1", 200, 120)
$L1 = GUICtrlCreateLabel("L1",0,0,100,100)
GUICtrlSetBkColor(-1,0xAA5500)
$B1 = GUICtrlCreateButton("B1",25,25,50,50)    
$B2 = GUICtrlCreateButton("B2",125,25,50,50)
$L2 = GUICtrlCreateLabel("L2",100,0,100,100)
GUICtrlSetBkColor(-1,0x0055AA)
$Display = GUICtrlCreateLabel("",0,100,200,20)
GUICtrlSetBkColor(-1, 0x00AA55)
GUICtrlSetStyle(-1,0x01)
GUISetState(@SW_SHOW)
     
While 1
   $nMsg = GUIGetMsg()
   Switch $nMsg
       Case $GUI_EVENT_CLOSE
                Exit
       Case $GUI_EVENT_PRIMARYDOWN
          Switch GUIGetCursorInfo()[4]
            Case $B1
                GuiCtrlSetData( $Display,"B1")
            Case $L1
                GuiCtrlSetData( $Display,"L1")
            Case $B2
                GuiCtrlSetData( $Display,"B2")
            Case $L2
                GuiCtrlSetData( $Display,"L2")
        EndSwitch
     EndSwitch
WEnd