Bonjour,
Voici mon problème. J’ai créé une application SDI. Ma classe dérivée de CView affiche dans la zone client des objets générés avec OpenGL. Cette classe gère les évènements souris et clavier qui modifient les objets affichés.
J’affiche une boîte de dialogue non-modale qui doit communiquer avec ma vue dans les deux sens :
- les évènements souris et clavier modifient les contrôles de la boîte,
- les contrôles de la boîte modifient les objets affichés.
Je gère le premier sens en gardant dans ma vue le pointeur vers la boîte de dialogue :Mon problème est de récupérer dynamiquement la modification des contrôles de la boîte de dialogue pour modifier mon dessin. J’ai essayé :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 simBaseDlg = new CDialogSimBase(this); simBaseDlg->Create(IDD_DIALOG_SIM_BASE);
- de mettre dans ma classe « CDialogSimBase » un pointeur de fonction qui pointerait vers une fonction de ma classe Vue mais ça ne fonctionne pas. J’ai un conflit au moment de la compilation avec une histoire de __cdecl que je n’ai pas réussi à gérer,
- d’utiliser les messages privés. J’ai trouvé une explication très complète sur le site mais je n’ai pas réussi à l’appliquer dans mon cas :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 //Dans linclude de CDialogSimBase #define WM_TEST WM_USER+100
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 // Dans CDialogSimBase je veux que la fermeture de la boîte génère un message void CDialogSimBase::OnClose() { this->GetParent()->PostMessage(WM_TEST); CDialog::OnClose(); }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 //Dans linclude de ma vue // Generated message map functions protected: //{{AFX_MSG(CTest_oglView) afx_msg void OnDestroy(); afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); afx_msg void OnSize(UINT nType, int cx, int cy); afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags); afx_msg void OnViewSimBase(); //}}AFX_MSG long OnReceiveTest(WPARAM wparam, LPARAM lparam); DECLARE_MESSAGE_MAP()J’insiste sur cette manière car elle me paraît coller d’avantage avec le concept de programmation Windows. Mais peut-être que je me trompe. J’ai l’impression que je cherche compliqué alors que ça devrait être simple de récupérer des données issues d’une boîte de dialogue, non ? Merci d’avance pour le coup de main.
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 //Dans ma vue BEGIN_MESSAGE_MAP(CTest_oglView, CView) //{{AFX_MSG_MAP(CTest_oglView) ON_... messages divers //}}AFX_MSG_MAP // Standard printing commands ON_COMMAND messages divers ON_MESSAGE(WM_TEST, OnReceiveTest) END_MESSAGE_MAP() long CTest_oglView::OnReceiveTest(WPARAM wparam, LPARAM lparam) { MessageBox("Message de fermeture"); return 0L; }
EDIT PetitPapaNoël : Merci de penser aux balises CODE (bouton #) pour une meilleure lisibilité...
Partager