Bonjour tout le monde.
Il y a quelque temps, j'ai fait un programme en C++ utilisant wxWidget sous linux. Je suis ensuite repassé sous windows.
Après une lutte acharné pour que VSExpress prenne en compte les librairies, je me suis rendu compte que j'avais un problème lorsque je fermer le programme soit avec la méthode traditionel (la croix) soit en utilisant la méthode Close();

Je me doute bien que cela vient d'une mauvaise utilisation ou déclaration, mais après 2 jours de recherches, je m'en remet à vous

Voici le code :
Mon mainframe.h :
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
#ifndef MAINFRAME_H_INCLUDED
#define MAINFRAME_H_INCLUDED
 
#include "wx/wx.h"
 
enum {
	ID_BTN_PARCOURIR,
	ID_BTN_CHARGER,
	ID_BTN_CHANGER,
	ID_MENU_QUIT,
	ID_MENU_PARCOURIR,
	ID_MENU_ABOUT
};
 
class MainFrame : public wxFrame {
    public:
        MainFrame();
        ~MainFrame();
    private:
        wxButton *btnParcourir, *btnCharger, *btnChanger;
        wxTextCtrl *cheminParcourir, *NomActuelTexte, *NouveauNomReponse;
 
        wxMenu *menuFichier, *menuAide;
        wxMenuBar *menuBarre;
        wxStaticText *NomActuelReponse;
 
        void OnParcourir(wxCommandEvent &event);
        void OnButtonStartClicked(wxCommandEvent &event);
        void OnQuit(wxCommandEvent &event);
        void OnCharge(wxCommandEvent &event);
        void OnChanger(wxCommandEvent &event);
        void OnAbout(wxCommandEvent &event);
 
        DECLARE_EVENT_TABLE();
};
 
#endif // MAINFRAME_H_INCLUDED
Mon mainframe.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
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
#include "mainframe.h"
#include "difftoolkit.h"
 
DiffToolKit DiffToolKit;
 
BEGIN_EVENT_TABLE(MainFrame,wxFrame)
    EVT_BUTTON(ID_BTN_PARCOURIR, MainFrame::OnParcourir)
    EVT_BUTTON(ID_BTN_CHARGER, MainFrame::OnCharge)
    EVT_BUTTON(ID_BTN_CHANGER, MainFrame::OnChanger)
    EVT_MENU(ID_MENU_PARCOURIR, MainFrame::OnParcourir)
    EVT_MENU(ID_MENU_QUIT, MainFrame::OnQuit)
    EVT_MENU(ID_MENU_ABOUT, MainFrame::OnAbout)
END_EVENT_TABLE()
 
MainFrame::MainFrame() : wxFrame(NULL,wxID_ANY,_T("DiffToolKit")) {
 
	SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE));
 
    /* Déclaration des trois cadres : le principal et le Cardre Haut et Bas */
    wxFlexGridSizer *Principal = new wxFlexGridSizer(0, 1, 0, 0);
    wxStaticBoxSizer *CadreHaut = new wxStaticBoxSizer(wxVERTICAL, this, _T("Sakexe :"));
    wxStaticBoxSizer *CadreBas = new wxStaticBoxSizer(wxVERTICAL, this, _T("Modifier le titre du sakexe :"));
 
    /* La partie pour le menu */
    menuFichier = new wxMenu;
    menuBarre = new wxMenuBar();
 
    menuFichier->Append(ID_MENU_PARCOURIR, _T("Ouvrir          "));
    menuFichier->AppendSeparator();
    menuFichier->Append(ID_MENU_QUIT, _T("Quitter         "));
    menuBarre->Append(menuFichier, _T("&Fichier"));
 
    menuFichier = new wxMenu;
    menuFichier->Append(ID_MENU_ABOUT, _T("A propos     "));
    menuBarre->Append(menuFichier, _T("&Aide"));
 
    SetMenuBar(menuBarre);
 
    /* Le cadre du haut */
    wxBoxSizer *CadreParcourir = new wxBoxSizer(wxHORIZONTAL);
    wxStaticText *TexteParcourir = new wxStaticText(this, wxID_ANY, _T("Chemin vers le Sakexe :"));
    cheminParcourir = new wxTextCtrl(this, wxID_ANY, _T(""), wxDefaultPosition, wxSize(300, -1));
    btnParcourir = new wxButton(this, ID_BTN_PARCOURIR, _T("Parcourir"), wxDefaultPosition, wxSize(100,-1));
    btnCharger = new wxButton(this, ID_BTN_CHARGER, _T("Charger"), wxDefaultPosition, wxSize(100, -1));
 
 
    cheminParcourir->SetLabel(_T("Gloubi"));
 
    CadreParcourir->Add(TexteParcourir, 0, wxEXPAND|wxTOP|wxRIGHT, 11);
    CadreParcourir->Add(cheminParcourir, 1, wxTOP, 8);
    CadreParcourir->Add(btnParcourir, 0, wxLEFT|wxTOP, 5);
 
    CadreHaut->Add(CadreParcourir, 0, wxEXPAND|wxLEFT, 5);
    CadreHaut->Add(btnCharger, 0, wxCENTRE, 0);
 
    Principal->Add(CadreHaut, 1, wxEXPAND|wxALL, 5);
 
    /* Le cadre du bas */
    wxTextValidator validator(wxFILTER_INCLUDE_CHAR_LIST);
    wxArrayString allowed_chars;
    for (int i = 32; i < 126; i++) allowed_chars.Add(wxString::Format(_T("%c"), i));
    validator.SetIncludes(allowed_chars);
 
    wxBoxSizer *NomActuel = new wxBoxSizer(wxHORIZONTAL);
    wxStaticText *NomActuelTexte = new wxStaticText(this, wxID_ANY, _T("L'ancien nom du sakexe :"));
    NomActuelReponse = new wxStaticText(this, wxID_ANY, _T("Veuillez sélectionner un sakexe à charger."));
 
    wxBoxSizer *NouveauNom = new wxBoxSizer(wxHORIZONTAL);
    wxStaticText *NouveauNomTexte = new wxStaticText(this, wxID_ANY, _T("Le nouveau nom du sakexe :"));
    NouveauNomReponse = new wxTextCtrl(this, wxID_ANY, _T(""), wxDefaultPosition, wxSize(300, -1), 0, validator);
    btnChanger = new wxButton(this, ID_BTN_CHANGER, _T("Changer"), wxDefaultPosition, wxSize(100, -1));
 
    NomActuel->Add(NomActuelTexte, 0, wxALL, 5);
    NomActuel->Add(NomActuelReponse, 0, wxALL, 5);
 
    NouveauNomReponse->SetMaxLength(SAKEXE_LENGHT);
 
    CadreBas->Add(NomActuel, 1, wxEXPAND);
    NouveauNom->Add(NouveauNomTexte, 0, wxTOP, 8);
    NouveauNom->Add(NouveauNomReponse, 0, wxLEFT|wxRIGHT|wxTOP, 5);
 
    CadreBas->Add(NouveauNom, 0, wxLEFT|wxBOTTOM, 5);
    btnChanger->Enable(FALSE);
    CadreBas->Add(btnChanger, 0, wxCENTRE|wxTOP, 2);
 
    Principal->Add(CadreBas, 1, wxALL|wxEXPAND, 5);
 
    SetSizer(Principal);
    Principal->SetSizeHints(this);
}
 
 
MainFrame::~MainFrame() { }
 
 
 
void MainFrame::OnParcourir(wxCommandEvent &event) {
 
    wxString nomfichier = wxFileSelector(_T("Ouvrir") , _T(""), _T(""), _T(""), _T("Sakexe (*.exe)|*.exe|All Files|*.*"), wxOPEN);
    cheminParcourir->SetValue(nomfichier);
}
 
