GUI ohne titelleiste durch klick und bewegung verschiebbar machen?

  • ich habe meine GUI mit

    [autoit]

    $WS_POPUP

    [/autoit]

    der titelleiste beraubt, jedoch würde ich dennoch gern das fenster mit der maus verschieben können.
    konnt ihr mich mal auf den richtigen weg bringen?

    I spent 10 minutes reviewing code and thinking "What kind of drugs is this guy on?" before realizing it was something I wrote.

    Einmal editiert, zuletzt von Maximus1 (31. Mai 2011 um 19:04)

  • ich habe meine GUI mit

    [autoit]

    $WS_POPUP

    [/autoit]

    der titelleiste beraubt, jedoch würde ich dennoch gern das fenster mit der maus verschieben können.
    konnt ihr mich mal auf den richtigen weg bringen?

    Wenn du denn dein komplettes Script posten könntest ;)
    Du meinst dein GUI kann sich nicht mehr verschieben oder wie?

  • Beispiel - WM_NCHITTEST
    [autoit]

    #Region - Timestamp
    ;2011-05-31 15:29:19
    #EndRegion

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

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

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

    #region - GUI Create
    $GUI=GUICreate('',200,200,-1,-1, $WS_POPUP)
    GUISetState()
    #endregion

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

    GUIRegisterMsg($WM_NCHITTEST, "WM_NCHITTEST")

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

    #region - GUI SelectLoop
    While 1
    $msg = GUIGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE
    Exit
    EndSelect
    WEnd
    #endregion

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

    Func WM_NCHITTEST($hWnd, $Msg, $wParam, $lParam)
    Local $iProc
    $iProc = DllCall("user32.dll", "int", "DefWindowProc", _
    "hwnd", $hWnd, "int", $Msg, "int", $wParam, "int", $lParam)
    If @error Then SetError(@error, 0, 0)
    $iProc = $iProc[0]
    If $iProc = $HTCLIENT Then Return $HTCAPTION
    Return $GUI_RUNDEFMSG
    EndFunc

    [/autoit]
  • i2c: ich habe dein script ausprobiert und es geht, aber ich brauche den titel meines fensters, da d4essen metrics gemessen werden und darin was anderes eingepasst wird.

    nagut dann werfe ich mal nein geschreibsel in die runde.

    Spoiler anzeigen
    [autoit]

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

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

    Opt("GUIOnEventMode", 1) ;Wechsle in den OnEvent Modus

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

    Global $gui, $guiPos, $pic, $picPos, $msg, $n, $hdisplay, $MCpos, $SCpos,$SCpos0,$SCpos1, $bild, $widht, $height, $fehler, $Name1, $Name2;, $test, $test1, $SCpostest
    Global $counter =0, $ausg_quali=4, $time = 0, $pid,$border1,$border2,$paaddedborder,$y=0
    Global $hdll_gdi32 = DllOpen("gdi32.dll")
    Global $sFile = "auflösung.ini"

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

    If Not FileExists($sFile) Then
    eingabe()
    Else
    lesen()
    EndIf

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

    Func eingabe()
    $widht = InputBox("auflösung", "breite des side-display")
    $height = InputBox("auflösung", "höhe des side-display")
    $ausg_quali = InputBox("Bildqualität", "Es sind Werte zwischen 1 und 4 möglich." & @CRLF & "Je höher desto besser ist das Bild, aber auch die Systemauslastung")
    $Name1 = InputBox("Dein Name", "Besitzer")
    $Name2 = InputBox("Mein Name", "System")
    iniwrite_eingabe()
    ;~ IniWrite($sFile, "widht", "widht", $widht)
    ;~ IniWrite($sFile, "height", "height", $height)
    ;~ IniWrite($sFile, "Qualität", "level", $ausg_quali)
    EndFunc

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

    Func lesen()
    iniread_lesen()

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

    If $widht <10 Then
    $widht = InputBox("auflösung", "breite des side-display")
    IniWrite($sFile, "widht", "widht", $widht)
    EndIf
    If $height <10 Then
    $height = InputBox("auflösung", "höhe des side-display")
    IniWrite($sFile, "height", "height", $height)
    EndIf
    If $ausg_quali <1 Then
    $ausg_quali = InputBox("Bildqualität", "Es sind Werte zwischen 1 und 4 möglich." & @CRLF & "Je höher desto besser ist das Bild, aber auch die Systemauslastung")
    IniWrite($sFile, "Qualität", "level", $ausg_quali)
    EndIf
    EndFunc

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

    WinWait("Windows Media Center",'',5); warte auf das media center

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

    #Region --- CodeWizard generated code Start ---

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

    ;MsgBox features: Title=Yes, Text=Yes, Buttons=Yes and No, Icon=Critical, Timeout=10 ss
    If Not IsDeclared("iMsgBoxAnswer") Then Local $iMsgBoxAnswer
    $iMsgBoxAnswer = MsgBox(20,"Fehler","Media Center nicht gefunden oder verdeckt"& @CRLF & "Media Center versuchen zu starten?",10)
    Select
    Case $iMsgBoxAnswer = 6 ;Yes
    Run(@WindowsDir & "\ehome\ehshell.exe",@WindowsDir & "\ehome")
    WinWaitActive("Windows Media Center",'',5); warte auf das media center
    Case $iMsgBoxAnswer = 7 ;No
    $fehler = "Media Center Fenster nicht gefunden, abbruch durch User"
    CLOSE_error_abfrage()
    Case $iMsgBoxAnswer = -1 ;Timeout
    $fehler = "Media Center Fenster nicht gefunden, abbruch durch Timeout"
    CLOSE_error_abfrage()
    EndSelect
    #EndRegion --- CodeWizard generated code End ---

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

    FensterMessenMC()

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

    ;==> Windows Metrics lesen
    $border1 = RegRead("HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics","CaptionHeight") ; titelleiste lesen
    $border1 = $border1/15
    $border2 = RegRead("HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics","PaddedBorderWidth") ; Ramen lesen
    $border2 = $border2/15
    $paaddedborder =$border1 + $border2
    ;==> Windows Metrics lesen ende

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

    $hDesktop = _WinAPI_GetDesktopWindow() ;Handle des Desktops hohlem
    $hDC_Desktop = _WinAPI_GetDC($hDesktop) ;Den Device Context vom Desktop ermitteln

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

    $hGUI = GUICreate("Desktop",$widht, $height, $SCpos0, $SCpos1, $WS_SIZEBOX + $WS_MAXIMIZEBOX + $WS_SYSMENU + $WS_POPUP + $WS_EX_CONTROLPARENT) ;Eine gui erstellen
    $hDC_GUI = _WinAPI_GetDC($hGUI) ;den DC davon ermitteln

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

    GUISetBkColor(0x000000)
    GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")
    GUISetState(@SW_SHOW)

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

    $Guten = GUICtrlCreateLabel("Guten Tag " & $Name1 & "." & @CRLF &"Hier ist " & $Name2 &". "& @CRLF & @CRLF & "Ich wünsche dir viel Vergnügen",$widht/5,$height/3,$widht,$height/2)
    GUICtrlSetFont(-1, 20, 800, 0, "Hollywood Hills")
    GUICtrlSetColor(-1, 0x3399FF)
    Sleep(1000)

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

    DllCall($hdll_gdi32, "int", "SetStretchBltMode", "dword", $hDC_GUI, "int", $ausg_quali) ;den schönen blit modus anstellen
    ;~ MouseClickDrag("",,,,)
    While(1)
    Sleep(1)
    MClesen()
    WEnd

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

    Func MClesen()
    _WinAPI_StretchBlt($hDC_GUI,0--$paaddedborder, $y--$paaddedborder, $widht-$paaddedborder,$height-$paaddedborder, $hDC_Desktop, $MCpos[0], $MCpos[1], $MCpos[2], $MCpos[3], $SRCCOPY) ; titelleiste wird von TOP abgezogen und das gemesseneMC wird in das gemessene/voreingestellte anzeigeprogramm eingepasst
    ;Der Befehl transveriert den Inhalt des Desktop DC's auf die GUI DC und passt dabei die grösse an das gegenstück ohne grössenanpassung ist _WinAPI_BitBlt
    $counter = $counter +1
    If $counter = 20 Then; alle 20 durchläufe wird
    FensterMessenMC() ; das fenster vom MC gemessen und als neuer richtwert übernommen
    FensterMessenSC() ; das fenster vom SC gemessen und als neuer richtwert übernommen
    $counter =0
    EndIf
    EndFunc ;==>MClesen

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

    ; Author.........: Yashied
    Func _WinAPI_StretchBlt($hDestDC, $iXDest, $iYDest, $iWidthDest, $iHeightDest, $hSrcDC, $iXSrc, $iYSrc, $iWidthSrc, $iHeightSrc, $iRop)

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

    Local $Ret = DllCall($hdll_gdi32, 'int', 'StretchBlt', 'hwnd', $hDestDC, 'int', $iXDest, 'int', $iYDest, 'int', $iWidthDest, 'int', $iHeightDest, 'hwnd', $hSrcDC, 'int', $iXSrc, 'int', $iYSrc, 'int', $iWidthSrc, 'int', $iHeightSrc, 'dword', $iRop)

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

    If (@error) Or (Not $Ret[0]) Then
    Return SetError(1, 0, 0)
    EndIf
    Return 1
    EndFunc ;==>_WinAPI_StretchBlt

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

    Func FensterMessenMC() ;==>MC wird Vermessen
    $MCpos = WinGetPos("Windows Media Center"); äussere koordinaten des media center abfragen
    If @error Then
    MsgBox(16,"Fehler","Media Center Fenster nicht gefunden")
    $fehler = "Media Center Fenster nicht gefunden"
    CLOSE_error()
    EndIf
    EndFunc ;==> FensterMessen()

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

    Func FensterMessenSC() ;==>SC wird Vermessen

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

    ;~ $test1 = $test
    $SCpos = WinGetPos("Desktop"); äussere koordinaten des screecapture abfragen
    If @error Then
    MsgBox(16,"Fehler","screencap Fenster nicht gefunden")
    $fehler = "screencap Fenster nicht gefunden"
    CLOSE_error()
    EndIf
    $widht = $SCPos[2]
    $height = $SCPos[3] ; veränderung messen und border abziehen!!!!!!
    EndFunc ;==> FensterMessen()

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

    Func iniwrite_eingabe() ;==>werte werden in die datei geschrieben
    IniWrite($sFile, "widht", "widht", $widht)
    IniWrite($sFile, "height", "height", $height)
    IniWrite($sFile, "Qualität", "level", $ausg_quali)
    IniWrite($sFile, "Benutzer", "Name", $Name1)
    IniWrite($sFile, "System", "Name", $Name2)
    EndFunc ;==>iniwrite_eingabe

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

    Func iniread_lesen() ;==werte werden aus der datei gelesen
    $widht=IniRead($sFile, "widht", "widht",1)
    $height=IniRead($sFile, "height", "height",1)
    $SCpos0=IniRead($sFile, "x", "x",1)
    $SCpos1=IniRead($sFile, "y", "y",1)
    $SCpos2=IniRead($sFile, "breite", "breite",1)
    $SCpos3=IniRead($sFile, "höhe", "höhe",1)
    $ausg_quali=IniRead($sFile, "Qualität", "level",1)
    $Name1 = IniRead($sFile, "Benutzer", "Name",1)
    $Name2 = IniRead($sFile, "System", "Name",1)
    EndFunc ;==> iniwrite_close

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

    Func CLOSEClicked() ;==>gute nacht ;)
    $SCpos = WinGetPos("Desktop"); äussere koordinaten des media center abfragen
    If Not @error Then
    iniwrite_close()
    EndIf
    ;benutzte resourcen freigeben
    _WinAPI_ReleaseDC($hGUI, $hDC_GUI)
    _WinAPI_ReleaseDC($hDesktop, $hDC_Desktop)
    Exit
    EndFunc ;==>CLOSEClicked

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

    Func iniwrite_close() ;==>werte für das aneigefenster werden in die datei geschrieben
    IniWrite($sFile, "x", "x", $SCpos[0])
    IniWrite($sFile, "y", "y", $SCpos[1])
    IniWrite($sFile, "breite", "breite", $SCpos[2])
    IniWrite($sFile, "höhe", "höhe", $SCpos[3])
    EndFunc ;==>iniwrite_close

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

    Func CLOSE_error() ;==>abbruch mit fehlerausgabe
    FileOpen("fehler.txt",1); fehlerdatei öffnen oder erstellen
    FileWriteLine("fehler.txt",""& @MDAY&"."&@MON&"."&@YEAR&"_"&@HOUR&":"&@MIN&" "&$fehler&@CRLF); datum und zeit und fehler reinschreiben
    FileClose("fehler.txt")
    _WinAPI_ReleaseDC($hGUI, $hDC_GUI)
    _WinAPI_ReleaseDC($hDesktop, $hDC_Desktop)
    DllClose($hdll_gdi32)
    Exit
    EndFunc ;==>CLOSE_error

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

    Func CLOSE_error_abfrage() ;==>abbruch mit fehlerausgabe
    FileOpen("fehler.txt",1); fehlerdatei öffnen oder erstellen
    FileWriteLine("fehler.txt",""& @MDAY&"."&@MON&"."&@YEAR&"_"&@HOUR&":"&@MIN&" "&$fehler&@CRLF); datum und zeit und fehler reinschreiben
    FileClose("fehler.txt")
    DllClose($hdll_gdi32)
    Exit
    EndFunc ;==>CLOSE_error

    [/autoit]

    I spent 10 minutes reviewing code and thinking "What kind of drugs is this guy on?" before realizing it was something I wrote.

  • Dein Skript erzeugt bei mir interessante grafische Effekte ^^.
    Warum das so ist möchte ich aus Zeitgründen im Moment nicht näher durchleuchten.

    Wenn ich WM_NCHITTEST registriere und das Skript starte, lässt sich dein Popup allerdings wie gewünscht verschieben. Wo liegt also das Problem?

  • kannst du von den "effekten" einen screenshot erstellen?

    ahja, nachdem du was von registrieren geschrieben hast, ist mir dann auch die passende zeile aufgefallen.
    nun geht es. :)

    ich danke dir

    I spent 10 minutes reviewing code and thinking "What kind of drugs is this guy on?" before realizing it was something I wrote.

  • Ist eine Art grafische Rückkopplung in deinem Popup. Der Inhalt des Media Center Fensters wird mitsammt deinem Popup im Popup angezeigt. Dadrin geht's dann immer fröhlich so weiter. Passiert nicht immer. Meist dann, wenn das MMC Fenster vorher schon offen ist.

    Win7 Ultimate x64

  • komisch, ich habe auch win7 x64 und da habe das nicht.

    lässt du es etwa als x64 laufen?

    I spent 10 minutes reviewing code and thinking "What kind of drugs is this guy on?" before realizing it was something I wrote.