[R] Bouton non utilisable car superposer sur un label

Aide sur les Interfaces Graphique Utilisateurs (GUI).
Règles du forum
.
Répondre
iCitron
Niveau 2
Niveau 2
Messages : 20
Enregistré le : mar. 19 août 2014 16:47
Status : Hors ligne

[R] Bouton non utilisable car superposer sur un label

#1

Message 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)
Modifié en dernier par iCitron le mer. 18 mai 2016 15:03, modifié 3 fois.
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

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

#2

Message 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
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
iCitron
Niveau 2
Niveau 2
Messages : 20
Enregistré le : mar. 19 août 2014 16:47
Status : Hors ligne

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

#3

Message 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 :)
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

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

#4

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