Eigenen Cursor in GUI setzen

  • Hallo leute ;)

    ich bin neu hier und hoffe ich bin im richtigen Forum gelandet :)

    ich wollte euch ein kleinen Code schnipsel vorstellen, den hier sicher schon viele gebraucht haben
    und immer die Antwort "SetSystemCursor" bekommen haben ;)

    diese 5 Zeilen Code machen das (wenn es nur innerhalb der GUI sein soll) überflüssig

    [autoit]

    ; $szFileName = Pfad zum Cursor (Icon, Ani, Cur ...), $hGuiX = winhandle der GUI oder eines Controlls
    Func LoadCursor($szFileName, $hGuiX)
    $hCursor = DllCall("user32.dll", "hwnd", "LoadCursorFromFile", "str", $szFileName)
    $hCursor = $hCursor[0]
    If $hCursor <> 0 Then DllCall("user32.dll", "hwnd", "SetClassLong", "hwnd", $hGuiX, "int", -12, "hwnd", $hCursor)
    EndFunc

    [/autoit]

    also ein bischen zur Funktion:
    jedes Fenster (GUI) das erstellt wird, muss sich bei Windows registrieren, da kann auch einen Fenstercursor festlegen (kennen sicher viele aus C++) da man das hier nicht kann bei AU3 bleibt noch die Option, das Fenster nachträglich zu ändern.
    Die DLL Funktion SetClassLong ändert von einem x belibigen Fenster den Cursor
    man braucht nur den WinHandle
    das heißt, kein SetSystemCursor oder überschreiben eines Systemcursor und was ich hier meinen Augen schon antun musste ;)

    Hier mal ein Beispiel:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    Opt("GUIOnEventMode", 1)
    $gui = GUICreate("Cursor", 860, 600)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_exit")

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

    ; der Button hat kein Cursor, aber mit einem Klick bekommt er auch einen
    $button1 = GUICtrlCreateButton("Button-Cursor ändern", 100, 100, 120, 25)
    GUICtrlSetOnEvent(-1, "_chanceCursorOnButton")
    GUISetState(@SW_SHOW, $gui)

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

    ; Label, hier muss man kein Cursor setzen nimmt den Curosr des als letzen erstellen Controll an, hier ist der des Bildes
    GUICtrlCreateLabel("text", 100, 20, 100, 20)

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

    ; Button damit wir sehen, es wird bei ALLEN der Cursor gesetzt
    $button2=GUICtrlCreateButton("Zweiter Button", 100, 200, 80, 25)

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

    ; das Pic braucht auch nen Cursor
    $n=GUICtrlCreatePic(@Systemdir & "\oobe\images\mslogo.jpg",300,100, 200,50)

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

    ; laden der Cursor
    LoadCursor(@WindowsDir & "\cursors\drum.ani", GUICtrlGetHandle($n))
    LoadCursor(@WindowsDir & "\cursors\horse.ani", $gui)

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

    While 1
    Sleep(2000)
    WEnd

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

    Func _chanceCursorOnButton()
    ; die Button kriegen nen Cursor
    LoadCursor(@WindowsDir & "\cursors\dinosaur.ani", GUICtrlGetHandle($button1))
    EndFunc

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

    Func LoadCursor($szFileName, $hGuiX)
    $hCursor = DllCall("user32.dll", "hwnd", "LoadCursorFromFile", "str", $szFileName)
    $hCursor = $hCursor[0]
    If $hCursor <> 0 Then DllCall("user32.dll", "hwnd", "SetClassLong", "hwnd", $hGuiX, "int", -12, "hwnd", $hCursor)
    EndFunc

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

    Func _exit()
    Exit
    EndFunc

    [/autoit]

    Das setzt den Cursor aber nur für die GUI
    um den Cursor auch für ein Controll zu setzen muss man sich leicht behelfen

    [autoit]

    LoadCursor($szFileName, GUICtrlGetHandle($controll))

    [/autoit]


    Der Cursor wird für jeden Controll der gleichen klasse Gesetzt
    also setzt man den Cursor für einen Button, haben ALLE Button den Cursor
    es geht nicht, dass zwei button zwei verschiedene Icons haben (so weit ich weiß geht es nicht :))

    ich hoffe das konnte euch weiter helfen :)

    mfg Krabat