[Résolu] Curseur personnalisé

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

[Résolu] Curseur personnalisé

Message 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  
Dernière modification par Micoute le mer. 25/juin/2014 13:34, modifié 1 fois.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
Ar-S
Messages : 9477
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Curseur personnalisé

Message 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
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: Curseur personnalisé

Message par nico »

@Micoute,

CurseurPerso ne fait référence à aucune variable dans ton exemple!
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Curseur personnalisé

Message 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.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
TazNormand
Messages : 1294
Inscription : ven. 27/oct./2006 12:19
Localisation : Calvados (14)

Re: Curseur personnalisé

Message 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)

Image
Image
Avatar de l’utilisateur
Ar-S
Messages : 9477
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Curseur personnalisé

Message 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:
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Curseur personnalisé

Message 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
Dernière modification par falsam le mer. 25/juin/2014 11:09, modifié 2 fois.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
TazNormand
Messages : 1294
Inscription : ven. 27/oct./2006 12:19
Localisation : Calvados (14)

Re: Curseur personnalisé

Message par TazNormand »

+1 avec Falsam : curseur personnalisé = LoadCursorFromFile_()

A noter que ça marche très bien avec les .ani
Image
Image
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Curseur personnalisé

Message 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.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Ar-S
Messages : 9477
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Curseur personnalisé

Message par Ar-S »

Parfait ! comme ça on a la totale :P
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: Curseur personnalisé

Message 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.
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Avatar de l’utilisateur
TazNormand
Messages : 1294
Inscription : ven. 27/oct./2006 12:19
Localisation : Calvados (14)

Re: Curseur personnalisé

Message par TazNormand »

Par contre je trouve pas pourquoi au survol du bouton dans mon code, le curseur "clippe" avec le curseur système.
Image
Image
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Curseur personnalisé

Message 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 :)
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
TazNormand
Messages : 1294
Inscription : ven. 27/oct./2006 12:19
Localisation : Calvados (14)

Re: Curseur personnalisé

Message 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
Image
Image
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Curseur personnalisé

Message 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)
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Répondre