Et le code que tu avais mis dans ta méthode MMenu::OnBnClickedOkCalScreen, tu l'as bien mis dans la nouvelle méthode MMenu::OnBnClickedButton2 ?
Et le code que tu avais mis dans ta méthode MMenu::OnBnClickedOkCalScreen, tu l'as bien mis dans la nouvelle méthode MMenu::OnBnClickedButton2 ?
Oui mais dailleurs regarde si je fais ca :
ben j'ai strictement rien :/
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 MMenu::OnBnClickedButton2() { // TODO: Add your control notification handler code here CEdit* edit=(CEdit*) GetDlgItem(IDC_EDIT1); edit->SetWindowText(_T("test")); /*CalScreen *pDlg; pDlg = new CalScreen(); pDlg->Create(CalScreen ::IDD,this); pDlg->ShowWindow(SW_SHOW); */ }
Donne-nous le code de tout ton .h et ton .cpp pour ta classe MMenu, parce que là, je ne comprends plus trop...
salut,
pourquoi tu n'ajoute pas dans la classe de la 1° fenetre une variable de type CalScreen. et dans MMenu::OnBnClickedOkCalScreen() tu fais : ma_variable_CalScreen.DoModal(); ?
Il y a bien une variable de type CalScreen dans la boîte de dialogue MMenu, même si c'est sous forme de pointeur. Que cette boîte de dialogue CalScreen soit ouverte par DoModal ou par un Create suivi d'un ShowWindow, cela ne changera rien au fait que la méthode événementielle qui gère le clic sur le bouton Ok, censée afficher cette deuxième boîte de dialogue, ne s'exécute pas...
Bon je poste mon code au cas ou quelqu'un aurait une idée pour m'aider.
Dans MMenu.h:Dans MMenu.cpp:
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 #pragma once // MMenu dialog class MMenu : public CDialog { DECLARE_DYNAMIC(MMenu) public: MMenu(CWnd* pParent = NULL); // standard constructor virtual ~MMenu(); // Dialog Data enum { IDD = ID_MAIN_MENU_DIALOG }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support DECLARE_MESSAGE_MAP() public: afx_msg void OnBnClickedButton2(); afx_msg void OnEnChangeEdit1(); afx_msg void OnBnClickedButton3(); afx_msg void OnBnClickedButton4(); };Dans CalScreen.cpp:
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94 // MMenu.cpp : implementation file // #include "stdafx.h" #include "Graphical_IHM.h" #include "MMenu.h" #include "CalScreen.h" // MMenu dialog IMPLEMENT_DYNAMIC(MMenu, CDialog) MMenu::MMenu(CWnd* pParent /*=NULL*/) : CDialog(MMenu::IDD, pParent) { } MMenu::~MMenu() { } void MMenu::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(MMenu, CDialog) ON_BN_CLICKED(IDC_BUTTON2, &MMenu::OnBnClickedButton2) ON_EN_CHANGE(IDC_EDIT1, &MMenu::OnEnChangeEdit1) ON_BN_CLICKED(IDC_BUTTON3, &MMenu::OnBnClickedButton3) ON_BN_CLICKED(IDC_BUTTON4, &MMenu::OnBnClickedButton4) END_MESSAGE_MAP() // MMenu message handlers void MMenu::OnBnClickedButton2() { // TODO: Add your control notification handler code here //CEdit* edit=(CEdit*) GetDlgItem(IDC_EDIT1); //edit->SetWindowText(_T("test")); CalScreen *pDlg; pDlg = new CalScreen(); pDlg->Create(CalScreen ::IDD,this); pDlg->ShowWindow(SW_SHOW); } void MMenu::OnEnChangeEdit1() { // TODO: If this is a RICHEDIT control, the control will not // send this notification unless you override the CDialog::OnInitDialog() // function and call CRichEditCtrl().SetEventMask() // with the ENM_CHANGE flag ORed into the mask. // TODO: Add your control notification handler code here } void MMenu::OnBnClickedButton3() { // TODO: Add your control notification handler code here CalScreen *pDlg; pDlg = new CalScreen(); pDlg->Create(CalScreen ::IDD,this); pDlg->ShowWindow(SW_SHOW); CEdit* edit=(CEdit*) GetDlgItem(IDC_EDIT1); edit->SetWindowText(_T("test")); } void MMenu::OnBnClickedButton4() { // TODO: Add your control notification handler code here CalScreen *pDlg; pDlg = new CalScreen(); pDlg->Create(CalScreen ::IDD,this); pDlg->ShowWindow(SW_SHOW); CEdit* edit=(CEdit*) GetDlgItem(IDC_EDIT1); edit->SetWindowText(_T("test")); }La je suis entrain de faire une nouveau projet pour tester juste ca.
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 // alScreen.cpp : implementation file // #include "stdafx.h" #include "Graphical_IHM.h" #include "CalScreen.h" // CalScreen dialog IMPLEMENT_DYNAMIC(CalScreen, CDialog) //IMPLEMENT_DYNCREATE(CalScreen, CDialog) CalScreen::CalScreen(CWnd* pParent /*=NULL*/) : CDialog(CalScreen::IDD, pParent) { } CalScreen::~CalScreen() { } void CalScreen::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CalScreen, CDialog) END_MESSAGE_MAP() void CalScreen :: PostNcDestroy( ) { CalScreen::PostNcDestroy(); delete this; }
D'ailleurs dans mon code test je ne comprends pas je fais la même chose mais j'ai une erreur à la compilation...
Quand je faispour récupérer le pointeur de la fenêtre j'ai l'es erreurs test_graphique_dialog1 undeclared identifier et syntax error sur test_graphique_dialog1.
Code : Sélectionner tout - Visualiser dans une fenêtre à part test_graphique_dialog1 *pDlg
Oula en effet c'est déja par ce que j'ai l'impression qu'il ne faut surtout pas mettre de _ dans les noms de classe
Sinon mes problèmes ne seraient pas du à ma configuration du projet?
Il s'agit de MFC application :
Dialog based
MFC standard
Use MFC in a static library
(décocher system menu)
salut,
d'après le code, il n'y aucune raison pour que le gestionnaire associé à un bouton ne soit pas exécuter ...
fais un test en mettant juste un
mais normalement ça devrait marcher, sauf si les ID ne correspondent pas aux objets de la boite de dialogue ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 AfxMessageBox(_T("coucou"));
ensuite, je pense que tu devrais plus t'orienter vers une boite de dialogue type modale et pas modeless (ce que tu es en train de faire)
c'est à dire, que si l'utilisateur clique plusieurs fois sur le bouton, tu auras autant de boite de dialogue ... a moins que tu vois les choses comme ça
ensuite un bug ici: (/!\ supprimer PostNcDestroy() si tu es en modale)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 CalScreen dlg; dlg.DoModal();
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 void CalScreen :: PostNcDestroy( ) { CDialog::PostNcDestroy(); // et pas CalScreen::PostNcDestroy(); delete this; }aucun soucis avec les _ dans les noms de classeOula en effet c'est déja par ce que j'ai l'impression qu'il ne faut surtout pas mettre de _ dans les noms de classe
aucun rapportSinon mes problèmes ne seraient pas du à ma configuration du projet?
essaye avec le AfxMessageBox() tout seul dans un gestionnaire "bouton cliqué" et regarde ce qui se passe.
ensuite fais ta boite de dialogue modale
@+
Je comprends pas. Je n'arrive même pas à avoir une message box coucou :/
J'ai pourtant recréé un projet et en cliquant sur un bouton OK j'obtient bien une messagebox coucou.
Est ce que ça peut venir du fait que MMenu soit une fille de Graphical_IHMDlg ? En fait dans MMenu.cpp il n'y a pas de InitDialog ou Onpaint ou OnQueryDragIcon ...
d'après le code que tu as posté, MMenu dérive de CDialog.
verifies bien que les ID définis dans l'éditeur de ressource correspondent à ceux que tu utilises dans le code ; sinon je vois pas ou est le soucis ...
Bon j'ai refait un beau projet tout beau et maintenant comme par magie ca marche ...
Alors avec tes conseils Stephdim j'ai mis ca comme code dans MMenu.cpp:
par contre lorsque je clique sur OK j'ai deux fenêtres de dialogue CalScreen identiques qui s'ouvrent en même temps (une seule est valide).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 void CMMenuDlg::OnBnClickedOk() { // TODO: Add your control notification handler code here CalScreen *pDlg; pDlg = new CalScreen(); pDlg->Create(CalScreen ::IDD,AfxGetMainWnd()); pDlg->ShowWindow(SW_SHOW); CalScreen dlg; dlg.DoModal(); }
Comment faire pour supprimer la première fenêtre MMenu aprés avoir chargée la nouvelle?
Merci beaucoup pour votre aide![]()
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 void CMMenuDlg::OnBnClickedOk() { CalScreen *pDlg; pDlg = new CalScreen(); pDlg->Create(CalScreen ::IDD,AfxGetMainWnd()); pDlg->ShowWindow(SW_SHOW); OnOK(); }
Euhhh ca me ferme toute les fenêtres même la nouvelle avec OnOK() du coup je fais simplement un ShowWindow(SH_HIDE);
La solution de PetitPapaNoel fonctionne, mais il est préférable de faire comme ça, au niveau de l'instanciation de MMenu:J'aimerai fermer la première fenêtre de dialogue MMenu quand CalScreen s'ouvre vous avez une idée de comment faire ?
puis dans le gestionnaire OnBnClicked()
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 MMenu dlg; switch (dlg.DoModal()) { case ID_BUTTON1: { // bouton 1 sélectionné CalScreen dlg2; dlg2.DoModal(); break; } case IDOK: { // bouton OK sélectionné break; } case IDCANCEL: { // bouton CANCEL sélectionné break; } default: { // erreur break; } }
@+
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 void MMenu::OnBnClicked() { EndDialog(ID_BUTTON1); // ID_BUTTON1 est la valeur de retour de DoModal() }
Tout à fait d'accord avec stephdim. C'est encore mieux comme ça.![]()
Partager