Position Problem

  • Hallo,

    ich habe ein Poblem mit meinr GUI.

    Wie kann man die 2. Gui
    in die 1. Gui größenabhängig integrieren.

    Das Problem ist,
    wenn ich die Hauptgui in der Größe ändere
    dann verschiebt sich die 2. Gui außerhalb des Hauptfensters
    Das sollte nicht passieren.
    Es sollte alles in einer Gui sein:

    Mein Code

    Spoiler anzeigen
    [autoit]


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

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

    $oIE = _IECreateEmbedded()

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

    $Form1 = GUICreate("Form1", 1000, 800, 239, 155, BitOR($WS_MAXIMIZEBOX,$WS_MINIMIZEBOX,$WS_SIZEBOX,$WS_THICKFRAME,$WS_SYSMENU,$WS_CAPTION,$WS_OVERLAPPEDWINDOW,$WS_TILEDWINDOW,$WS_POPUP,$WS_POPUPWINDOW,$WS_GROUP,$WS_TABSTOP,$WS_BORDER,$WS_CLIPSIBLINGS))
    $Browser = GUICtrlCreateObj($oIE, 16, 16, 900, 700)
    $hChild = GUICreate("", 185, 376, 432, 16, $WS_POPUP, $WS_EX_TOOLWINDOW + $WS_EX_MDICHILD, $Form1)
    $List1 = GUICtrlCreateList("", 0, 0, 185, 376)
    GUICtrlSetData(-1, "Tiere|Hilfe")
    GUICtrlSetFont(-1, 24, 400, 0, "MS Sans Serif")
    GUICtrlSetState(-1, $GUI_show)
    GUISetState(@SW_SHOW, $Form1)
    GUISetState(@SW_SHOW, $hChild)
    ;GUISetState(@SW_MAXIMIZE, $Form1)
    _Start()

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

    _IELoadWait($oIE)
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit

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

    EndSwitch
    WEnd

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

    Func _Start()
    $Web = "http://www.hunde.de"
    _IENavigate($oIE, $Web)
    EndFunc ;==>_Start

    [/autoit]

    :( Grüße Ilse

    4 Mal editiert, zuletzt von Ilse (2. April 2012 um 15:37)

  • Hi Ilse,

    füge den Style-Flags des Hauptfensters $WS_CLIPCHILDREN hinzu, und dem Kindfenster $WS_CHILD.
    $WS_EX_MDICHILD und $WS_EX_TOOLWINDOW entfernen ...
    Dann sollte es eigentlich gehen ...


    Gruß
    Greenhorn


  • Hallo, Greenhorn,

    hm... das klappt leider nicht.
    Konnte mich gestern nicht mehr melden.

    Spoiler anzeigen
    [autoit]


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

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

    $oIE = _IECreateEmbedded()

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

    $Form1 = GUICreate("Form1", 1000, 800, 239, 155, BitOR($WS_MAXIMIZEBOX,$WS_CLIPCHILDREN, $WS_MINIMIZEBOX,$WS_SIZEBOX,$WS_THICKFRAME,$WS_SYSMENU,$WS_CAPTION,$WS_OVERLAPPEDWINDOW,$WS_TILEDWINDOW,$WS_POPUP,$WS_POPUPWINDOW,$WS_GROUP,$WS_TABSTOP,$WS_BORDER,$WS_CLIPSIBLINGS))
    $Browser = GUICtrlCreateObj($oIE, 16, 16, 900, 700)
    $hChild = GUICreate("", 185, 376, 432, 16, $WS_POPUP, $Form1)
    $List1 = GUICtrlCreateList("", 0, 0, 185, 376)
    GUICtrlSetData(-1, "Tiere|Hilfe")
    GUICtrlSetFont(-1, 24, 400, 0, "MS Sans Serif")
    GUICtrlSetState(-1, $GUI_show)
    GUISetState(@SW_SHOW, $Form1)
    GUISetState(@SW_SHOW, $hChild)
    ;GUISetState(@SW_MAXIMIZE, $Form1)
    _Start()

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

    _IELoadWait($oIE)
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit

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

    EndSwitch
    WEnd

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

    Func _Start()
    $Web = "http://www.hunde.de"
    _IENavigate($oIE, $Web)
    EndFunc ;==>_Start

    [/autoit]

    Das Child Fenster wird abgdeckt!

    :( Ilse

  • So habe ich es hinbekommen, wenn es das ist was Du möchtest ... ;)

    Spoiler anzeigen
    [autoit]

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

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

    $oIE = _IECreateEmbedded()

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

    $Form1 = GUICreate("Form1", 1000, 800, 239, 155, BitOR($WS_CLIPCHILDREN, $WS_OVERLAPPEDWINDOW, $WS_CLIPSIBLINGS), $WS_EX_COMPOSITED)
    $Browser = GUICtrlCreateObj($oIE, 16, 16, 900, 700)

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

    $hChild = GUICreate("", 185, 376, 432, 16, BitOR($WS_POPUP, $WS_VISIBLE), $WS_EX_MDICHILD, $Form1)
    $List1 = GUICtrlCreateList("", 0, 0, 185, 376)
    GUICtrlSetData(-1, "Tiere|Hilfe")
    GUICtrlSetFont(-1, 24, 400, 0, "MS Sans Serif")

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

    GUISetState(@SW_SHOW, $Form1)

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

    _Start()

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    GUIDelete ($Form1)
    ExitLoop

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

    EndSwitch
    WEnd

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

    Func _Start()
    $Web = "http://www.hunde.de"
    _IENavigate($oIE, $Web, 1)
    ;~ _IELoadWait($oIE)
    EndFunc ;==>_Start

    [/autoit]

    Das Flackern des eingebundenen Internet Explorers bei Größenveränderung des Hauptfensters bekomme ich leider nicht ganz weg ...


    Gruß
    Greenhorn


  • Hallo Greenhorn,

    schön daß du dich wieder gemeldet hast.
    Folgendes:
    Beim Start ist die Gui oben. Das ist ok.
    Du kannst auch das Hauptfenster "bewegen" geht auch...
    Die Gui ist drin...!
    Aber mach mal folgendes:
    Verändere in der Hauptgui unten rechts mal die Größe des Fensters! Ganz klein

    Dann ist plötzlich die 2. Gui außerhalb.
    Und das sollte nicht sein.

    ;) Grüße Ilse

  • Hallo Ilse

    Ist natürlich nicht perfekt und sollte noch überarbeitet werden.
    Aber ich denke, es zeigt Dir eine Möglichkeit auf, die Du weiterbearbeiten kannst.

    Spoiler anzeigen
    [autoit]

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

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

    Global $xSizeMain = 1000, $ySizeMain = 800
    Global $xPosMain = -1, $yPosMain = -1
    Global $xSizeChild = 200, $ySizeChild = 400
    Global $xPosChild = $xSizeMain - $xSizeChild - 25, $yPosChild = -5
    Global $ShowChild = True

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

    $oIE = _IECreateEmbedded()

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

    $Form1 = GUICreate("Form1", $xSizeMain, $ySizeMain, $xPosMain, $yPosMain, BitOR($WS_CLIPCHILDREN, $WS_OVERLAPPEDWINDOW, $WS_CLIPSIBLINGS), $WS_EX_COMPOSITED)
    $Browser = GUICtrlCreateObj($oIE, 0, 0, $xSizeMain, $ySizeMain)

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

    $hChild = GUICreate("", $xSizeChild, $ySizeChild, $xPosChild, $yPosChild, BitOR($WS_POPUP, $WS_VISIBLE), $WS_EX_MDICHILD, $Form1)
    $List1 = GUICtrlCreateList("", 0, 0, $xSizeChild, $ySizeChild)
    GUICtrlSetData(-1, "Tiere|Hilfe")
    GUICtrlSetFont(-1, 24, 400, 0, "MS Sans Serif")

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

    GUISetState(@SW_SHOW, $Form1)
    GUIRegisterMsg($WM_SIZE, '_OnResize')

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

    _Start()

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    GUIDelete ($Form1)
    ExitLoop
    EndSwitch
    WEnd

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

    Exit

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

    Func _Start()
    $Web = "http://www.hunde.de"
    _IENavigate($oIE, $Web, 0)
    EndFunc ;==>_Start

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

    Func _OnResize($hwnd, $iMsg, $iwParam, $ilParam)
    If $hwnd = $Form1 Then
    Local $Width = BitAND($ilParam, 0xFFFF)
    Local $Height = BitShift($ilParam, 16)
    Local $aPos = WinGetPos($Form1)

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

    GUICtrlSetPos($Browser, 0, 0, $Width, $Height) ;Change size of Browser Object

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

    WinMove($hChild, "", $aPos[0] + $aPos[2] - $xSizeChild - 28, $aPos[1] + 30)
    If $ShowChild And ($Width < $xSizeChild Or $Height < $ySizeChild) Then
    WinSetState($hChild, "", @SW_HIDE)
    $ShowChild = False
    EndIf
    If Not $ShowChild And $Width >= $xSizeChild And $Height >= $ySizeChild Then
    WinSetState($hChild, "", @SW_SHOW)
    $ShowChild = True
    EndIf
    EndIf
    Return 'GUI_RUNDEFMSG'
    EndFunc

    [/autoit]

    Grüsse
    Veronesi

  • Hallo ihr beiden,

    schön zu hören, daß es nun so klappt, wie Du möchtest, Ilse.

    Allerdings ist noch ein kleiner Fehler in der _OnResize-Funktion enthalten.
    Der Rückgabewert sollte

    [autoit]

    Return $GUI_RUNDEFMSG

    [/autoit]

    sein. ;)

    Was das Verstehen der Funktion angeht: WM_SIZE message


    Gruß
    Greenhorn


  • merci nochmal für den Tip Greenhorn.

    Bin gerade dabei die Position der Child Gui anzupassen.
    Wo kann ich den Wert von oben und links und rechts angeben?

    Bin gerade etwas verwirrt...
    Ich meine, daß die kpl. Gui mit Liste (und eingestellter Größe)
    z.B. Links und z.B. von oben 80 Pixel erschent.

    ;) Liebe Grüße
    Ilse

    Einmal editiert, zuletzt von Ilse (29. März 2012 um 11:07)

  • Bin gerade etwas verwirrt...
    Ich meine, daß die kpl. Gui mit Liste (und eingestellter Größe)
    z.B. Links und z.B. von oben 80 Pixel erschent.


    Sorry, habe vielleicht eine etwas lange Leitung ...
    Meinst Du die Position beim Start des Skriptes ?
    Kannst Du es evtl. etwas genauer definieren (Skriptausschnitt mit Kommentaren) ?


    LG
    Greenhorn


  • Hallo,

    sorry, konnte mich erst heute wieder melden.
    Ich hatte eine schwere Grippe.
    ...Noch nicht 100% da...

    Also, ich wollte das Script so aufbauen:

    Die Liste sollte im Tab sein.
    Das habe ich nicht geschafft.

    Hier mal mein Beispiel:

    Spoiler anzeigen
    [autoit]


    #include<Array.au3>
    #include <IE.au3>
    #Include <GuiTab.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    _IEErrorHandlerRegister ()

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

    Global $xSizeMain = 1000, $ySizeMain = 800
    Global $xPosMain = -1, $yPosMain = -1
    Global $xSizeChild = 200, $ySizeChild = 400
    Global $xPosChild = $xSizeMain - $xSizeChild - 25, $yPosChild = -5
    Global $ShowChild = True

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

    Dim $oIE[1]
    $oIE[0] = _IECreateEmbedded()
    Dim $Tab[1]

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

    $gui = GUICreate("Browser",800,600)

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

    $TabParent = GUICtrlCreateTab(20,60,760,520)
    $Tab[0] = GUICtrlCreateTabItem("Tab")
    GUICtrlCreateObj($oIE[0],40,100,700,460)

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

    GUISetState()

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

    _IENavigate($oIE[0],"http://www.hunde.de")

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

    While GUIGetMsg()<>-3 * Sleep(10)
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case -3
    Exit

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

    Case $TabParent
    $selected = GUICtrlRead($TabParent)
    WinSetTitle($gui,"",_IEPropertyGet($oIE[$selected],"locationname"))

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

    EndSwitch
    WEnd

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

    ;~ Func _OnResize($hwnd, $iMsg, $iwParam, $ilParam)
    ;~ If $hwnd = $Form1 Then
    ;~ Local $Width = BitAND($ilParam, 0xFFFF)
    ;~ Local $Height = BitShift($ilParam, 16)
    ;~ Local $aPos = WinGetPos($Form1)

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

    ;~ GUICtrlSetPos($Browser, 0, 0, $Width, $Height) ;Change size of Browser Object

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

    ;~ WinMove($hChild, "", $aPos[0] + $aPos[2] - $xSizeChild - 28, $aPos[1] + 30)
    ;~ If $ShowChild And ($Width < $xSizeChild Or $Height < $ySizeChild) Then
    ;~ WinSetState($hChild, "", @SW_HIDE)
    ;~ $ShowChild = False
    ;~ EndIf
    ;~ If Not $ShowChild And $Width >= $xSizeChild And $Height >= $ySizeChild Then
    ;~ WinSetState($hChild, "", @SW_SHOW)
    ;~ $ShowChild = True
    ;~ EndIf
    ;~ EndIf
    ;~ Return $GUI_RUNDEFMSG
    ;~ EndFunc

    [/autoit]

    Hoffe Ihr habt eine Lösung.

    Liebe Grüße
    ;) Ilse

  • Hallo,

    also zuerst einmal meine besten Genesungswünsche. :)
    Mit einer echten Grippe ist nicht zu spaßen.

    Zu Deinem Skript: Du möchtest den eingebetteten IE und die Liste zusammen in dem Tab haben ?


    Grüße
    Greenhorn


  • Habe es jetzt einfach mal so gemacht ...


    Spoiler anzeigen
    [autoit]

    #include <WindowsConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <Constants.au3>
    #include <StaticConstants.au3>
    #include <ListBoxConstants.au3>
    #include <Array.au3>
    #include <IE.au3>
    #Include <GuiTab.au3>

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

    ; Global control identifiers
    Global $idIE
    Global $idList
    Global $idTab
    Global $idTabItem [1]

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

    ;-- Run the Script...
    Exit (AutoItScriptMain ( ))

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

    Func AutoItScriptMain ( )

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

    Local $hwndMain
    Local $hwndChild
    Local $sCaption
    Local $oIE [1]

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

    $sCaption = StringFormat ("%s", StringTrimRight (@ScriptName, 4))

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

    ; Create an embedded Internet Explorer Object
    $oIE[0] = _IECreateEmbedded ( )

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

    If (not IsObj ($oIE[0])) Then
    ErrorMsg ("Internet Explorer konnte nicht eingebettet werden.\n\nProgramm wird beendet.")
    Return (-1)
    EndIf

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

    ; Create the main window
    $hwndMain = GUICreate ($sCaption, 800, 600, (@DesktopWidth - 800) / 2, (@DesktopHeight - 600) /2, _
    BitOR($WS_CLIPCHILDREN, $WS_OVERLAPPEDWINDOW, $WS_CLIPSIBLINGS))

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

    ; Create the child windows

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

    $idTab = GUICtrlCreateTab (20, 60, 760, 520)

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

    $idTabItem[0] = GUICtrlCreateTabItem ("Tab")
    $idIE = GUICtrlCreateObj ($oIE[0], 40, 100, 700, 460)

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

    $hwndChild = GUICreate ("", 185, 376, 80, 80, _
    BitOR($WS_POPUP, $WS_VISIBLE), $WS_EX_MDICHILD, _
    GUICtrlGetHandle ($idTab))

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

    $idList = GUICtrlCreateList ("", 0, 0, 185, 406, BitOR($LBS_SORT, $WS_BORDER, $WS_VSCROLL));, $WS_EX_TOPMOST)
    GUICtrlSetData ($idList, "Tiere|Hilfe")
    GUICtrlSetFont ($idList, 24, 400, 0, "MS Sans Serif")

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

    GUICtrlCreateTabItem ("") ; end tabitem definition

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

    ; Show the main window
    GUISetState (@SW_SHOW, $hwndMain)

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

    ; Navigate to homepage
    _IENavigate ($oIE[0], "http://www.hunde.de", 1)

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

    ; Set then main window's caption
    $sCaption = StringFormat ("%s - %s", StringTrimRight (@ScriptName, 4), _IEPropertyGet($oIE[0],"locationname"))
    WinSetTitle ($hwndMain, "", $sCaption)

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

    ; Message loop
    While (TRUE)

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

    Switch (GUIGetMsg ( ))

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

    Case $GUI_EVENT_CLOSE
    GUIDelete ($hwndMain)
    ExitLoop

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

    Case $idTab
    $selected = GUICtrlRead ($idTab)
    ConsoleWrite (StringFormat ("%s\n", $selected))
    WinSetTitle ($hwndMain,"",_IEPropertyGet($oIE[$selected],"locationname"))

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

    EndSwitch
    WEnd

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

    EndFunc

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

    Func ErrorMsg ($sText)

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

    MsgBox (BitOr($MB_OK, $MB_ICONHAND), StringTrimRight (@ScriptName, 4), StringFormat ("%s\n", $sText))

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

    EndFunc

    [/autoit]


    EDIT: Ich habe mal ein wenig damit herumgespielt und festgestellt dass es eigentlich auch ohne Containerfenster für die ListBox geht.
    Allerdings verschwindet diese immer wieder, wenn der eingebettete IE den Fokus bekommt ...


    Grüße
    Greenhorn