IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SDL Discussion :

forme du curseur de la souris


Sujet :

SDL

  1. #1
    Membre éclairé
    Homme Profil pro
    sans emploi
    Inscrit en
    Février 2014
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2014
    Messages : 365
    Par défaut forme du curseur de la souris
    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

  2. #2
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    753
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 753
    Par défaut
    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".

  3. #3
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 525
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 525
    Par défaut
    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)
    		{
    		}
     
    	}
    }

  4. #4
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    753
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 753
    Par défaut
    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);
    }

Discussions similaires

  1. Forcer la forme du curseur de souris
    Par Delphi-ne dans le forum Delphi
    Réponses: 4
    Dernier message: 07/12/2006, 13h21
  2. Curseur de la souris
    Par dynobremo dans le forum Composants VCL
    Réponses: 2
    Dernier message: 27/09/2004, 14h26
  3. reposition du curseur de la souris!
    Par bakonu dans le forum Windows
    Réponses: 2
    Dernier message: 09/06/2004, 18h17
  4. [TP][FAQ]Curseur de la souris
    Par nounetmasque dans le forum Turbo Pascal
    Réponses: 5
    Dernier message: 29/06/2003, 23h22
  5. Comment masquer le curseur de la souris ?
    Par benj63 dans le forum C++Builder
    Réponses: 4
    Dernier message: 26/06/2002, 18h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo