Am Mauszeiger

  • hi Leutebin zur Zeit an einem Projekt, indem ich gerade Hilfe brauche.
    Ich will machen, dass wenn ich auf ein Bild draufklicke, dass es dann am Mauszeiger ahfetet, bis ich auf eine andere Stelle n meinem Gui klicke.
    Auf dieser Stelle soll es dann wieder abgesetzt werden. Wie bekomme ich das hin, dass das Bild Am Mauszeiger hängen bleibt, bis ich es absetzen will?
    danke jetzt schon mal :D
    mfg Bio

    Einmal editiert, zuletzt von Bio Drink (14. April 2009 um 21:10)

  • Kein Thema!
    ICh würde aber im OnEventModus auf ein Klick-Event auf das Bild warten (GUICtrlSetOnEvent(-1, "_aufnehmen"))
    Und dann mit _IsPressed und WinActive das Loslassen abfangen ;)

  • Ungefähr so eben zusammengebastelt (brauchst nur eine test.bmp im selbem Verzeichniss, hab ich angefügt ;) :(

    Spoiler anzeigen
    [autoit]

    #include <Misc.au3>
    Opt("GUIOnEventMode", 1)
    GUICreate("Form", @DesktopWidth, @DesktopHeight, 0, 0)
    $Img = GUICtrlCreatePic("", 500, 300)
    GUICtrlSetImage(-1, @ScriptDir & "\test.bmp")
    GUICtrlSetOnEvent(-1, "_Aufnehmen")
    GUISetState()

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

    While 1
    Sleep(100)
    WEnd

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

    Func _Aufnehmen()
    $dll = DllOpen("user32.dll")
    Sleep(100)
    Do
    $Pos = MouseGetPos()
    GUICtrlSetPos($Img, $Pos[0], $Pos[1])
    Until _IsPressed("01", $dll) And WinActive("Form")
    DllClose($dll)
    EndFunc ;==>_Aufnehmen

    [/autoit]

    autoit.de/wcf/attachment/4412/

  • danke, dein Skriptbeispiel hat mir echt weitergeholfen. Jetzt bekomme ich es hin :rofl:
    mfg Bio

  • Mir gings jetzt nur ums das mit den Bildern... ;)
    Ich finde, es ist gut geworden! :D

    Sonst noch Fragen? :D

  • :D ja das ist gut, wenn ich sonst noch Fragen habe poste ich sie einfach wieder hin, danke schon mal :D
    mfg Bio

  • Ich habe jetzt mein skript wie bei dir aufgebaut, nur mit meinen angaben. Allerdings wirkt es bei mir nicht...
    ich kann das Skript weder aufnehmen noch absetzen.
    In diesem Skript ist nur die aufnehmen Funktion drinn.
    [Spoiler]

    [autoit]


    #include <guiconstants.au3>
    #include <Misc.au3>
    #include <GDIplus.au3>
    $main=GUICreate("",@desktopwidth,@desktopheight)
    GUISetState(@sw_show)
    GUISetBkColor(0x000000)
    global $einzel=GUICtrlCreateLabel("Einzelspieler",600,50,@DesktopWidth,50)
    GUICtrlSetFont(-1,30)
    GUICtrlSetColor($einzel,0x00FFD0)
    while 1
    $msg=GUIGetMsg()
    Select
    case $msg=$gui_event_close
    exit 1
    case $msg=$einzel
    GUIDelete($main)
    _einzel()
    EndSelect
    WEnd
    Func _einzel()
    $neu=GUICreate("Spiel",@desktopwidth,@desktopheight)
    GUISetState(@sw_show)
    Global $Haus=GUICtrlCreatePic("C:\Users\Patrick\Desktop\Kastenspiel\Bilder\Haus.bmp",600,300,50,50)
    GUICtrlSetOnEvent(-1,"_onevent")
    $handle=WinGetHandle("")
    _GDIPlus_Startup ()
    $graphic=_GDIPlus_GraphicsCreateFromHWND($handle)
    $pen=_GDIPlus_PenCreate()
    _GDIPlus_GraphicsDrawLine($graphic,1000,200,1000,@desktopheight,$pen)
    _GDIPlus_GraphicsDrawLine($graphic,0,200,@desktopwidth,200,$pen)
    Do
    Until $gui_event_close=GUIGetMsg()
    _GDIPlus_PenDispose($pen)
    _GDIPlus_GraphicsDispose($graphic)
    _GDIPlus_Shutdown()
    EndFunc

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

    Func _onevent()
    $dll=DllOpen("user32.dll")
    Sleep(100)
    Do
    $pos=MouseGetPos()
    GUICtrlSetPos($Haus,$pos[0],$pos[1])
    Until _IsPressed("01") And WinActive("Spiel")
    EndFunc
    DllClose($dll)

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

    Func _weiter()
    if _IsPressed("1B") Then
    exit 1
    EndIf
    EndFunc

    [/autoit]

    Einmal editiert, zuletzt von Bio Drink (14. April 2009 um 16:08)

  • Also erstmal die Includes aufräumen und die GUI ein bisschen anpassen:

    [autoit]

    #include <GUIConstantsEx.au3>
    #include <Misc.au3>
    #include <GDIplus.au3>
    $main = GUICreate("", @DesktopWidth, @DesktopHeight, 0, 0, $WS_POPUP)
    GUISetState()

    [/autoit]

    Dann, wann wird die Funktion _onevent() eigentlich aufgerufen? Außerdem gehört das

    [autoit]

    DllClose($dll)

    [/autoit]


    mit darein, also so:

    Spoiler anzeigen
    [autoit]

    Func _onevent()
    $dll = DllOpen("user32.dll")
    Sleep(100)
    Do
    $pos = MouseGetPos()
    GUICtrlSetPos($Haus, $pos[0], $pos[1])
    Until _IsPressed("01") And WinActive("Spiel")
    DllClose($dll)
    EndFunc ;==>_onevent

    [/autoit]

    Außerdem musst du ganz gut aufpassen! Kombiniere OnEventMode nicht mit MsgLoop-Modus!

  • Also entweder alles auf OnEvent mit

    [autoit]

    Opt("GUIOnEventMode", 1)

    [/autoit]


    oder nicht, du musst dich entscheiden ;)
    Es lässt sich zwar beides wechseln in einem Skript, das ist aber oft unsauber und mit Vorsicht zu genießen ;)

    Aber dazu frag mal Oscar, der hat darüber mal irgendwas geschrieben... :)

  • ok, jetzt hab ich es soweit, dass es sich bewegt, es geht aba net nach meiner Maus, des bewegt sich einfach irgendwo hin...

  • ok, hier ist es, es bewegt sich aber nur wenn ich auf das Bild draufklicke und dann auch nur irgendwo hin.
    Ich kenne mich mit dem "Oneventmodus" nicht so gut aus, also wenn da was falsch ist bitte sagen, danke :D
    [Spoiler]

    [autoit]


    #include <guiconstants.au3>
    #include <Misc.au3>
    #include <GDIplus.au3>
    #include <windowsconstants.au3>
    $main=GUICreate("",@desktopwidth,@desktopheight,0,0,$WS_POPUP)
    GUISetState(@sw_show)
    GUISetBkColor(0x000000)
    global $einzel=GUICtrlCreateLabel("Einzelspieler",600,50,@DesktopWidth,50)
    GUICtrlSetFont(-1,30)
    GUICtrlSetColor($einzel,0x00FFD0)
    while 1
    $msg=GUIGetMsg()
    Select
    case $msg=$gui_event_close
    exit 1
    case $msg=$einzel
    GUIDelete($main)
    _einzel()
    EndSelect
    WEnd
    Func _einzel()
    $neu=GUICreate("Spiel",@desktopwidth,@desktopheight)
    GUISetState(@sw_show)
    Opt("guioneventMode",1)
    Global $Haus=GUICtrlCreatePic("C:\Users\Patrick\Desktop\Kastenspiel\Bilder\Haus.bmp",600,300,50,50)
    GUICtrlSetOnEvent($Haus,"_onevent")
    _weiter()
    $handle=WinGetHandle("")
    _GDIPlus_Startup ()
    $graphic=_GDIPlus_GraphicsCreateFromHWND($handle)
    $pen=_GDIPlus_PenCreate()
    _GDIPlus_GraphicsDrawLine($graphic,1000,200,1000,@desktopheight,$pen)
    _GDIPlus_GraphicsDrawLine($graphic,0,200,@desktopwidth,200,$pen)
    Do
    Until $gui_event_close=GUIGetMsg()
    _GDIPlus_PenDispose($pen)
    _GDIPlus_GraphicsDispose($graphic)
    _GDIPlus_Shutdown()
    while 1
    $msg=GUIGetMsg()
    Select
    case $msg=$gui_event_close
    exit 1
    EndSelect
    WEnd
    EndFunc

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

    Func _onevent()
    $dll=DllOpen("user32.dll")
    Do
    $pos=MouseGetPos()
    GUICtrlSetPos($Haus,$pos[0],$pos[1])
    Until _IsPressed("01") And WinActive("Spiel")
    DllClose($dll)
    EndFunc

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

    Func _weiter()
    if _IsPressed("1B") Then
    exit 1
    EndIf
    EndFunc

    [/autoit]
  • Sry das konnte ich mir nicht ansehen und habs mal aufgeräumt :D Ist jetzt nur ein wenig leichter zu lesen.. ob ich bugs hinzugefügt habe oder entfernt habe hab ich kein plan... habs nich mal getestet ;)

    Spoiler anzeigen
    [autoit]

    #include <guiconstants.au3>
    #include <Misc.au3>
    #include <GDIplus.au3>
    #include <windowsconstants.au3>

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

    Opt("guioneventMode",1)

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

    $main = GUICreate("",@desktopwidth,@desktopheight,0,0,$WS_POPUP)
    GuiSetOnEvent($GUI_EVENT_CLOSE, "Terminate")
    GUISetBkColor(0x000000)
    $einzel = GUICtrlCreateLabel("Einzelspieler",600,50,@DesktopWidth,50)
    GuiCtrlSetOnEvent(-1, "_einzel")
    GUICtrlSetFont(-1,30)
    GUICtrlSetColor($einzel,0x00FFD0)
    GUISetState(@SW_Show)

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

    $neu = GUICreate("Spiel",@desktopwidth,@desktopheight)
    GuiSetOnEvent($GUI_EVENT_CLOSE, "Terminate")
    $Haus=GUICtrlCreatePic("C:\Users\Patrick\Desktop\Kastenspiel\Bilder\Haus.bmp",600,300,50,50)
    GUICtrlSetOnEvent($Haus,"_onevent")
    GuiSetState(@SW_HIDE)

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

    while 1
    sleep(100)
    WEnd

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

    Func _einzel()
    GUIDelete($main)
    GuiSetState(@SW_SHOW, $neu)
    HotkeySet("{ESC}", "Terminate")

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

    $handle=WinGetHandle("")
    _GDIPlus_Startup ()
    $graphic=_GDIPlus_GraphicsCreateFromHWND($handle)
    $pen=_GDIPlus_PenCreate()
    _GDIPlus_GraphicsDrawLine($graphic,1000,200,1000,@desktopheight,$pen)
    _GDIPlus_GraphicsDrawLine($graphic,0,200,@desktopwidth,200,$pen)

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

    while 1
    sleep(100)
    WEnd
    EndFunc

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

    Func _onevent()
    $dll=DllOpen("user32.dll")
    Do
    $pos=MouseGetPos()
    GUICtrlSetPos($Haus,$pos[0],$pos[1])
    Until _IsPressed("01")
    DllClose($dll)
    EndFunc

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

    Func Terminate()
    Exit
    If IsDeclared("pen") Then
    _GDIPlus_PenDispose($pen)
    _GDIPlus_GraphicsDispose($graphic)
    _GDIPlus_Shutdown()
    Endif
    EndFunc

    [/autoit]

    2 Mal editiert, zuletzt von ChaosKeks (14. April 2009 um 19:44)

    • Offizieller Beitrag

    Habe das Script nochmal ein wenig aufgeräumt. Voralledingen die Variablen $pen und $graphic als Global definiert damit Autoit sichn nicht beklagt. Desweiteren hab ich auch noch die Reihenfolge in der Function Terninate in die richtige Reihenfolge gebracht -

    Spoiler anzeigen
    [autoit]

    #include <guiconstants.au3>
    #include <Misc.au3>
    #include <GDIplus.au3>
    #include <windowsconstants.au3>

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

    Opt("guioneventMode", 1)
    Global $graphic, $pen

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

    $main = GUICreate("", @DesktopWidth, @DesktopHeight, 0, 0, $WS_POPUP)
    GUISetOnEvent($GUI_EVENT_CLOSE, "Terminate")
    GUISetBkColor(0x000000)
    $einzel = GUICtrlCreateLabel("Einzelspieler", 600, 50, @DesktopWidth, 50)
    GUICtrlSetOnEvent(-1, "_einzel")
    GUICtrlSetFont(-1, 30)
    GUICtrlSetColor($einzel, 0x00FFD0)
    GUISetState(@SW_SHOW)

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

    $neu = GUICreate("Spiel", @DesktopWidth, @DesktopHeight)
    GUISetOnEvent($GUI_EVENT_CLOSE, "Terminate")
    $Haus = GUICtrlCreatePic("C:\Users\Patrick\Desktop\Kastenspiel\Bilder\Haus.bmp", 600, 300, 50, 50)
    GUICtrlSetOnEvent($Haus, "_onevent")
    GUISetState(@SW_HIDE)

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

    While 1
    Sleep(100)
    WEnd

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

    Func _einzel()
    GUIDelete($main)
    GUISetState(@SW_SHOW, $neu)
    HotKeySet("{ESC}", "Terminate")
    $handle = WinGetHandle("")
    _GDIPlus_Startup()
    $graphic = _GDIPlus_GraphicsCreateFromHWND($handle)
    $pen = _GDIPlus_PenCreate()
    _GDIPlus_GraphicsDrawLine($graphic, 1000, 200, 1000, @DesktopHeight, $pen)
    _GDIPlus_GraphicsDrawLine($graphic, 0, 200, @DesktopWidth, 200, $pen)

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

    While 1
    Sleep(100)
    WEnd
    EndFunc ;==>_einzel

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

    Func _onevent()
    $dll = DllOpen("user32.dll")
    Do
    $pos = MouseGetPos()
    GUICtrlSetPos($Haus, $pos[0], $pos[1])
    Until _IsPressed("01")
    DllClose($dll)
    EndFunc ;==>_onevent

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

    Func Terminate()
    If IsDeclared("pen") Then
    _GDIPlus_PenDispose($pen)
    _GDIPlus_GraphicsDispose($graphic)
    _GDIPlus_Shutdown()
    EndIf
    Exit
    EndFunc ;==>Terminate

    [/autoit]