Wie bekomme ich die MsgBox, InputBox und FileOpenDialog in die Nähe meiner MainGUI?

  • Hallo Zusammen,

    kämpfe gerade mit meiner GUI und habe vermutlich eine Kleinigkeit übersehen oder mache einen Denkfehler wo ich Eure Hilfe bräuchte.

    Ich habe eine MainGui. In der gibt es verschiedene Buttons die entweder eine MsgBox, InputBox oder FileOpenDialog öffnen.

    Mein Wunsch ist es nun, nicht die Dialog zentriert am Bildschirm zu haben, sondern immer in der Nähe der MainGUI. Wenn ich z.B. die Gui nach oben rechts am Bildschirm verschiebe, sollen sich da auch die Dialoge öffnen.

    Die Hilfe ist da nur bedingt hilfreich, denn beim FileOpneDialog steht:

    "hwnd [optional] The window handle to use as the parent for this dialog."

    Daraus habe ich die "Beziehung" zwischen Dialog und Gui abgeleitet.

    Interessanterweise funktioniert das so, wie ich es will beim FileOpenDialog, wenn ich meinen 2. Knopf von oben drücke. Also er öffnet mir den Dialog dort, wo sich meine Main-GUI befindet.

    Drücke ich aber nach dem Start meines Testprogramms den obersten Button zuerst, dann erscheint der Dialog in der oberen linken Bildschirmecke, auch wenn ich danach den 2. Knopf drücke. :(

    Bei MsgBox oder InputBox hat es keinerlei Auswirkung, ob ich als hwnd meine MainGui angeben oder nicht. Die wird leider immer Bildschirmmittig platziert. :(

    Was mache ich falsch, oder geht das garnicht, was ich machen will, oder wofür ist das hwnd da? Oder ist es gar ein Bug?

    Spoiler anzeigen
    [autoit]


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

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

    Opt('MustDeclareVars', 1)
    ; Opt('CaretCoordMode', 2)
    Opt('GUICloseOnESC', 0)

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

    Global $MyMainGUI, $MyButton1, $MyButton2, $MyButton3, $MyButton4
    Local $GuiMsg

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

    CreateMyGui()

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

    While 1
    $GuiMsg = GUIGetMsg()

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

    Switch $GuiMsg
    Case $GUI_EVENT_CLOSE
    ExitLoop

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

    Case $MyButton1
    FileOpenDialog("Datei auswählen", @WorkingDir & "\", "alle (*.*)", 0, "")

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

    Case $MyButton2
    FileOpenDialog("Datei auswählen", @WorkingDir & "\", "alle (*.*)", 0, "", $MyMainGUI)

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

    Case $MyButton3
    InputBox("Testfrage", "Einfach mal nen Test eingeben", "nix", "", 150, 50, -1, -1, 15, $MyMainGUI)

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

    Case $MyButton4
    MsgBox(0, "Meldungsbox", "Ist die Box da, wo sie sein soll?", 15, $MyMainGUI)
    EndSwitch
    WEnd

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

    GUIDelete($MyMainGUI)

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

    #region funktionsdefinitionen

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

    Func CreateMyGui()

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

    $MyMainGUI = GUICreate("My GUI", 400, 200)

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

    $MyButton1 = GUICtrlCreateButton("FileOpenDialog", 10, 10, 150)
    $MyButton2 = GUICtrlCreateButton("FileOpenDialog mit hwnd", 10, 40, 150)
    $MyButton3 = GUICtrlCreateButton("InputBox mit hwnd", 10, 70, 150)
    $MyButton4 = GUICtrlCreateButton("MsgBox mit hwnd", 10, 100, 150)

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

    GUISetState(@SW_SHOW)

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

    EndFunc ;==>CreateMyGui

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

    #endregion funktionsdefinitionen

    [/autoit]

    Happy computing!
    R@iner

    • Offizieller Beitrag

    Bei mir öffenen sich die Dialogboxen 2 und 4 an der GUI. Beim 1. Knopf hast du ja auch nicht das Parenthandle angegeben, deshalb kommt es Bildmittig. Bei der Inputbox schau dir mal die Parameter 7 und 8 an, damit kannst du die Position bestimmen, an der die Inputbox erscheint.

    Edit: Hab dir mal ein Beispiel für die Inputbox gebastelt.

    Spoiler anzeigen
    [autoit]

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

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

    Opt('MustDeclareVars', 1)
    ; Opt('CaretCoordMode', 2)
    Opt('GUICloseOnESC', 0)

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

    Global $MyMainGUI, $MyButton1, $MyButton2, $MyButton3, $MyButton4
    Global $Pos
    Local $GuiMsg

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

    CreateMyGui()

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

    While 1
    $GuiMsg = GUIGetMsg()

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

    Switch $GuiMsg
    Case $GUI_EVENT_CLOSE
    ExitLoop

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

    Case $MyButton1
    FileOpenDialog("Datei auswählen", @WorkingDir & "\", "alle (*.*)", 0, "")

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

    Case $MyButton2
    FileOpenDialog("Datei auswählen", @WorkingDir & "\", "alle (*.*)", 0, "", $MyMainGUI)

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

    Case $MyButton3
    $pos = WinGetPos($MyMainGUI)
    InputBox("Testfrage", "Einfach mal nen Test eingeben", "nix", "", 150, 50, $pos[0], $pos[1], 15, $MyMainGUI)

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

    Case $MyButton4
    MsgBox(0, "Meldungsbox", "Ist die Box da, wo sie sein soll?", 15, $MyMainGUI)
    EndSwitch
    WEnd

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

    GUIDelete($MyMainGUI)

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

    #region funktionsdefinitionen

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

    Func CreateMyGui()

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

    $MyMainGUI = GUICreate("My GUI", 400, 200)

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

    $MyButton1 = GUICtrlCreateButton("FileOpenDialog", 10, 10, 150)
    $MyButton2 = GUICtrlCreateButton("FileOpenDialog mit hwnd", 10, 40, 150)
    $MyButton3 = GUICtrlCreateButton("InputBox mit hwnd", 10, 70, 150)
    $MyButton4 = GUICtrlCreateButton("MsgBox mit hwnd", 10, 100, 150)

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

    GUISetState(@SW_SHOW)

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

    EndFunc ;==>CreateMyGui

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

    #endregion funktionsdefinitionen

    [/autoit]

    Edit2: Bei der MSgBox kann man nicht festlegen wo sie erscheint.
    Aus der Hilfe:

    Zitat

    A message box appears centered on screen and resizes according to the text it contains.

  • Hallo Raupi,

    vielen Dank für Deine schnelle Antwort!

    Das mit meinem ersten Button ist Absicht, damit man die Unterschiede sieht.

    Nochmal zum Hergang bei mir hier auf Windows XP:

    Test 1:
    1) Starten des Programms
    2) Verschieben der gui nach rechts oben
    3) Drücken auf den ersten Button -> FileOpenDialog öffnet sich in der linken oberen Ecke
    4) Drücken auf den zweiten Button -> FileOpenDialog öffnet sich in der linken oberen Ecke und nicht an der GUI
    5) Drücken auf den dritten Button -> InputBox öffnet sich in der linken oberen Ecke
    6) Drücken auf den vierten Button -> MsgBox öffnet sich Bildschirmmittig
    7) Programm beenden

    Test 2:
    1) Starten des Programms
    2) Verschieben der gui nach rechts oben
    3) Drücken auf den zweiten Button -> FileOpenDialog öffnet sich an der GUI -> so wie gewünscht
    4) Drücken auf den ersten Button -> FileOpenDialog öffnet sich an der GUI -> vermutlich weil Button Zwei mit dem parent-Verweis als erstes gedrückt wurde und sich die Position gemerkt wurde
    5) Drücken auf den dritten Button -> InputBox öffnet sich in der linken oberen Ecke
    6) Drücken auf den vierten Button -> MsgBox öffnet sich Bildschirmmittig
    7) Programm beenden

    Und warum funktioniert der FileOpenDialog im Test 1 nicht, wenn der Bezug auf hwnd doch gesetzt ist?

    Ah ok, Du hast gerade deinen Beitrag editiert.

    Den Hilfetext habe ich jetzt auch bei der MsgBox gefunden. Bei Inputbox und FileOpenDialog steht er jedenfalls nicht dabei.

    Ich frage mich, für was hwnd bei InputBox und bei MsgBox da ist? Ich sehe keinerlei Auswirkung ob ich da was angebe oder nicht.

    Gut den Workaround bei der Inputbox müsste ich überall einbauen. Nur wie mach ich das mit der MsgBox?

    Frohe Ostern!
    R@iner

    • Offizieller Beitrag

    Durchsuch mal das Scripte Forum, da gibt es mehrer Messageboxalternativen, wenn ich mich richtig erinnern kann.