Hallo zusammen,
ich brauche mal wieder eure Hilfe.
Eigentlich habe ich meinen Fehler bereits beseitigen können, aber nur durch Zufall und würde gerne verstehen warum es sich so verhält.
Ich versuche in meiner GUI mithilfe eines Buttons ein zusätzliches Menü einzublenden, welches als eine Art Overlay über meine MainGUI gelegt wird.
Eigentlich möchte ich genau das nachbauen was in der MetroGUI UDF gemacht wird.
Aus persönlichen Gründen möchte ich MetroGUI aber nicht selbst nutzen.
Um dieses Menü zu erstellen, wird in MetroGUI eine Child GUI erstellt und das mache ich ebenso.
In der Child GUI werden einige Labels erstellt, die später auf ein OnEvent reagieren sollen (derzeit aber noch nichts machen).
Derzeit stecke ich noch in einer frühen Phase fest, daher gibts auch noch keine weitere Funktion für dieses Menü.
Sobald die Funktion für das Menü gecasted wird, wird die Child GUI erstellt und anschließend verweilt mein Script in einer neuen While-Schleife.
Einmal wird das auch so in MetroGUI gemacht, zum Zweiten fand ich es sinnvoll dass damit mein Hauptscript pausiert wird.
In der zweiten Schleife wurde ständig geprüft, ob die Child GUI noch aktiv ist (und bleibt in der Schleife), oder nicht mehr aktiv ist, dann wird die Child GUI wieder gelöscht , die Funktion gibt ein Return zurück und ich lande wieder in meinem Hauptscript.
Mein Problem war folgendes:
Sobald ich den Button gedrückt habe um die Funktion für meine Child GUI aufzurufen, passierte eine von zwei Verhaltensmuster und das leider zufällig und für mich unerklärlich.
Verhaltensmuster 1:
- Die Child GUI erschien mit ihren Labels und reagierte normal
- Habe ich in meine MainGUI geklickt, oder außerhalb meiner kompletten Anwendung ist das Menü wieder geschlossen worden
- (Genau so sollte sie sich verhalten)
Verhaltensmuster 2:
- Die Child GUI erschien zwar, aber es wurden KEINE labels erstellt (es existierte lediglich der Hintergrund der Child GUI)
- Zudem war die Anwendung eingefroren... reagierte also nicht wenn ich in meine MainGUI geklickt habe (in der Loop Abfrage sollte erkannt werden, dass die Child GUI nicht mehr aktiv ist und diese schließen)
- Klicke ich allerdings mit der Maus außerhalb meiner MainGUI, verschwand das Menü trotzdem (aber nur über diesen Weg)
- Merkwürdigerweise befand ich mich, laut meinen Consolen Ausgaben auch in diesem Verhalten in meiner zweiten While-Schleife
Jetzt würde ich gerne verstehen warum dieses Verhalten passiert, denn erklären kann ich es mir nicht.
Es war wirklich zufällig was von den zwei Möglichkeiten passierte.
Leider ist mein Script viel zu groß und Umfangreich, als das ich es hier posten könnte, aber die Funktion für die ChildGUI teile ich in abgewandelter Form.
Func GUI_MenuStart()
_ConsoleLog("---------------------------------------------------------------------------------------" & @CRLF)
_ConsoleLog("GUI_MenuStart() - Menü wird gestartet." & @CRLF)
;Erstellt Child GUI
Local $mPos = WinGetPos($hGUI)
$hGUI_Menu = GUICreate("", 200, 300, $mPos[2]-199, 85, $WS_POPUP, $WS_EX_MDICHILD, $hGUI)
GUISetBkColor(_AlterBrightness($GUIBKCOLOR_MAIN, +10), $hGUI_Menu)
;Erstellt Menüeinträge
Local $hMenuItem[UBound($aGUI_Module, $UBOUND_ROWS)+1]
Local $sLabelSpacer = 30
For $i = 3 To UBound($aGUI_Module, $UBOUND_ROWS) - 1
If $i = 1 OR $i = 2 Then ContinueLoop ;Überspringt Menüeinträge
_ConsoleLog("GUI_MenuStart() - Erstelle Menüeintrag für: " & $aGUI_Module[$i][0] & @CRLF)
Local $aStringSize = _StringSize($aGUI_Module[$i][0], 12, 400, 0, $GUI_FONT_NORMAL, 0)
If IsArray($aStringSize) = 1 Then
$hMenuItem[$i] = GUICtrlCreateLabel($aStringSize[0], ((200-$aStringSize[2])/2), $sLabelSpacer*$i-($sLabelSpacer*2), $aStringSize[2], $aStringSize[3])
GUICtrlSetFont($hMenuItem[$i], 12, 400, 0, $GUI_FONT_NORMAL, $SS_CENTER)
GUICtrlSetBkColor($hMenuItem[$i], $GUI_BKCOLOR_TRANSPARENT)
GUICtrlSetColor($hMenuItem[$i], $GUIBKCOLOR_FONT_HEADLINE)
;Registriert Maus Events
_GUICtrl_OnHoverRegister($hMenuItem[$i], "_BTN_Hover_Func", "_BTN_Hover_Func", "_BTN_PrimaryDown_Func", "_BTN_PrimaryUp_Func")
Else
ContinueLoop
EndIf
Next
;Menü wird angezeigt
GUISetState(@SW_SHOW, $hGUI_Menu)
While 1
If Not WinActive($hGUI_Menu) Then
_ConsoleLog("GUI_MenuStart() - Menü wird geschlossen, nicht mehr aktiv." & @CRLF)
_ConsoleLog("---------------------------------------------------------------------------------------" & @CRLF)
GUIDelete($hGUI_Menu)
Return True
EndIf
Sleep(10)
WEnd
Return True
EndFunc ;==>GUI_MenuStart
Alles anzeigen
Achso... meine Lösung, womit alles so Funktioniert wie gewünscht ist folgende:
Die ChildGUI habe ich Global markiert und deklariere sie vorher.
Jetzt hab ich eine Funktion zum Checken der ChildGUI erstellt, die ständig in meiner Haupt-While-Schleife zusätzlich mit aufgerufen wird und prüft ob die ChildGUI existiert, wenn ja dann wird dort genauso geprüft ob diese aktiv ist, wie zuvor in der zweiten While-Schleife. Allerdings habe ich für diese Lösung die zweite While-Schleife gelöscht und nachdem das Menü erstellt wurde, beendet sich die Funktion für das Menü direkt wieder, damit ich in meine Haupt-While-Schleife lande.
Func GUI_MenuStart()
_ConsoleLog("---------------------------------------------------------------------------------------" & @CRLF)
_ConsoleLog("GUI_MenuStart() - Menü wird gestartet." & @CRLF)
;Erstellt Child GUI
Local $mPos = WinGetPos($hGUI)
$hGUI_Menu = GUICreate("", 200, 300, $mPos[2]-199, 85, $WS_POPUP, $WS_EX_MDICHILD, $hGUI)
GUISetBkColor(_AlterBrightness($GUIBKCOLOR_MAIN, +10), $hGUI_Menu)
;Erstellt Menüeinträge
Local $hMenuItem[UBound($aGUI_Module, $UBOUND_ROWS)+1]
Local $sLabelSpacer = 30
For $i = 3 To UBound($aGUI_Module, $UBOUND_ROWS) - 1
If $i = 1 OR $i = 2 Then ContinueLoop ;Überspringt Menüeinträge
_ConsoleLog("GUI_MenuStart() - Erstelle Menüeintrag für: " & $aGUI_Module[$i][0] & @CRLF)
Local $aStringSize = _StringSize($aGUI_Module[$i][0], 12, 400, 0, $GUI_FONT_NORMAL, 0)
If IsArray($aStringSize) = 1 Then
$hMenuItem[$i] = GUICtrlCreateLabel($aStringSize[0], ((200-$aStringSize[2])/2), $sLabelSpacer*$i-($sLabelSpacer*2), $aStringSize[2], $aStringSize[3])
GUICtrlSetFont($hMenuItem[$i], 12, 400, 0, $GUI_FONT_NORMAL, $SS_CENTER)
GUICtrlSetBkColor($hMenuItem[$i], $GUI_BKCOLOR_TRANSPARENT)
GUICtrlSetColor($hMenuItem[$i], $GUIBKCOLOR_FONT_HEADLINE)
;Registriert Maus Events
_GUICtrl_OnHoverRegister($hMenuItem[$i], "_BTN_Hover_Func", "_BTN_Hover_Func", "_BTN_PrimaryDown_Func", "_BTN_PrimaryUp_Func")
Else
ContinueLoop
EndIf
Next
;Menü wird angezeigt
GUISetState(@SW_SHOW, $hGUI_Menu)
Return True
EndFunc ;==>GUI_MenuStart
Func GUI_MenuStart_Check()
If WinExists($hGUI_Menu) Then
If Not WinActive($hGUI_Menu) Then
_ConsoleLog("GUI_MenuStart_Check() - Menü wird geschlossen, ist nicht mehr aktiv." & @CRLF)
_ConsoleLog("---------------------------------------------------------------------------------------" & @CRLF)
GUIDelete($hGUI_Menu)
EndIf
EndIf
Return True
EndFunc ;==>GUI_MenuStart_Check
Alles anzeigen
PS: Sorry fast vergessen.
Ich befinde mich im OnEventMode.