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.
(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

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.
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

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