GUI mit $WS_POPUP bewegen

  • Hallo liebe Leute,
    ich würde gern meine gui bewegen können, nutze aber $WS_POPUP und $WS_BORDER, sowie ein Menü mit GUICtrlCreateMenu(...).
    Die WM_NCHITTEST Funktion habe ich bereits getestet jedoch ohne Erfolg.

    Spoiler anzeigen
    [autoit]

    #include <WindowsConstants.au3>
    $GUI=GUICreate('Test',300,200,-1,-1,$WS_POPUP+$WS_BORDER)
    $ribbon=GUICtrlCreateMenu('Menü')
    $ribbonexit=GUICtrlCreateMenuItem('BEENDEN',$ribbon)
    GUIRegisterMsg($WM_NCHITTEST, "WM_NCHITTEST")
    GUISetState()
    While 1
    Switch GUIGetMsg()
    Case $ribbonexit, -3
    Exit
    EndSwitch
    WEnd

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

    Func WM_NCHITTEST($hWnd, $iMsg, $iwParam, $ilParam)
    Local $MousePos = MouseGetPos()
    Local $WinPos = WinGetPos($hWnd)
    If $hWnd = $GUI And $iMsg = 0x0084 And $MousePos[1] > $WinPos[1]+35 And $MousePos[0] > $WinPos[0]+5 And _
    $MousePos[0]+5 < $WinPos[0]+$WinPos[2] And $MousePos[1]+5 < $WinPos[1]+$WinPos[3] Then Return 2
    EndFunc

    [/autoit]

    Könnt ihr mir helfen?
    Gruß Gremlin

    • Offizieller Beitrag

    @Oscar, beim ExStyle $WS_EX_CONTROLPARENT funktioniert das Menü nicht mehr.

    Hier mein Vorschlag:

    Spoiler anzeigen
    [autoit]

    #Region - Timestamp
    ; 19.02.2015 17:54:10
    #EndRegion - Timestamp

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

    #include <WindowsConstants.au3>
    #include <GuiconstantsEx.au3>
    #include <SendMessage.au3>
    $GUI = GUICreate('Test', 300, 200, -1, -1, BitOR($WS_POPUP, $WS_BORDER))
    $ribbon = GUICtrlCreateMenu('Menü')
    $ribbonexit = GUICtrlCreateMenuItem('BEENDEN', $ribbon)

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

    GUISetState()
    While 1
    Switch GUIGetMsg()
    Case $ribbonexit, -3
    Exit
    Case $GUI_EVENT_PRIMARYDOWN
    On_Drag()
    EndSwitch
    WEnd
    Func On_Drag()
    Local $aCurInfo = GUIGetCursorInfo($GUI)
    If $aCurInfo[4] = 0 Then ; Mouse not over a control
    DllCall("user32.dll", "int", "ReleaseCapture")
    _SendMessage($GUI, $WM_NCLBUTTONDOWN, $HTCAPTION, 0)
    EndIf
    EndFunc ;==>On_Drag

    [/autoit]

    Edit oder so:

    Spoiler anzeigen
    [autoit]

    #Region - Timestamp
    ; 19.02.2015 18:06:44
    #EndRegion

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

    #include <GuiconstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <SendMessage.au3>

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

    Global Const $SC_DRAGMOVE = 0xF012

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

    HotKeySet("{ESC}", "On_Exit")

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

    $hGUI = GUICreate("X", 100, 100, -1, -1, BitOr($WS_POPUP,$WS_BORDER))
    $ribbon = GUICtrlCreateMenu('Menü')
    $ribbonexit = GUICtrlCreateMenuItem('BEENDEN', $ribbon)
    GUISetState()

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

    While 1
    Switch GUIGetMsg()
    Case $GUI_EVENT_PRIMARYDOWN
    _SendMessage($hGUI, $WM_SYSCOMMAND, $SC_DRAGMOVE, 0)
    Case $ribbonexit, -3
    Exit
    EndSwitch
    WEnd

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

    Func On_Exit()
    Exit
    EndFunc ;==>On_Exit

    [/autoit]

    Btw, GUI Styles werden nicht mit + sondern mit BitOr kombiniert.

    Z.B. würde $hGUI = GUICreate("X", 100, 100, -1, -1,$WS_CHILD+$WS_CHILD+$WS_BORDER) auch $WS_POPUP,$WS_BORDER ergeben.

  • Vielen Dank euch beiden,
    die "Lösung" mit dem ExStyle $WS_EX_CONTROLPARENT hatte ich auch schon probiert, aber vergessen anzugeben. Die Lösung von RAUPI funktioniert mal wieder tadelos.

    BIG THX.
    Gruß Gremlin