void MainFrame::OnQuit(wxCommandEvent &event) {
 
    Close();
}
 
void MainFrame::OnCharge(wxCommandEvent &event) {
    std::string fileName;
    fileName = cheminParcourir->GetValue().mb_str();
 
    if (!DiffToolKit.setFileName(fileName)) {
        wxMessageBox(_T("Problème lors du chargement du fichier."));
        return;
    }
 
    if (!DiffToolKit.readPos()) {
        wxMessageBox(_T("Problème lors du chargement du fichier."));
        return;
    }
 
    if (!DiffToolKit.readOldName()) {
        wxMessageBox(_T("Problème lors du chargement du fichier."));
        return;
    }
 
    btnChanger->Enable(TRUE);
 
    std::string OName = DiffToolKit.getSakexeOldName();
    wxString OldName = wxString(OName.c_str(), wxConvUTF8);
    NomActuelReponse->SetLabel(OldName);
}
 
void MainFrame::OnChanger(wxCommandEvent &event) {
 
    if (NouveauNomReponse->GetValue().size() == 0) {
        wxMessageBox(_T("Veuillez rentrer un nouveau nom pour le sakexe." + NouveauNomReponse->GetValue()));
        return;
    }
 
    std::string newName;
    newName.erase();
    newName = NouveauNomReponse->GetValue().mb_str();
    DiffToolKit.setNewName(newName);
 
 
    if (!DiffToolKit.writeNewName()) {
        wxMessageBox(_T("Problème lors de l'écriture dans le sakexe."));
        return;
    }
 
    if (!DiffToolKit.readOldName()) {
        wxMessageBox(_T("Problème lors du chargement du fichier."));
        return;
    }
 
 
    std::string OName = DiffToolKit.getSakexeOldName();
    wxString OldName = wxString(OName.c_str(), wxConvUTF8);
    NomActuelReponse->SetLabel(OldName);
 
}
 
void MainFrame::OnAbout(wxCommandEvent &event) {
 
    wxMessageBox(_T("DiffToolKit.\nCopie interdite.\n\nAuteur : Atikae\nVersion: 0.1Beta\n\nPour me contacter : atikae@gmail.com"));
}
Mon difftoolkit.h:
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
#ifndef DIFFTOOLKIT_H_INCLUDED
#define DIFFTOOLKIT_H_INCLUDED
 
 
#include <wx/wx.h>
#include <string>
 
#define SAKEXE_LENGHT 22
 
 
struct sakexe {
    unsigned int pos;
    unsigned int lenght;
    std::string oldname;
    std::string newname;
    std::string fileName;
};
 
class DiffToolKit : public wxApp {
    public:
        bool OnInit();
        DiffToolKit();
        ~DiffToolKit();
        bool setFileName(std::string fileName);
        bool checkNewName(std::string name);
        bool setNewName(std::string newName);
        bool readPos();
        bool readOldName();
        bool writeNewName();
        int getSakexeLenght() const;
        int getSakexePos() const;
        std::string getSakexeOldName() const;
 
    private:
        struct sakexe sakexe;
};
 
DECLARE_APP(DiffToolKit);
 
#endif // DIFFTOOLKIT_H_INCLUDED
Mon difftoolkit.cpp (je vous enlèves les méthodes qui n'ont rien à voir avec wxWidget) :
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
#include "difftoolkit.h"
#include "mainframe.h"
 
#include <iostream>
#include <fstream>
#include <string>
 
 
IMPLEMENT_APP(DiffToolKit);
 
bool DiffToolKit::OnInit() {
 
    MainFrame *frame = new MainFrame();
    frame->Center();
    frame->Show();
    SetTopWindow(frame);
    return TRUE;
}
Voici ce que m'indique le debogueur de VS (la toute première erreur) :
http://img441.imageshack.us/img441/7424/vsrl5.jpg


Merci d'avance.
Amicalement,
Atikae.