Menüleiste und Statusleiste - fehlerhafte Anzeige

  • Hallo zusammen,

    ich möchte ein kleines Programm mit GUI erstellen und möchte darin eine Menü- & Statusleiste einbauen.

    Wenn ich das Beispiel 1 aus der Hilfe (_GUICtrlStatusBar_SetText) verwende, dann wird die Statusleiste korrekt anzeigt (siehe Bild1).

    Spoiler anzeigen
    [autoit]

    #include <GuiConstantsEx.au3>
    #include <GuiStatusBar.au3>
    #include <WinAPI.au3>
    #include <WindowsConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    $Debug_SB = False ; Prüft den Klassennamen (ClassName), der an die StatusBar-Funktion übergeben wird. Setze dies versuchsweise auf True und verwende dann ein Handle zu einem anderen Control, um die Funktionsweise zu verstehen.

    [/autoit] [autoit][/autoit] [autoit]

    Global $iMemo

    [/autoit] [autoit][/autoit] [autoit]

    Beispiel1()

    [/autoit] [autoit][/autoit] [autoit]

    Func Beispiel1()

    [/autoit] [autoit][/autoit] [autoit]

    Local $hGUI, $hIcons[2], $hStatus
    Local $aParts[4] = [75, 150, 300, 400]

    [/autoit] [autoit][/autoit] [autoit]

    ; Erstellt eine GUI
    $hGUI = GUICreate("StatusBar: Text setzen (Beispiel 1)", 400, 300)
    $hStatus = _GUICtrlStatusBar_Create($hGUI)

    [/autoit] [autoit][/autoit] [autoit]

    ; Erstellt ein Memo Control
    $iMemo = GUICtrlCreateEdit("", 2, 2, 396, 274, $WS_VSCROLL)
    GUICtrlSetFont($iMemo, 9, 400, 0, "Courier New")
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    ; Setzt die Abschnitte
    _GUICtrlStatusBar_SetParts($hStatus, $aParts)
    _GUICtrlStatusBar_SetText($hStatus, "Abschnitt 1")
    _GUICtrlStatusBar_SetText($hStatus, "Abschnitt 2", 1)

    [/autoit] [autoit][/autoit] [autoit]

    ; Setzt die Icons
    $hIcons[0] = _WinAPI_LoadShell32Icon(23)
    $hIcons[1] = _WinAPI_LoadShell32Icon(40)
    _GUICtrlStatusBar_SetIcon($hStatus, 0, $hIcons[0])
    _GUICtrlStatusBar_SetIcon($hStatus, 1, $hIcons[1])

    [/autoit] [autoit][/autoit] [autoit]

    ; Zeigt den Text der Abschnitte
    MemoWrite("Text von Abschnitt 1 ........: " & _GUICtrlStatusBar_GetText($hStatus, 0))
    MemoWrite("Text von Abschnitt 2 ........: " & _GUICtrlStatusBar_GetText($hStatus, 1))

    [/autoit] [autoit][/autoit] [autoit]

    ; Zeigt die Handles der Icons
    MemoWrite("Iconhandle Abschnitt 1 .: 0x" & Hex(_GUICtrlStatusBar_GetIcon($hStatus, 0)))
    MemoWrite("Iconhandle Abschnitt 2 .: 0x" & Hex(_GUICtrlStatusBar_GetIcon($hStatus, 1)))

    [/autoit] [autoit][/autoit] [autoit]

    ; Die Schleife wiederholt sich, bis der Benutzer die Beenden-Aktion der GUI auslöst
    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE
    ; Icons löschen
    _WinAPI_DestroyIcon($hIcons[0])
    _WinAPI_DestroyIcon($hIcons[1])
    GUIDelete()
    EndFunc ;==>Beispiel1

    [/autoit] [autoit][/autoit] [autoit]

    ; Schreibt eine Nachricht in das Memo
    Func MemoWrite($sMessage = "")
    GUICtrlSetData($iMemo, $sMessage & @CRLF, 1)
    EndFunc ;==>MemoWrite

    [/autoit]

    Wenn ich dann aber ein Menü einfüge, dann verschwindet die Statusleiste (siehe Bild 2). Warum passiert das und wie kann diese wieder normal anzeigen lassen?

    Code mit Menü:

    Spoiler anzeigen
    [autoit]

    #include <GuiMenu.au3>
    #include <GuiConstantsEx.au3>
    #include <GuiStatusBar.au3>
    #include <WinAPI.au3>
    #include <WindowsConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    $Debug_SB = False ; Prüft den Klassennamen (ClassName), der an die StatusBar-Funktion übergeben wird. Setze dies versuchsweise auf True und verwende dann ein Handle zu einem anderen Control, um die Funktionsweise zu verstehen.

    [/autoit] [autoit][/autoit] [autoit]

    Global $iMemo

    [/autoit] [autoit][/autoit] [autoit]

    Beispiel1()

    [/autoit] [autoit][/autoit] [autoit]

    Func Beispiel1()

    [/autoit] [autoit][/autoit] [autoit]

    Local $hGUI, $hIcons[2], $hStatus
    Local $aParts[4] = [75, 150, 300, 400]

    [/autoit] [autoit][/autoit] [autoit]

    ; Erstellt eine GUI
    $hGUI = GUICreate("StatusBar: Text setzen (Beispiel 1)", 400, 300)
    $hStatus = _GUICtrlStatusBar_Create($hGUI)

    [/autoit] [autoit][/autoit] [autoit]

    ; Erstellt ein Memo Control
    $iMemo = GUICtrlCreateEdit("", 2, 2, 396, 274, $WS_VSCROLL)
    GUICtrlSetFont($iMemo, 9, 400, 0, "Courier New")
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    ; Setzt die Abschnitte
    _GUICtrlStatusBar_SetParts($hStatus, $aParts)
    _GUICtrlStatusBar_SetText($hStatus, "Abschnitt 1")
    _GUICtrlStatusBar_SetText($hStatus, "Abschnitt 2", 1)

    [/autoit] [autoit][/autoit] [autoit]

    ; Setzt die Icons
    $hIcons[0] = _WinAPI_LoadShell32Icon(23)
    $hIcons[1] = _WinAPI_LoadShell32Icon(40)
    _GUICtrlStatusBar_SetIcon($hStatus, 0, $hIcons[0])
    _GUICtrlStatusBar_SetIcon($hStatus, 1, $hIcons[1])

    [/autoit] [autoit][/autoit] [autoit]

    ; Zeigt den Text der Abschnitte
    MemoWrite("Text von Abschnitt 1 ........: " & _GUICtrlStatusBar_GetText($hStatus, 0))
    MemoWrite("Text von Abschnitt 2 ........: " & _GUICtrlStatusBar_GetText($hStatus, 1))

    [/autoit] [autoit][/autoit] [autoit]

    ; Zeigt die Handles der Icons
    MemoWrite("Iconhandle Abschnitt 1 .: 0x" & Hex(_GUICtrlStatusBar_GetIcon($hStatus, 0)))
    MemoWrite("Iconhandle Abschnitt 2 .: 0x" & Hex(_GUICtrlStatusBar_GetIcon($hStatus, 1)))

    [/autoit] [autoit][/autoit] [autoit]

    ; Menü aus der Hilfe
    $hFile = _GUICtrlMenu_CreateMenu()
    _GUICtrlMenu_InsertMenuItem($hFile, 0, "Neu")

    [/autoit] [autoit][/autoit] [autoit]

    $hMain = _GUICtrlMenu_CreateMenu()
    _GUICtrlMenu_InsertMenuItem($hMain, 0, "Datei", 0, $hFile)

    [/autoit] [autoit][/autoit] [autoit]

    _GUICtrlMenu_SetMenu($hGUI, $hMain)

    [/autoit] [autoit][/autoit] [autoit]

    ; Die Schleife wiederholt sich, bis der Benutzer die Beenden-Aktion der GUI auslöst
    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE
    ; Icons löschen
    _WinAPI_DestroyIcon($hIcons[0])
    _WinAPI_DestroyIcon($hIcons[1])
    GUIDelete()
    EndFunc ;==>Beispiel1

    [/autoit] [autoit][/autoit] [autoit]

    ; Schreibt eine Nachricht in das Memo
    Func MemoWrite($sMessage = "")
    GUICtrlSetData($iMemo, $sMessage & @CRLF, 1)
    EndFunc ;==>MemoWrite

    [/autoit]
    • Offizieller Beitrag

    Dein Problem liegt in der Reihenfolge, in welcher du die Statusbar und das Menü erstellst.
    In deinem Script wird die Statusbar initialisiert und angezeigt, danach das Menü eingefügt. Die Stausbar kann aber von sich aus
    nicht auf ein Resizen der GUI reagieren (durch die Menüleiste ist der nutzbare Bereich der GUI kleiner geworden und die Statusbar
    ist auserhalb des sichtbaren Bereiches).
    Erst das Menü, dann die Statusbar. Ausserdem solltest du nach dem Menü und der Statusbar erst GUISetState aufrufen.
    Alternativ kannst du auch alles so lassen (schlechter Progammierstiel) und einfach _GUICtrlStatusBar_Resize ( $hStatus )
    vor der Hauptschleife aufrufen.

    Spoiler anzeigen
    [autoit]

    #include <GuiMenu.au3>
    #include <GuiConstantsEx.au3>
    #include <GuiStatusBar.au3>
    #include <WinAPI.au3>
    #include <WindowsConstants.au3>
    $Debug_SB = False ; Prüft den Klassennamen (ClassName), der an die StatusBar-Funktion übergeben wird. Setze dies versuchsweise auf True und verwende dann ein Handle zu einem anderen Control, um die Funktionsweise zu verstehen.
    Global $iMemo
    Beispiel1()
    Func Beispiel1()
    Local $hGUI, $hIcons[2], $hStatus
    Local $aParts[4] = [75, 150, 300, 400]
    ; Erstellt eine GUI
    $hGUI = GUICreate("StatusBar: Text setzen (Beispiel 1)", 400, 300)

    [/autoit] [autoit][/autoit] [autoit]

    ; Menü aus der Hilfe
    $hFile = _GUICtrlMenu_CreateMenu()
    _GUICtrlMenu_InsertMenuItem($hFile, 0, "Neu")
    $hMain = _GUICtrlMenu_CreateMenu()
    _GUICtrlMenu_InsertMenuItem($hMain, 0, "Datei", 0, $hFile)
    _GUICtrlMenu_SetMenu($hGUI, $hMain)

    [/autoit] [autoit][/autoit] [autoit]

    ; Erstellt ein Memo Control
    $iMemo = GUICtrlCreateEdit("", 2, 2, 396, 250, $WS_VSCROLL)
    GUICtrlSetFont($iMemo, 9, 400, 0, "Courier New")

    [/autoit] [autoit][/autoit] [autoit]

    ; Erstelle einen Statusbar
    $hStatus = _GUICtrlStatusBar_Create($hGUI)
    ; Setzt die Abschnitte
    _GUICtrlStatusBar_SetParts($hStatus, $aParts)
    _GUICtrlStatusBar_SetText($hStatus, "Abschnitt 1")
    _GUICtrlStatusBar_SetText($hStatus, "Abschnitt 2", 1)
    ; Setzt die Icons
    $hIcons[0] = _WinAPI_LoadShell32Icon(23)
    $hIcons[1] = _WinAPI_LoadShell32Icon(40)
    _GUICtrlStatusBar_SetIcon($hStatus, 0, $hIcons[0])
    _GUICtrlStatusBar_SetIcon($hStatus, 1, $hIcons[1])
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    ; Zeigt den Text der Abschnitte
    MemoWrite("Text von Abschnitt 1 ........: " & _GUICtrlStatusBar_GetText($hStatus, 0))
    MemoWrite("Text von Abschnitt 2 ........: " & _GUICtrlStatusBar_GetText($hStatus, 1))
    ; Zeigt die Handles der Icons
    MemoWrite("Iconhandle Abschnitt 1 .: 0x" & Hex(_GUICtrlStatusBar_GetIcon($hStatus, 0)))
    MemoWrite("Iconhandle Abschnitt 2 .: 0x" & Hex(_GUICtrlStatusBar_GetIcon($hStatus, 1)))

    [/autoit] [autoit][/autoit] [autoit]

    ; Die Schleife wiederholt sich, bis der Benutzer die Beenden-Aktion der GUI auslöst

    [/autoit] [autoit][/autoit] [autoit]

    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE
    ; Icons löschen
    _WinAPI_DestroyIcon($hIcons[0])
    _WinAPI_DestroyIcon($hIcons[1])
    GUIDelete()
    EndFunc ;==>Beispiel1
    ; Schreibt eine Nachricht in das Memo

    [/autoit] [autoit][/autoit] [autoit]

    Func MemoWrite($sMessage = "")
    GUICtrlSetData($iMemo, $sMessage & @CRLF, 1)
    EndFunc ;==>MemoWrite

    [/autoit]

    Edit: Ich weis nicht wie du dein Script noch weiter ausbauen willst, aber wenn die GUI resized wird, dann mußt du nach jeder
    Größenänderung der GUI, den Statusbar auch resizen. Wenn du ein Beispiel dafür brauchst sag bescheid.