Seite 1 von 1
Cursor Problem
Verfasst: 20.10.2007 21:13
von gnasen
Ich verzweifel gerade an einem (wahrscheinlich trivialen) Problem.
Ich möchte den Systemmauscursor Kopieren, einen vom File Laden und bei beispielsweise Rechtsklick den geladenen anzeigen. Sonst den vorher kopierten vom System.
Ich habe es mit den Befehlen GetCursor_(), copyicon_(), setsystemcursor_(), setcursor_() und so einigem mehr versucht, aber ich bekomme es nur mit dem setsystemcursor hin, wenn ich von einer Datei lade:
SetsystemCursor_(LoadCursorFromFile_("normal.cur"), #OCR_NORMAL)
Die "normalen" Cursor kann ich nach dem Benutzen ja nicht mehr nutzen, da sie von dem neuen überschrieben wurden.
Bei vielen Verwendungen bekomme ich über GetLastError den Fehlercode 6 fürs benutzen eines falschen Handels.
Der setsystemcursor macht meiner Meinung nach auch nicht das, was er immer tun sollte.
Entweder hab ich ein Brett vorm Kopf, oder irgendwas mißverstanden. Auf jedenfall schonmal vielen Dank für eure Hilfe!
Verfasst: 20.10.2007 21:15
von RSBasic
Verfasst: 20.10.2007 22:27
von gnasen
hervorragend, damit sind wir schon 2, zusammen sind wir stark
Ich hab auch das Problem, dass ich immer nur so selten wie möglich über API Befehle Sachen realisiere, aber wenn man dann einmal muss, hat man den Salat, dass man sich selten damit befasst...
Verfasst: 20.10.2007 22:28
von Thomas
sucht ihr sowas?
Aus'm CodeArchiv:
Code: Alles auswählen
; German forum:
; Author: Unknown (updated for PB4.00 by blbltheworm)
; Date: 16. July 2003
; OS: Windows
; Demo: No
;
; Fenster mit Gadgets oeffnen
;
hWnd = OpenWindow(1,10,10,400,200,"",#PB_Window_SystemMenu)
CreateGadgetList(hWnd)
Button1 = ButtonGadget(1,210,10,100,25,"WAIT")
Button2 = ButtonGadget(2,210,40,100,25,"HELP")
ListView = ListViewGadget(3,10,10,200,150)
;
; Standard-Cursor in allen Fenster-Klassen auf 0 setzen
; Ohne dies kann es zum cursor-flickern kommen
;
SetClassLong_(hWnd,#GCL_HCURSOR,0)
SetClassLong_(Button1,#GCL_HCURSOR,0)
SetClassLong_(Button2,#GCL_HCURSOR,0)
SetClassLong_(ListView,#GCL_HCURSOR,0)
;
; Cursor laden
;
#IDC_HELP = 32651
cur0 = LoadCursor_(0, #IDC_CROSS)
cur1 = LoadCursor_(0, #IDC_WAIT)
cur2 = LoadCursor_(0, #IDC_HELP)
cur3 = LoadCursor_(0, #IDC_NO)
;
; Hauptschleife
;
Repeat
Event = WaitWindowEvent()
Gosub changecursor
;Select Event
;EndSelect
Until Event = #PB_Event_CloseWindow
;
; Ende
;
DestroyCursor_(cur0)
DestroyCursor_(cur1)
DestroyCursor_(cur2)
DestroyCursor_(cur3)
End
;
; SUB zum wechseln des MouseCursors
;
changecursor:
GetCursorPos_(cursorpos.POINT)
MapWindowPoints_(0, hWnd, cursorpos, 1)
Select ChildWindowFromPoint_(hWnd, cursorpos\x, cursorpos\y)
Case Button1 : SetCursor_(cur1) ; Cursor ueber Button 1
Case Button2 : SetCursor_(cur2) ; Cursor ueber Button 2
Case ListView : SetCursor_(cur3) ; Cursor ueber ListView
Case hWnd : SetCursor_(cur0) ; Default, fuer das Hauptfenster
EndSelect
Return
Verfasst: 20.10.2007 22:50
von RSBasic
@Thomas
>sucht ihr sowas?
Ich nicht.
Verfasst: 20.10.2007 23:20
von gnasen
nicht ganz, ersteinmal das ganze Systemweit, bzw über allen Fenstern, und dann würd ich gerne, falls es halt notwendig ist, den alten Cursor zwischenspeichern um ihn am ende neu zu laden
Verfasst: 21.10.2007 12:45
von gnasen
Ich hab hier mal einen Codeschnipsel, der motiviert hier ja immer zur Hochform
Code: Alles auswählen
OpenWindow(0,0,0,100,100,"")
CreateGadgetList(WindowID(0))
ButtonGadget(0,10,10,20,20,"1")
ButtonGadget(1,30,10,20,20,"2")
Global currentcursor
Global tempcursor
Global newcursor
Global result
Procedure DamnDoIt()
currentcursor = getcursor_()
tempcursor = copyicon_(currentcursor)
;newcursor = LoadCursorFromFile_("kill.cur")
;result = SetsystemCursor_(newcursor,32512)
result = SetsystemCursor_(tempcursor,32512)
Debug currentcursor
Debug tempcursor
Debug newcursor
Debug result
EndProcedure
Procedure MakeItBetter()
Debug tempcursor
result = SetsystemCursor_(tempcursor,32512)
error = GetLastError_()
Debug result
Debug error
EndProcedure
Repeat
EventID = WaitWindowEvent()
If EventID = #PB_Event_Gadget
Select EventGadget()
Case 0
DamnDoIt()
Case 1
MakeItBetter()
EndSelect
EndIf
Until EventID = #PB_Event_CloseWindow
Damit die Maus nicht jedesmal neu in der Systemsteuerung gesetzt werden muss, läd er die bestehende Maus (ansonsten halt die Kommentarzeichen entfernen...). Die ErrorMsg ist 1402 und besagt "Invalid Cursor Handle", aber warum? In einem VB Beispiel wird es genauso gemacht, funktioniert aber. Hängt es mit CopyIcon_() zusammen?
Verfasst: 21.10.2007 16:24
von gnasen
Und der Monolog geht weiter
Ich denke mittlerweile, dass er bei getCursor_() immer den Hourglass Cursor kopiert. Das Wechseln der Zeiger deutet darauf hin.
Code: Alles auswählen
Global currentcursor
Global tempcursor
Global newcursor
Procedure SaveC()
currentcursor = getcursor_()
tempcursor = copyicon_(currentcursor)
newcursor = LoadCursorFromFile_("kill.cur")
result = SetsystemCursor_(newcursor,32512)
EndProcedure
Procedure RestoreC()
result = SetsystemCursor_(currentcursor,32512)
error = GetLastError_()
EndProcedure