Bonjour a tous!
Je suis entrain de développer une librairie d'interface graphique opengl opensource (https://github.com/3dsman/snice_ui) qui avance bien mais je viens de tomber sur un problème que je n'avais pas anticipé dans mon architecture...
En gros quand je rée un bouton par exemple je peut créer une fonction de callback pour exécuter différentes actions (ici je me contente d'afficher le bouton enfoncé):
Dans la classe W_button j'ai (en version tres tres epurée
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 // fonction de callback du bouton void test(W_button* caller) { caller->SetPressed(true); std::cout<<"le bouton a été appuyé"; }; int main(int argc, char *argv[]) { // creation de la fenetre avec un viewport par default pSnice_UI = new Snice_UI(800,600,50); // recuperaion du viewport pViewport = pSnice_UI->GetViewport(); // creation d'un bouton pValid = new W_button(200,100, 120,20, "COOL"); // attache du bouton au viewport pViewport->AddChild(pValid); //signalisation de la fonction de callback pValid->OnClick(test); [...] }):
Tout ca marche tres bien dans le ca ou je crée tous les boutons a la main mais j'aimerais bieen maintenant avoir des dialog boxes (un widget de texte et deux boutons par 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 class W_button : public UI_widget { protected void (*onClick)(W_button* caller) = NULL; public: void W_button::OnClick(void (*function)(W_button* caller)) { onClick = function; } UI_base* W_button::OnLButtonUp(int x, int y) { if (Hittest(x,y)) { if(onClick) onClick(this); } return 0; } }
Le probleme c'est que mes fonctions de callback ne pointent pas sur des fonctions de classe.
Je ne peut donc pas par exemple avoir une classe D_toto qui aurait une fonction test pour recuperer le callback du bouton...
Je vois bien que j'ai fait une erreur d'architecture mais je ne vois pas de solution pour contourner le problème...
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 void D_toto::D_toto() { // creation d'un bouton pValid = new W_button(200,100, 120,20, "COOL"); // attache du bouton a ma dialogbox AddChild(pValid); //signalisation de la fonction de callback pValid->OnClick(this->test); } void D_toto::test(W_button* caller) { caller->SetPressed(true); std::cout<<"le bouton a été appuyé"; };
Comment ca se fait ce genre de trucs en général?
Merci d'avance de vos réponses.
Partager