Bonjour,
Comme dans beaucoup de programme, suite à l'initialisation de la fenêtre principale, le programme ouvre une boîte de dialogue modale pour demander des information. Le problème est que cette boîte se bloque et plus aucune action n'est possible.
Voici le header de la boîte de dialogue SysView.h
Ensuite, le code de la fenêtre Sysview.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 #pragma once #include "usb_comp.h" // Boîte de dialogue CSysView class CSysView : public CDialog { DECLARE_DYNAMIC(CSysView) public: CSysView(CWnd* pParent = NULL); // constructeur standard virtual ~CSysView(); // Données de boîte de dialogue enum { IDD = IDD_CONFIG_SYSTEM_FORM }; protected: virtual void DoDataExchange(CDataExchange* pDX); // Prise en charge de DDX/DDV void enOK(); bool b_echap; DECLARE_MESSAGE_MAP() public: usb_comp *TelUSB; virtual BOOL OnInitDialog(); int OnBnClickedBtn(int ID, int RQ); virtual BOOL PreTranslateMessage(MSG* pMsg); int m_Id_Tel; int m_ALTF4; int m_ALTTAB; int m_mode_souris; int m_audio; int m_video; int m_explorateur; };
Je souligne desuite que le fichier usbrq.h ne contient que des #define. usb_comp contient les définitions des fonction appelé par la classe usb_com dont le nom est TelUSB. Cette classe a été testé par ailleurs et ne pose pas de 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
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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170 #include "stdafx.h" #include "TelUSB.h" #include "usbrq.h" #include "SysView.h" // Boîte de dialogue CSysView IMPLEMENT_DYNAMIC(CSysView, CDialog) CSysView::CSysView(CWnd* pParent /*=NULL*/) : CDialog(CSysView::IDD, pParent) , m_Id_Tel(0) , m_ALTF4(0) , m_ALTTAB(0) , m_mode_souris(0) , m_audio(0) , m_video(0) , m_explorateur(0) { } CSysView::~CSysView() { } void CSysView::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Text(pDX, IDC_ID_TEL_EDIT, m_Id_Tel); DDX_Text(pDX, IDC_ALTF4_EDIT, m_ALTF4); DDX_Text(pDX, IDC_ALTTAB_EDIT, m_ALTTAB); DDX_Text(pDX, IDC_MDSOURIS_EDIT, m_mode_souris); DDX_Text(pDX, IDC_AUDIO_EDIT, m_audio); DDX_Text(pDX, IDC_VIDEO_EDIT, m_video); DDX_Text(pDX, IDC_EXPLORATEUR_EDIT, m_explorateur); } BEGIN_MESSAGE_MAP(CSysView, CDialog) END_MESSAGE_MAP() // Gestionnaires de messages de CSysView BOOL CSysView::OnInitDialog() { char Donnee[2]={2,0}; CDialog::OnInitDialog(); if(!TelUSB->connecte()) CDialog::OnCancel(); //Mise en marche de config if(!TelUSB->send(USBRQ_ETAT,Donnee,2)) { AfxMessageBox(_T("Erreur,Dialogue mauvais!"),MB_OK|MB_ICONEXCLAMATION); CDialog::OnCancel(); return FALSE; } if(m_Id_Tel!=-1) { GetDlgItem(IDC_ALTF4_BTN)->EnableWindow(TRUE); GetDlgItem(IDC_ALTTAB_BTN)->EnableWindow(TRUE); GetDlgItem(IDC_MDSOURIS_BTN)->EnableWindow(TRUE); GetDlgItem(IDC_AUDIO_BTN)->EnableWindow(TRUE); GetDlgItem(IDC_VIDEO_BTN)->EnableWindow(TRUE); GetDlgItem(IDC_EXPLORATEUR_BTN)->EnableWindow(TRUE); } enOK(); b_echap=FALSE; return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION*: les pages de propriétés OCX devraient retourner FALSE } void CSysView::enOK() { if(m_video!=-1 && m_audio!=-1 && m_explorateur!=-1 && m_ALTTAB!=-1 && m_ALTF4!=-1 && m_mode_souris!=-1 && m_Id_Tel!=-1) GetDlgItem(IDC_OK)->EnableWindow(TRUE); else GetDlgItem(IDC_OK)->EnableWindow(FALSE); UpdateData(FALSE); } int CSysView::OnBnClickedBtn(int ID,int RQ) { char Donnee[2]={0,0}; GetDlgItem(ID)->SetWindowTextW(_T("Attente bouton, Echap pour annuler")); do { if(!TelUSB->connecte()) { CDialog::OnCancel(); return -1; } if(!TelUSB->receive(RQ,Donnee,2)) { AfxMessageBox(_T("Erreur,Dialogue mauvais!"),MB_OK|MB_ICONEXCLAMATION); CDialog::OnCancel(); return FALSE; } ::Sleep(50); if(b_echap==TRUE) { b_echap=FALSE; return -1; } } while(Donnee[1]!=0); return Donnee[0]; } BOOL CSysView::PreTranslateMessage(MSG* pMsg) { // TODO : ajoutez ici votre code spécialisé et/ou l'appel de la classe de base switch(pMsg->message) { case WM_KEYDOWN: if(pMsg->wParam == VK_ESCAPE) { b_echap=TRUE; return TRUE; } if(pMsg->wParam == VK_RETURN) return TRUE; break; case BN_CLICKED: switch(pMsg->wParam) { case IDC_ID_TEL_BTN: m_Id_Tel=OnBnClickedBtn(IDC_ID_TEL_EDIT,USBRQ_DEM_ID_TEL); if(m_Id_Tel!=-1) { GetDlgItem(IDC_ALTF4_BTN)->EnableWindow(TRUE); GetDlgItem(IDC_ALTTAB_BTN)->EnableWindow(TRUE); GetDlgItem(IDC_MDSOURIS_BTN)->EnableWindow(TRUE); GetDlgItem(IDC_AUDIO_BTN)->EnableWindow(TRUE); GetDlgItem(IDC_VIDEO_BTN)->EnableWindow(TRUE); GetDlgItem(IDC_EXPLORATEUR_BTN)->EnableWindow(TRUE); } enOK(); return TRUE; case IDC_ALTF4_BTN: m_ALTF4=OnBnClickedBtn(IDC_ALTF4_EDIT,USBRQ_DEM_BTN); enOK(); return TRUE; case IDC_ALTTAB_BTN: m_ALTTAB=OnBnClickedBtn(IDC_ALTTAB_EDIT,USBRQ_DEM_BTN); enOK(); return TRUE; case IDC_MDSOURIS_BTN: m_mode_souris=OnBnClickedBtn(IDC_MDSOURIS_EDIT,USBRQ_DEM_BTN); enOK(); return TRUE; case IDC_AUDIO_BTN: m_audio=OnBnClickedBtn(IDC_AUDIO_EDIT,USBRQ_DEM_BTN); enOK(); return TRUE; case IDC_VIDEO_BTN: m_video=OnBnClickedBtn(IDC_VIDEO_EDIT,USBRQ_DEM_BTN); enOK(); return TRUE; case IDC_EXPLORATEUR_BTN: m_explorateur=OnBnClickedBtn(IDC_EXPLORATEUR_EDIT,USBRQ_DEM_BTN); enOK(); return TRUE; } } return CDialog::PreTranslateMessage(pMsg); }
Voici le code d'appel de la fenêtre modale :
Pour décrire mon code :
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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150 long CTelUSBView::OnInitAlgo(WPARAM wparam,LPARAM lparam) { _TCHAR Chemin[MAX_PATH]; CString cz_Chemin; int i=0; char Donnee[2]={0,0}; //Algorithme d'init du logiciel (chargement fichier ou création) //Initialisation des variable de sauvegarde Btn_Souris.RemoveAll(); Btn_Syst.RemoveAll(); Btn_Video.RemoveAll(); Btn_Son.RemoveAll(); Btn_Expl.RemoveAll(); Id_Tel=-1; //Ouverture du fichier et détection de la télécommande. CSIDL_APPDATA if(!SUCCEEDED(SHGetFolderPath(NULL,CSIDL_APPDATA,NULL,SHGFP_TYPE_CURRENT,Chemin))) { AfxMessageBox(_T("Erreur, Pas de chemin valide pour l'application, fermeture de l'application!"),MB_OK|MB_ICONEXCLAMATION); AfxGetMainWnd()->PostMessage(WM_SYSCOMMAND,SC_CLOSE,0); } cz_Chemin.Format(_T("%s\\TelUsb"),Chemin); CreateDirectory(cz_Chemin,NULL); //Le répertoire existe et le fichier existe if(GetLastError()==ERROR_ALREADY_EXISTS && F_Btn.Open(cz_Chemin+_T("\\BtnSave.tel"),CFile::modeReadWrite,NULL)) { if(F_Btn.GetLength()!=0) { CArchive ar( &F_Btn, CArchive::load); GetDocument()->Serialize(ar); ar.Close(); } } //Création du fichier else if(!F_Btn.Open(cz_Chemin+_T("\\BtnSave.tel"),CFile::modeCreate|CFile::modeReadWrite,NULL)) { AfxMessageBox(_T("Erreur,Impossible de créer ou d'ouvrir le fichier de sauvegarde!"),MB_OK|MB_ICONEXCLAMATION); AfxGetMainWnd()->PostMessage(WM_SYSCOMMAND,SC_CLOSE,0); } F_Btn.Close(); //Test pour l'existence des paramètres de boutons système if(Id_Tel!=-1 && Btn_Syst.GetCount()==6) { for(i=0;i<6;i++) { if(Btn_Syst[i].Id_Btn<0) break; } } //Si i<6 -> sinon, autoriser la marche et la config if(i<6 || Id_Tel==-1) { //init OnIdTel(); return 0L; } CMenu* pTopLevelMenu =AfxGetMainWnd()->GetMenu(); CMenu *pMenu; pMenu = pTopLevelMenu->GetSubMenu(1); pMenu->EnableMenuItem(0,MF_BYPOSITION|MF_ENABLED); Donnee[0]=Id_Tel; if(!TelUsb->send(USBRQ_DON_TEL,Donnee,2)) { AfxMessageBox(_T("Erreur,Dialogue mauvais!"),MB_OK|MB_ICONEXCLAMATION); return 0L; } Donnee[0]=0; if(!TelUsb->send(USBRQ_ETAT,Donnee,2)) { AfxMessageBox(_T("Erreur,Dialogue mauvais!"),MB_OK|MB_ICONEXCLAMATION); return 0L; } //Autorise les fonctions; GetDlgItem(IDC_MARCHE_BTN)->EnableWindow(TRUE); pMenu = pTopLevelMenu->GetSubMenu(0); pMenu->EnableMenuItem(0,MF_BYPOSITION|MF_ENABLED); pMenu = pTopLevelMenu->GetSubMenu(1); pMenu->EnableMenuItem(0,MF_BYPOSITION|MF_ENABLED); pMenu->EnableMenuItem(1,MF_BYPOSITION|MF_ENABLED); return 0L; } void CTelUSBView::OnIdTel() { char Donnee[2]={0,0}; CMenu* pTopLevelMenu =AfxGetMainWnd()->GetMenu(); CMenu *pMenu; CSysView Cfgwnd; //Affectation des différentes variables Cfgwnd.m_Id_Tel=(int)Id_Tel; if(Btn_Syst.GetSize()!=6) { Btn_Syst.RemoveAll(); for(int i=0;i<6;i++) Btn_Syst.Add(CBouton(-1,0,0)); } Cfgwnd.m_ALTF4=(int)Btn_Syst[0].Id_Btn; Cfgwnd.m_ALTTAB=(int)Btn_Syst[1].Id_Btn; Cfgwnd.m_mode_souris=(int)Btn_Syst[2].Id_Btn; Cfgwnd.m_audio=(int)Btn_Syst[3].Id_Btn; Cfgwnd.m_video=(int)Btn_Syst[4].Id_Btn; Cfgwnd.m_explorateur=(int)Btn_Syst[5].Id_Btn; Cfgwnd.TelUSB=TelUsb; //Appel de la fenêtre. if(Cfgwnd.DoModal()==IDOK) { //copie des information Id_Tel=Cfgwnd.m_Id_Tel; Btn_Syst[0].Id_Btn=Cfgwnd.m_ALTF4; Btn_Syst[1].Id_Btn=Cfgwnd.m_ALTTAB; Btn_Syst[2].Id_Btn=Cfgwnd.m_mode_souris; Btn_Syst[3].Id_Btn=Cfgwnd.m_audio; Btn_Syst[4].Id_Btn=Cfgwnd.m_video; Btn_Syst[5].Id_Btn=Cfgwnd.m_explorateur; GetDlgItem(IDC_MARCHE_BTN)->EnableWindow(TRUE); pMenu = pTopLevelMenu->GetSubMenu(0); pMenu->EnableMenuItem(0,MF_BYPOSITION|MF_ENABLED); pMenu = pTopLevelMenu->GetSubMenu(1); pMenu->EnableMenuItem(1,MF_BYPOSITION|MF_ENABLED); } else { GetDlgItem(IDC_MARCHE_BTN)->EnableWindow(FALSE); GetDlgItem(IDC_ARRET_BTN)->EnableWindow(FALSE); pMenu = pTopLevelMenu->GetSubMenu(0); pMenu->EnableMenuItem(0,MF_BYPOSITION|MF_DISABLED | MF_GRAYED ); pMenu = pTopLevelMenu->GetSubMenu(1); pMenu->EnableMenuItem(1,MF_BYPOSITION|MF_DISABLED | MF_GRAYED ); if(!TelUsb->connecte()) { pMenu = pTopLevelMenu->GetSubMenu(1); pMenu->EnableMenuItem(0,MF_BYPOSITION|MF_DISABLED | MF_GRAYED); Tempo(); return; } } Donnee[0]=0; TelUsb->send(USBRQ_ETAT,Donnee,2); pMenu = pTopLevelMenu->GetSubMenu(1); pMenu->EnableMenuItem(0,MF_BYPOSITION|MF_ENABLED); GetDocument()->SetModifiedFlag(TRUE); }
_A l'initialisation du programme, je teste la connexion de mon périphérique usb. Dès qu'il est connecté, j'envoie le message onInitAlgo qui lance la fonction CTelUSBView::OnInitAlgo.
_Dans cette fonction, si les conditions sont réunies, je lance la fonction IdTel() qui m'affichera la fenêtre de dialogue.
Il convient de noter que cette fonction peut aussi être appelé par le clic sur un menu qui est désactivé au démarrage.
J'ai déjà fait quelques tests. Le programme se poursuit sans encombre jusqu'à la fin de la fonction OnInitDialog(). Puis, seulement le bouton du haut de la fenêtre (image fournies en pièce jointe) s'affiche et plus aucune action n'est possible.
Avez-vous une idée du problème?
Merci d'avance.
Partager