Bonjour
La forme du curseur dans la fenêtre SDL est par défaut une flèche.
Comment avoir:
- la forme "en main" au survol d'un bouton
- la forme "saisie de texte" dans une zone de saisie de texte
Cordialement
Bonjour
La forme du curseur dans la fenêtre SDL est par défaut une flèche.
Comment avoir:
- la forme "en main" au survol d'un bouton
- la forme "saisie de texte" dans une zone de saisie de texte
Cordialement
Hello,
Après quelques fouilles, il existe la fonction SDL_CreateSystemCursor(), qui permet de créer un curseur système (incroyable non ?) (voir ici pour les différents curseurs proposés). Il faut alors utiliser SDL_SetCursor() pour l'afficher. Rem: je n'ai jamais utilisé ces fonctions.
Quant au changement de l'aspect du curseur (normal --> main si tu passes sur un bouton p.ex.) c'est à ton programme de le gérer. Il n'existe pas en sdl un "truc" qui permette de dire "si mon curseur se trouve entre les coordonnées (x,y) et (x+length,y+height), alors il faut afficher le cureur de tel type".
salut l'algorithme peut être le suivant
-faire une liste de boutons qui mémorise ces boutons donc les dimensions rectangulaires dans une std::list par exemple.Créer une classe CButton.
-gérer le mouvement de déplacement et à chaque déplacement parcourir la liste de ces boutons pour voir si les coordonnées X,Y sont inscrites dans un de ces boutons.
Si tel est le cas alors agir en conséquence
-cacher le pointeur de la souris avec SDL_ShowCursor(SDL_DISABLE);
-créer des bitmaps qui vont représenter la forme du curseur ensuite il suffit d'afficher ces bitmaps aux coordonnées X,Y de la souris.
Essayer le code suivant c'est un début
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47 std::vector <CButton> buttons; class CButton { public: CButton(); ~CButton(); bool IsPressed(); private: SDL_Surface * m_surface, }; bool CButton::IsPressed(int X,Y) { SDL_Rect rect; SDL_GetClipRect(m_surface,&rect); if(X>rect->x && Y>rect->y && X<rect->x +rect->w && Y<rect->y +rect->y) return true; return false; } void MainLoop { int x, y; Uint32 buttons; SDL_PumpEvents(); // make sure we have the latest mouse state. SDL_GetMouseState(&x, &y); CheckIfButtonPressed(x,y); } void CheckIfButtonPressed(int X,Y) { for(int i=0;i<buttons.size();i++) { CButton btn=buttons[i]; if(btn.IsPressed(X,Y)==true) { } } }
Un petit exemple
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76 #include <sdl2/sdl.h> #define WND_SIZE_HORZ 600 #define WND_SIZE_VERT 600 #define WND_COLOR_R 50 #define WND_COLOR_G 100 #define WND_COLOR_B 150 #define WND_TITLE "Test curseur" #define RDR_DEFAULT_DRIVER -1 struct memo_button { SDL_Rect coo; Uint8 r,g,b,a; }; void DisplayWindow(SDL_Renderer *rdr,size_t nbuttons,struct memo_button mbut[nbuttons]) { SDL_SetRenderDrawColor(rdr,WND_COLOR_R,WND_COLOR_G,WND_COLOR_B,SDL_ALPHA_OPAQUE); SDL_RenderClear(rdr); for(size_t i=0;i<nbuttons;i++) { SDL_SetRenderDrawColor(rdr,mbut[i].r,mbut[i].g,mbut[i].b,mbut[i].a); SDL_RenderFillRect(rdr,&mbut[i].coo); } SDL_RenderPresent(rdr); } int main(int argc,char *argv[]) { (void)argc; (void)argv; SDL_Init(SDL_INIT_VIDEO); SDL_Window *wnd=SDL_CreateWindow(WND_TITLE,SDL_WINDOWPOS_CENTERED,SDL_WINDOWPOS_CENTERED,WND_SIZE_HORZ,WND_SIZE_VERT,SDL_WINDOW_SHOWN); SDL_Renderer *rdr=SDL_CreateRenderer(wnd,RDR_DEFAULT_DRIVER,SDL_RENDERER_ACCELERATED); struct memo_button mbut[]={ {{100,100,300,30},150,150,150,SDL_ALPHA_OPAQUE}, {{300,300,150,150},150,150,150,SDL_ALPHA_OPAQUE}, {{150,200,100,300},150,150,150,SDL_ALPHA_OPAQUE} }; size_t nbuttons=sizeof(mbut)/sizeof(mbut[0]); SDL_Cursor *cursor[2]; cursor[0]=SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_SIZEALL); cursor[1]=SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_HAND); SDL_SetCursor(cursor[0]); SDL_bool done=SDL_FALSE; while(!done) { DisplayWindow(rdr,nbuttons,mbut); SDL_Event event; SDL_WaitEvent(&event); switch(event.type) { case SDL_QUIT: done=SDL_TRUE; break; case SDL_MOUSEMOTION: SDL_SetCursor(cursor[0]); for(size_t i=0;i<nbuttons;i++) if(event.motion.x > mbut[i].coo.x && event.motion.x <= mbut[i].coo.x + mbut[i].coo.w && event.motion.y > mbut[i].coo.y && event.motion.y <= mbut[i].coo.y + mbut[i].coo.h) { SDL_SetCursor(cursor[1]); break; } break; default: break; } } SDL_DestroyRenderer(rdr); SDL_DestroyWindow(wnd); SDL_Quit(); return(0); }
Partager