Page 1 sur 2

[Résolu] Curseur personnalisé

Publié : dim. 22/juin/2014 20:41
par Micoute
Bonsoir à tous,

je souhaite savoir comment ajouter un curseur personnalisé pour mettre dans mes application, j'ai essayer de faire un petit code, mais apparemment, je ne suis pas sur la bonne voie, alors je crie un s.o.s. pour tout le monde sache que j'ai besoin d'aide !

S'il vous voulez-vous m'aider, une fois de plus ?

Je vous remercier par anticipation !

Code : Tout sélectionner

Procedure.b CurseurPerso(GadgetID.i)

  Static *curseur
    If *curseur = 0
      *curseur = LoadCursor_(0,  "C:\Programmation\Prg Perso\P\Projets\C\Curseur perso\fleche_16886.cur")
    EndIf
    SetCursor_(*curseur)    
  
EndProcedure

OpenWindow(0,0,0,800,600,"Essai curseur perso", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
CurseurPerso(0)
SetClassLong_(WindowID(0), #GCL_HCURSOR, CurseurPerso)

Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow  

Re: Curseur personnalisé

Publié : dim. 22/juin/2014 21:00
par Ar-S
Voilà un code de Froggerprogger réarangé par Ejan
Si ça peut t'inspirer.

Passe ta souris sur les boutons et l'editor pour voir les changements.

Code : Tout sélectionner

; Froggerprogger: http://www.purebasic.fr/english/viewtopic.php?p=39065#p39065

;
; Fenster mit Gadgets oeffnen / open window with gadgets
;
hWnd = OpenWindow(1, 10, 10, 400, 200, "", #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered)
Button1   = ButtonGadget(1, 210, 10, 100, 25, "WAIT")
Button2   = ButtonGadget(2, 210, 40, 100, 25, "HELP")
Button3   = ButtonGadget(3, 210, 70, 100, 25, "HAND")
ListView  = ListViewGadget(4, 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_(Button3, #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_HAND)
cur4 = 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)
DestroyCursor_(cur4)
End
;
; SUB zum wechseln des MouseCursors
;
changecursor:
GetCursorPos_(cursorpos.POINT)
MapWindowPoints_(0, hWnd, cursorpos, 1)
Select ChildWindowFromPoint_(hWnd, cursorpos\x | cursorpos\y << 32)
  Case Button1   : SetCursor_(cur1)  ; Cursor ueber Button 1
  Case Button2   : SetCursor_(cur2)  ; Cursor ueber Button 2
  Case Button3   : SetCursor_(cur3)  ; Cursor ueber Button 2
  Case ListView  : SetCursor_(cur4)  ; Cursor ueber ListView
  Case hWnd      : SetCursor_(cur0)  ; Default, fuer das Hauptfenster
EndSelect
Return

Re: Curseur personnalisé

Publié : mar. 24/juin/2014 19:46
par nico
@Micoute,

CurseurPerso ne fait référence à aucune variable dans ton exemple!

Re: Curseur personnalisé

Publié : mer. 25/juin/2014 8:11
par Micoute
Bonjour nico, je suis complètement largué sur ce problème et je crois bien que je vais lâcher le morceau, ça me stresse trop, pourtant, je sens que c'est fort simple et peut-être que c'est tellement facile, que je ne vois pas la solution, malgré l'exemple posté par Ar-s.

En attendant que ça aille mieux, car je ne vais quand même rester dans cet état très longtemps, je vous remercie toi et Ar-s de tout cœur.

Re: Curseur personnalisé

Publié : mer. 25/juin/2014 9:09
par TazNormand
Bonjour Micoute,

utilises LoadCursorFromFile_(fichier_curseur)

Voici un exemple, il y a un petit problème de clipping du curseur sur le bouton, je cherche d'où ça vient

Edit : remplaces les chemin et fichiers curseur (.cur) par les tiens

Code : Tout sélectionner

Global cursNorm,cursWait

Procedure curperso(hWnd,bouton)  
  GetCursorPos_(cursorpos.POINT)  
  MapWindowPoints_(0, hWnd, cursorpos, 1)    
  Select ChildWindowFromPoint_(hWnd, cursorpos\x | cursorpos\y << 32) 
    Case bouton      
      SetCursor_(cursWait)
    Case hWnd      
      SetCursor_(cursNorm)
  EndSelect  
EndProcedure



hWnd=OpenWindow(0,0,0,800,600,"Essai curseur perso", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
bouton  = ButtonGadget(1, 10, 10, 50, 50, "Bouton") 

SetClassLong_(WindowID(0), #GCL_HCURSOR, 0)
cursNorm = LoadCursorFromFile_("C:\Program Files\_Custom Pc\AmiPointer.cur")
;cursWait = LoadCursorFromFile_("C:\Program Files\_Custom Pc\AmiWait.cur")
cursWait = LoadCursorFromFile_("C:\Program Files\_Custom Pc\AmiStartBoing.ani")

Repeat
  evt=WindowEvent()    
  cur=CurPerso(hWnd,bouton)
  Delay(1)
Until evt = #PB_Event_CloseWindow Or (evt=#PB_Event_Gadget And EventGadget()=1)

DestroyCursor_(cursNorm)
DestroyCursor_(cursWait)


Re: Curseur personnalisé

Publié : mer. 25/juin/2014 9:48
par Ar-S
Micoute,
Je viens d'adapter le code, je pense que tu pigeras mieux cette version. :wink:
(Je n'ai pas touché à ton 1er code car je n'utilise pas les pointeurs, je reste frileux devant le accès mémoires.)

Code : Tout sélectionner

; Changement de curseur Par Ar-S - PB 5.22 LTS
; basé sur un code de Froggerprogger


; Initialisation des données
Declare ChangeCursor(IdGadgetFenetre, IDcurseur=0)


Global.b clic
Clic = 0

; On charge les curseurs
C_Fleche	= 	LoadCursor_(0, #IDC_ARROW)
C_Main		=	LoadCursor_(0, #IDC_HAND)
C_Aide 		= 	LoadCursor_(0, #IDC_HELP)
C_Carret		=	LoadCursor_(0, #IDC_IBEAM)
C_Croix		=	LoadCursor_(0, #IDC_CROSS)
C_Non		=	LoadCursor_(0, #IDC_NO)


; Ouverture de la fenêtre
hWnd = OpenWindow(1, 10, 10, 400, 200, "", #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered)
Bouton1   = ButtonGadget(1, 210, 10, 100, 25, "Clic moi dessus")


; boucle
Repeat
  Event = WaitWindowEvent(2)
  Eg = EventGadget()
  
  Select Event
  		Case #PB_Event_Gadget
		  	Select Eg
		  		Case 1 ; (le bouton)
		  					Clic + 1
		  					If Clic = 6
		  						Clic = 0	
		  					EndIf
		  					
		  					Select Clic
		  						
		  						Case 1
		  							ChangeCursor(hWnd, C_Croix)
		  							ChangeCursor(Bouton1, C_Croix)
		  							Debug "Croix sur bouton et fenêtre"
		  						Case 2
		  							ChangeCursor(hWnd, C_Aide)
		  							Debug "Aide sur fenêtre"
		  						Case 3
		  							ChangeCursor(hWnd, C_Non)
		  							Debug "Fleche Interdit sur fenêtre"
		  						Case 4
		  							ChangeCursor(Bouton1, C_Carret)
		  							Debug "Carret sur bouton"
		  						Case 5	
		  							ChangeCursor(Bouton1, C_Croix)	
		  						Default
		  							ChangeCursor(Bouton1, C_Fleche)			
		  							ChangeCursor(hWnd, C_Fleche)	
		  							Debug "Fleche sur bouton et fenêtre"
		  						
		  					EndSelect
		  					
		  					
		  					
		  			EndSelect		
  		
  
  EndSelect
Until Event = #PB_Event_CloseWindow

; On décharge les curseurs
DestroyCursor_(C_Fleche)
DestroyCursor_(C_Main)
DestroyCursor_(C_Aide)
DestroyCursor_(C_Carret)
DestroyCursor_(C_Croix)
DestroyCursor_(C_Non)
End


; Procedure de changement du curseur
Procedure ChangeCursor(IdGadgetFenetre, IDcurseur=0)
; by Ar-S
	If SetClassLong_(IdGadgetFenetre, #GCL_HCURSOR, IDcurseur)
		ProcedureReturn 1
	Else
		ProcedureReturn 0
	EndIf		
EndProcedure


EnJoY :mrgreen:

Re: Curseur personnalisé

Publié : mer. 25/juin/2014 10:05
par falsam
@Ar-S : Micoute souhaite charger un curseur personnalisé et non pas un curseur system.
Micoute a écrit :comment ajouter un curseur personnalisé pour mettre dans mes application
Une solution qui fonctionne sous windows 7.

Code : Tout sélectionner

Enumeration Window
  #MainForm
EndEnumeration

Enumeration Gadget
  #CursorLoad 
EndEnumeration

OpenWindow(#MainForm, 0, 0, 800, 600, "Charger un curseur", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
ButtonGadget(#CursorLoad, 690, 20, 100, 22, "Choisir un curseur")

Repeat 
  Event = WaitWindowEvent() 
  GEvent = EventGadget() 
  
  Select Event
    Case #PB_Event_Gadget 
      Select GEvent
          
        Case #CursorLoad                      
          ;Chargemenrt d'un curseur personalisé   
          NewCursor = LoadCursorFromFile_(OpenFileRequester("Selectionner un curseur","c:\windows\cursors\","Cursors (*.cur, *.ani)|*.cur;*.ani",0))
          SetSystemCursor_(NewCursor, #OCR_NORMAL)          
      EndSelect
      
    Case #PB_Event_CloseWindow
      ;Rétablissement du curseur normal sous Windows 7
      NewCursor = LoadCursorFromFile_("c:\windows\cursors\aero_arrow.cur")
      SetSystemCursor_(NewCursor, #OCR_NORMAL)       
      End
   
  EndSelect
ForEver
Comme l'a souligné Taznormand (Message juste après le mien) ce code fonctionne aussi avec les curseurs animés.

J'ajoute un curseur animé si vous souhaitez faire un test.
:arrow: flecheetoile.ani

Re: Curseur personnalisé

Publié : mer. 25/juin/2014 10:15
par TazNormand
+1 avec Falsam : curseur personnalisé = LoadCursorFromFile_()

A noter que ça marche très bien avec les .ani

Re: Curseur personnalisé

Publié : mer. 25/juin/2014 10:51
par falsam
TazNormand a écrit :A noter que ça marche très bien avec les .ani
Merci de cette précision que je ne connaissais pas :)

Le code précédent est modifié en conséquence et j'ai ajouté un exemple de curseur animé à télécharger.

Re: Curseur personnalisé

Publié : mer. 25/juin/2014 11:01
par Ar-S
Parfait ! comme ça on a la totale :P

Re: Curseur personnalisé

Publié : mer. 25/juin/2014 11:18
par graph100
amha (A mon humble avis), ce topic devrait être monté dans la catégorie Information et tutoriaux. Il est complet et documente une api pratique.

Re: Curseur personnalisé

Publié : mer. 25/juin/2014 11:48
par TazNormand
Par contre je trouve pas pourquoi au survol du bouton dans mon code, le curseur "clippe" avec le curseur système.

Re: Curseur personnalisé

Publié : mer. 25/juin/2014 11:59
par falsam
TazNormand a écrit :le curseur "clippe" avec le curseur système.
Pas bien compris :mrgreen:

je suppose que tu voulais un changement de curseur au survol de la souris (Windows 7)

Code : Tout sélectionner

Global cursNorm,cursWait

Procedure curperso(hWnd,bouton)  
  GetCursorPos_(cursorpos.POINT)  
  MapWindowPoints_(0, hWnd, cursorpos, 1)    
  Select ChildWindowFromPoint_(hWnd, cursorpos\x | cursorpos\y << 32) 
    Case bouton      
      SetCursor_(cursWait)
    Case hWnd      
      SetCursor_(cursNorm)
  EndSelect  
EndProcedure

hWnd=OpenWindow(0,0,0,800,600,"Essai curseur perso", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
bouton  = ButtonGadget(1, 10, 10, 50, 50, "Bouton") 

;SetClassLong_(WindowID(0), #GCL_HCURSOR, 0)
cursNorm = LoadCursorFromFile_("c:\windows\cursors\aero_arrow.cur")
cursWait = LoadCursorFromFile_("c:\windows\cursors\aero_link.cur")

Repeat
  evt=WindowEvent()    
  cur=CurPerso(hWnd,bouton)
  Delay(1)
Until evt = #PB_Event_CloseWindow Or (evt=#PB_Event_Gadget And EventGadget()=1)

DestroyCursor_(cursNorm)
DestroyCursor_(cursWait)
J'ai commenté SetClassLong_(WindowID(0), #GCL_HCURSOR, 0). je ne suis pas certain que ce soit utile.

Merci pour cette astuce Taznormand :)

Re: Curseur personnalisé

Publié : mer. 25/juin/2014 12:04
par TazNormand
Oui tout à fait, mais avec un curseur animé, on aperçoit (très très rapidement) le curseur système quand on déplace au dessus du bouton, avec un effet de "clipping" donc.

Tien, en passant, pour les amateurs de curseurs "personnalisés" : Amiga et Wii

Re: Curseur personnalisé

Publié : mer. 25/juin/2014 12:15
par falsam
Merci pour ces packs de curseur. Je viens de faire un test en plaçant le chargement des curseurs avant l'ouverture de la fenêtre.

Petite question : Tu as besoin d'utiliser WindowEvent() plutôt que WaitWindowEvent() ?

Voila TON code modifié avec WaitWindowEvent() (Le code est dans le même dossier que les curseurs)

Code : Tout sélectionner

Global cursNorm,cursWait

Procedure curperso(hWnd,bouton)  
  GetCursorPos_(cursorpos.POINT)  
  MapWindowPoints_(0, hWnd, cursorpos, 1)    
  Select ChildWindowFromPoint_(hWnd, cursorpos\x | cursorpos\y << 32) 
    Case bouton      
      SetCursor_(cursWait)
    Case hWnd      
      SetCursor_(cursNorm)
  EndSelect  
EndProcedure

cursNorm = LoadCursorFromFile_("AmiBusy.cur")
cursWait = LoadCursorFromFile_("AmiStartBoing.ani")

hWnd=OpenWindow(0,0,0,800,600,"Essai curseur perso", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
bouton  = ButtonGadget(1, 10, 10, 50, 50, "Bouton") 

Repeat
  evt=WaitWindowEvent(10)    
  cur=CurPerso(hWnd,bouton)
Until evt = #PB_Event_CloseWindow Or (evt=#PB_Event_Gadget And EventGadget()=1)

DestroyCursor_(cursNorm)
DestroyCursor_(cursWait)