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
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
#include <GUIConstantsEx.au3>
Opt("GUIOnEventMode", 1)
$gui = GUICreate("Cursor", 860, 600)
GUISetOnEvent($GUI_EVENT_CLOSE, "_exit")
; 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)
; 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)
; Button damit wir sehen, es wird bei ALLEN der Cursor gesetzt
$button2=GUICtrlCreateButton("Zweiter Button", 100, 200, 80, 25)
; das Pic braucht auch nen Cursor
$n=GUICtrlCreatePic(@Systemdir & "\oobe\images\mslogo.jpg",300,100, 200,50)
; laden der Cursor
LoadCursor(@WindowsDir & "\cursors\drum.ani", GUICtrlGetHandle($n))
LoadCursor(@WindowsDir & "\cursors\horse.ani", $gui)
While 1
Sleep(2000)
WEnd
Func _chanceCursorOnButton()
; die Button kriegen nen Cursor
LoadCursor(@WindowsDir & "\cursors\dinosaur.ani", GUICtrlGetHandle($button1))
EndFunc
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
Func _exit()
Exit
EndFunc
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
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