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
@gnasen
Dieses Problem habe ich ebenfalls.
http://www.purebasic.fr/german/viewtopic.php?p=169915

Verfasst: 20.10.2007 22:27
von gnasen
hervorragend, damit sind wir schon 2, zusammen sind wir stark :wink:

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