Cursor Problem

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

Cursor Problem

Beitrag 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!
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Beitrag von RSBasic »

@gnasen
Dieses Problem habe ich ebenfalls.
http://www.purebasic.fr/german/viewtopic.php?p=169915
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

Beitrag 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...
Benutzeravatar
Thomas
Beiträge: 893
Registriert: 06.07.2006 19:24
Wohnort: Regensburg
Kontaktdaten:

Beitrag 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 
v6.00
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Beitrag von RSBasic »

@Thomas
>sucht ihr sowas?
Ich nicht.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

Beitrag 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
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

Beitrag 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?
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

Beitrag 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
Antworten