Fonction membre en paramètre

Fonction membre en paramètre - C++ - Programmation

Marsh Posté le 24-09-2006 à 22:08:41    

Bonjour,
 
J'esseye de faire une GUI en openGL; voici comment je fait pour créer un bouton :
myButton = new button("okDefault.tga", "okClick.tga", "okFocus.tga", 0.0, 8.0, 10.8, 12.725);
Donc les 3 premiers paramètres sont les images du bouton et les 4 derniers se sont les coordonnées.
 
Mon problème : comment gérer les évènements ? J'aurais bien voulu un truc du genre :  
myButton = new button("okDefault.tga", "okClick.tga", "okFocus.tga", 0.0, 8.0, 10.8, 12.725, uneClasse::fctOnClick);
Et quand la classe button détecte un click de souris sur le bouton, elle exécute la fonction uneClasse::fctOnClick.
 
Mais est-il possible de passer une fonction membre en paramètre ? Si oui comment ?
 
Et si ce n'est pas possible : quel solution me reste-t-il ? J'ai vu que wxWidgets utilise les macro pour les évènements mais comment est-ce que ça fonctionne ?
 
Merci d'avance...


Message édité par casafa le 24-09-2006 à 22:09:25
Reply

Marsh Posté le 24-09-2006 à 22:08:41   

Reply

Marsh Posté le 24-09-2006 à 23:06:15    

y'a tout plein de façons de le faire,
avec les templates par exemple
 

Code :
  1. struct MessageHandler
  2. {
  3.        void execute() // [edit] mieux en virtual void /*ou autre type*/ operator()(/*ou autres paramètres*/)
  4.        {
  5.             std::cerr<<"Action !\n";
  6.        }
  7. };
  8. template<class Handle>
  9. struct Button
  10. {
  11.        Handle onClick;
  12.      
  13.        int x,y;
  14.      
  15.        Button(int _x=0, int _y=0, Handle _event=Handle()) : x(_x), y(_y), onClick(_event)
  16.        {
  17.        }
  18.      
  19.        void click()
  20.        {
  21.               onClick.execute();
  22.        }
  23. };
  24. int main()
  25. {
  26.     Button<MessageHandler> button;
  27.     button.click();
  28. }


Message édité par fra0 le 25-09-2006 à 00:43:19
Reply

Marsh Posté le 25-09-2006 à 02:15:19    

sinon tu refais la méthode classique avec queue de messages. (tu mets en queue un ID ou l'adresse du button).
 
sinon vu que c'est de l'OpenGl, et si c'est pour un jeu, t'as pas vraiment un contexte de serveur graphique style serveur X ou GDI, donc tu peux très bien tester bouton par bouton..
 
class Button
{
public:
   float x, y, width, height;
   string Text;
   bool Hit( float mx, float my);
};
 
vector<Button> GUI;
 
game_create_main_gui()
{
   GUI.resize(5);
   GUI[0].Text="New Game";
   GUI[0].x=0.4;
   GUI[0].width=0.6;
 
   ...  
}
 
int game_click_gui(float x, float y)
{
    for( int i = 0 ; i < GUI.size() ; ++i )
        if( GUI[i].Hit( x,y ) )
            return i;  
}
 
et tu polles le clicage de ton interface (quand tu as un évenement de click souris) avec game_click_gui() par exemple.


Message édité par bjone le 25-09-2006 à 02:16:05
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed