Page 1 sur 2

Changer le curseur de la souris au survol d'un Gadget

Publié : sam. 21/mai/2011 23:32
par Le Soldat Inconnu
Un petit code fait à partir d'un code de NetMaestro disponible ici :
http://www.purebasic.fr/english/viewtop ... 91#p329298

Ce code permettait de masquer le curseur au dessus d'un gadget.
J'ai repris l'idée pour, non plus masquer, mais modifier le curseur quand on survole un gadget

Code : Tout sélectionner

; Auteur : Le Soldat Inconnu
; Version de PB : 4.50
;
; Explication du programme :
; Changer le curseur de la souris au dessus d'un gadget

Procedure SetGadgetCursor_SubClassProc(hwnd, msg, wparam, lparam) 
	Protected oldproc, Cursor
	oldproc = GetProp_(hwnd, "oldproc") 
	
	Select msg 
		Case #WM_NCDESTROY 
			RemoveProp_(hwnd, "oldproc") 
			RemoveProp_(hwnd, "cursor") 
			
		Case #WM_SETCURSOR
			Cursor = GetProp_(hwnd, "cursor") 
			SetCursor_(Cursor)
			ProcedureReturn 0 
			
	EndSelect    
	ProcedureReturn CallWindowProc_(oldproc, hwnd, msg, wparam, lparam) 
EndProcedure 
Procedure SetGadgetCursor(Gadget, Cursor) ; Change le curseur de la souris au dessus d'un Gadget
	If GetProp_(GadgetID(Gadget), "cursor")
		RemoveProp_(GadgetID(Gadget), "cursor") 
	EndIf
	SetProp_(GadgetID(Gadget), "cursor", Cursor)
	If GetProp_(GadgetID(Gadget), "oldproc") = 0
		SetProp_(GadgetID(Gadget), "oldproc", SetWindowLongPtr_(GadgetID(Gadget), #GWL_WNDPROC, @SetGadgetCursor_SubClassProc())) 
	EndIf
	SendMessage_(GadgetID(Gadget), #WM_SETCURSOR , 0, 0)
EndProcedure




Enumeration
	#Bouton
EndEnumeration
; Valeurs possibles pour le curseur :
#IDC_ARROW = 32512 ; la flèche (le curseur normal)
#IDC_IBEAM = 32513 ; curseur sélection de texte
#IDC_UPARROW = 32516 ; flèche qui pointe vers le haut
#IDC_APPSTARTING = 32650 ; curseur attente (flèche + sablier)
#IDC_WAIT = 32514 ; curseur occupé (sablier)
#IDC_CROSS = 32515 ; curseur précision de la sélection (croix)
#IDC_SIZENWSE = 32642 ; curseur de dimensionnment, pointe le NordOuest et le SudEst
#IDC_SIZENESW = 32643 ; curseur de dimensionnment, pointe le NE et le SO
#IDC_SIZEWE = 32644 ; curseur de dimensionnment, pointe le E et le O
#IDC_SIZENS = 32645 ; curseur de dimensionnment, pointe le N et le S
#IDC_SIZEALL = 32646 ; curseur de déplacement, pointe le N, S, E et O
#IDC_HELP = 32651 ; curseur aide
#IDC_HAND = 32649 ; curseur main
#IDC_NO = 32648 ; curseur "interdit" (panneau d'interdiction)

; Création de la fenêtre et de la GadgetList
If OpenWindow(0, 0, 0, 300, 300, "SetGadgetCursor", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget) = 0
  End
EndIf

ButtonGadget(#Bouton, 20, 20, 128, 128, "Nouveau curseur")

Curseur = LoadCursor_(0, #IDC_HAND) ; Charge le curseur
SetGadgetCursor(#Bouton, Curseur) ; Applique le curseur au gadget

Repeat
  Event = WaitWindowEvent()
  
  Select Event
		Case #PB_Event_Menu
      Select EventMenu() ; Menus
          
			EndSelect
      
		Case #PB_Event_Gadget
      Select EventGadget() ; Gadgets
				Case #Bouton
					DestroyCursor_(Curseur) ; Supprime l'ancien curseur
					Curseur = LoadCursor_(0, #IDC_WAIT) ; Charge le curseur
					SetGadgetCursor(#Bouton, Curseur) ; Applique le curseur au gadget
			EndSelect
	EndSelect
  
Until Event = #PB_Event_CloseWindow

DestroyCursor_(Curseur) ; Supprime le curseur

Re: Changer le curseur de la souris au survol d'un Gadget

Publié : dim. 22/mai/2011 12:19
par Ar-S
Merci ! bien cool ça.

Re: Changer le curseur de la souris au survol d'un Gadget

Publié : lun. 23/mai/2011 12:59
par dayvid
Ah oui :o

ça c'est drollement bien foutue :)
merci LSI, moi ça va me servir :P

Re: Changer le curseur de la souris au survol d'un Gadget

Publié : ven. 27/mai/2011 20:43
par Kwai chang caine
Parfait comme dab, merci 8)

Re: Changer le curseur de la souris au survol d'un Gadget

Publié : ven. 03/juin/2011 15:34
par Ar-S
Je n'ai pas réussi à le faire fonctionner avec un MenuItem() idem pour le CreateImageMenu()

Re: Changer le curseur de la souris au survol d'un Gadget

Publié : ven. 03/juin/2011 17:34
par Le Soldat Inconnu
je ne pense pas que ça puisse fonctionner avec des menus

Re: Changer le curseur de la souris au survol d'un Gadget

Publié : ven. 03/juin/2011 22:08
par Ar-S
Arrrf bien dommage ! :?

Re: Changer le curseur de la souris au survol d'un Gadget

Publié : sam. 04/juin/2011 17:13
par nico
Ar-S a écrit :Je n'ai pas réussi à le faire fonctionner avec un MenuItem() idem pour le CreateImageMenu()

t'as un exemple de code que j'y regarde d'un peu plus près.

Re: Changer le curseur de la souris au survol d'un Gadget

Publié : dim. 05/juin/2011 10:59
par Ar-S
oui je te montre ça des que je rentre chez moi (d'ici ce soir je pense)

Re: Changer le curseur de la souris au survol d'un Gadget

Publié : dim. 05/juin/2011 13:58
par venom
ça ne fonctionne pas chez moi, des que je clique sur le buttongadget, j'ai le petit cercle d'attente de windows qui se met et rien d'autre.






@++

Re: Changer le curseur de la souris au survol d'un Gadget

Publié : dim. 05/juin/2011 14:19
par nico
Oui, c'est ce que fait le code. :lol:

Re: Changer le curseur de la souris au survol d'un Gadget

Publié : dim. 05/juin/2011 17:41
par venom
:oops: autant pour moi, quel bouler :D
j'ai penser que le compilo avait planter :wink:





@++

Re: Changer le curseur de la souris au survol d'un Gadget

Publié : dim. 05/juin/2011 18:45
par nico
Il m'est déjà arriver un truc dans le genre aussi, c'est le problème quand on exécute sans réfléchir. :lol:

Re: Changer le curseur de la souris au survol d'un Gadget

Publié : mer. 22/mars/2017 16:50
par Shadow
Déterrage de sujet à la pelle...
Le code de LSI fonctionne encore pour changer le curseur de la souris au survol d'un Gadget.

Mais y à t-il plus simple, plus portable ?
C'est quand même très compliquer tous ça pour changer le curseur de la souris...
Au moins ça fonctionne très bien mais bon ya t-il d'autre moyen plus simple ?

Re: Changer le curseur de la souris au survol d'un Gadget

Publié : mer. 22/mars/2017 17:31
par falsam
Plutôt simple à comprendre ce code pourtant.

■ Une version plus simple dérivée du code précédent

Code : Tout sélectionner

hWnd = OpenWindow(0, 0, 0, 500, 400, "Change Pointer", #PB_Window_SystemMenu)
hBtn = ButtonGadget(0, 400, 20, 80, 22, "Button")

SetClassLong_(hWnd, #GCL_HCURSOR, LoadCursor_(0, #IDC_NO))
SetClassLong_(hBtn, #GCL_HCURSOR, LoadCursor_(0, #IDC_HAND))
 
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
A toi de te souvenir des constantes #idc_??????? sur ce lien
:arrow: https://msdn.microsoft.com/fr-fr/librar ... s.85).aspx