Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

wxWidgets Discussion :

Newbie wxWidgets sous C++


Sujet :

wxWidgets

  1. #1
    Nouveau Candidat au Club
    Newbie wxWidgets sous C++
    Bonjour à tous,

    Pour mettre les choses au clair... je ne suis ni un pro C++, ni un pro wxWidgets !!!
    Mais n'arrivant pas à mettre la main sur la solution à mon problème aussi bien dans la doc que sur le net... je tente ma chance sur ce forum

    Mon environnement :
    Windows 10
    CodeLite 14
    wxWidgets 3.1.4
    MinGW-W64 8.1.0

    Mon problème tout simple... une fenêtre avec un radiobox et 2 boutons.
    Le RadioBox donne une liste de choix.
    L'un des boutons exécute, via un event wxEVT_BUTTON (suite à un bind), une action dont le déroulement dépendra de ce qui aura été sélecté via le RadioBox.
    L'autre bouton sort de l'appli.

    Quand je clique sur les boutons... j'exécute bien le code de l'Event mais je n'arrive pas à la lire la valeur de la RadioBox via :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    std::string focuser = FocuserBox->GetStringSelection();

    ou bien :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    std::string focuser = FocuserBox.GetStringSelection();


    La compilation me donne l’erreur :
    FocuserBox was not declare in this scope
    Quelqu'un pourrait-il se pencher sur mon cas désespéré

    Cordialement,

    Philippe

    Ma déclaration de classes :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #include<wx/wx.h>
    class MyFrame: public wxFrame
    {
    public:
    	MyFrame(std::string var);
    	void OnQuit(wxCommandEvent& event);
            void OnProcess(wxCommandEvent& event);
    };


    Mes events (pour l'instant, ce ne sont que des tests...) :

    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
    void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event)) 
    {
            // Bouton fermeture
    	this->Close(true);
    }
     
    void MyFrame::OnProcess(wxCommandEvent& evt) //WXUNUSED(event))
    {
            // Code des process sauvegarde et restauration
            std::string focuser = FocuserBox->GetStringSelection();
    	int controlId = evt.GetId();
    	std::string str = "";
    	switch (controlId) 
    	{
    		case -31998: 
    			str = "RodioBox Action";
    			break;
    		case -31994: 
    			str = "RadioBox Focuser";
    			break;
    		case -31988: 
    			str = "Button Lancer FineFocus";
    			break;
    	}
    	int answer = wxMessageBox("Quit program? " + str, "Confirm", wxYES_NO, this);
    	if (answer == wxYES)
    	{
    		this->Close();
    	}
    }

  2. #2
    Membre éclairé
    Bonsoir.

    Voici un exemple de d'utilisation du contrôle wxRadioBox => http://www.wxdev.fr/snippet27-Les_choix,_Bouton_radio,_Case_%C3%A0_cocher_etc.html

  3. #3
    Membre averti
    Hello.

    Citation Envoyé par pe78420 Voir le message
    ......

    La compilation me donne l’erreur : FocuserBox was not declare in this scope

    ......
    L'erreur que tu obtiens t'indique que la variable "FocuserBox" est inconnue au bataillon à l'endroit où tu l'utilises.

    Dans ton cas, il faudrait que la variable soit membre de ta classe "MyFrame"

    Sinon, tu peux peut-être récupérer le pointeur dont tu as besoin depuis la variable "wxEvent" passée en paramètre de ta fonction :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void MyFrame::OnProcess(wxCommandEvent& evt)
    {
        wxRadioBox *FocuserBox = evt.GetEventObject();
        // Code des process sauvegarde et restauration
        std::string focuser = FocuserBox->GetStringSelection();
        ......
    }


    Au passage : pense à utiliser la balise "CODE" de l'éditeur quand tu postes du code sur le forum : c'est beaucoup plus lisible que de coller le code tel-quel.

    @+
    Xav'

  4. ###raw>post.musername###
    Nouveau Candidat au Club
    Merci à vous 2 ddaime et wxXav,

    Je regarde ça...
    J'ai déclaré FocuserBox et ActionBox dans la classe comme ceci :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include<wx/wx.h>
     
    class MyFrame: public wxFrame
    {
    public:
    	MyFrame(std::string var);
    private:
    	void OnQuit(wxCommandEvent& event);
        void OnProcess(wxCommandEvent& event);
     
    	wxRadioBox *FocuserBox;
    	wxRadioBox *ActionBox;
    };


    Coté "events"... je n'ai codé que ça pour tester au debugger :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event)) 
    {
        // Bouton fermeture
    	this->Close(true);
    }
     
    void MyFrame::OnProcess(wxCommandEvent& WXUNUSED(event))
    {
    	wxString focuser = FocuserBox->GetStringSelection();
    	wxString action = ActionBox->GetStringSelection();
    }


    Maintenant je n'ai plus l'erreur à la compilation mais un plantage au run... faut que je regarde plus en avant le fonctionnement du RadioBox

    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
    0  0x000000000040209c  MyFrame::OnProcess  C:\\Users\\Philippe\\Documents\\GitHub\\FFwrapper\\ffwrapper.cpp  60
    1  0x0000000000402a24  wxAppConsoleBase::CallEventHandler(wxEvtHandler*, wxEventFunctor&, wxEvent&) const    
    2  0x00000000004bd712  wxEvtHandler:<img src="images/smilies/icon_razz.gif" border="0" alt="" title=":P" class="inlineimg" />rocessEventIfMatchesId(wxEventTableEntryBase const&, wxEvtHandler*, wxEvent&)    
    3  0x00000000004bdba4  wxEvtHandler::SearchDynamicEventTable(wxEvent&)    
    4  0x00000000004bdf12  wxEvtHandler::TryHereOnly(wxEvent&)    
    5  0x00000000004bdf9d  wxEvtHandler:<img src="images/smilies/icon_razz.gif" border="0" alt="" title=":P" class="inlineimg" />rocessEventLocally(wxEvent&)    
    6  0x00000000004be081  wxEvtHandler:<img src="images/smilies/icon_razz.gif" border="0" alt="" title=":P" class="inlineimg" />rocessEvent(wxEvent&)    
    7  0x00000000004c03bb  wxEvtHandler::SafelyProcessEvent(wxEvent&)    
    8  0x000000000052f03c  wxButton::SendClickEvent()    
    9  0x0000000000517de7  wxWindow::HandleCommand(unsigned short, unsigned short, HWND__*)    
    10  0x0000000000522c4a  wxWindow::MSWHandleMessage(long long*, unsigned int, unsigned long long, long long)    
    11  0x0000000000512afc  wxWindow::MSWWindowProc(unsigned int, unsigned long long, long long)    
    12  0x00007fff29255c7d  USER32!CallWindowProcW    
    13  0x00007fff2925528c  USER32!SendMessageW    
    14  0x00007fff29254ff8  USER32!SendMessageW    
    15  0x00007fff29276d05  USER32!SetWindowsHookExAW    
    16  0x00007fff2927f08a  USER32!SetWindowsHookExAW    
    17  0x00007fff2925ac47  USER32!SetWindowLongA    
    18  0x00007fff29255c7d  USER32!CallWindowProcW    
    19  0x00007fff2925594e  USER32!CallWindowProcW    
    20  0x0000000000518a4f  wxWindow::MSWDefWindowProc(unsigned int, unsigned long long, long long)    
    21  0x0000000000512b24  wxWindow::MSWWindowProc(unsigned int, unsigned long long, long long)    
    22  0x000000000052479f  wxAnyButton::MSWWindowProc(unsigned int, unsigned long long, long long)    
    23  0x00007fff29255c7d  USER32!CallWindowProcW    
    24  0x00007fff29255672  USER32!DispatchMessageW    
    25  0x00007fff29256e10  USER32!IsDialogMessageW    
    26  0x00000000005154db  wxWindow::MSWSafeIsDialogMessage(tagMSG*)    
    27  0x0000000000515729  wxWindow::MSWProcessMessage(tagMSG*)    
    28  0x0000000000523bda  wxGUIEventLoop:<img src="images/smilies/icon_razz.gif" border="0" alt="" title=":P" class="inlineimg" />reProcessMessage(tagMSG*)    
    29  0x0000000000523aa1  wxGUIEventLoop:<img src="images/smilies/icon_razz.gif" border="0" alt="" title=":P" class="inlineimg" />rocessMessage(tagMSG*)    
    30  0x00000000005238b6  wxGUIEventLoop:<img src="images/smilies/icon_biggrin.gif" border="0" alt="" title=":D" class="inlineimg" />ispatch()    
    31  0x00000000004236e3  wxEventLoopManual:<img src="images/smilies/icon_razz.gif" border="0" alt="" title=":P" class="inlineimg" />rocessEvents()    
    32  0x00000000004237ce  wxEventLoopManual:<img src="images/smilies/icon_biggrin.gif" border="0" alt="" title=":D" class="inlineimg" />oRun()    
    33  0x0000000000423439  wxEventLoopBase::Run()    
    34  0x0000000000406a0a  wxAppConsoleBase::MainLoop()    
    35  0x000000000068d4a5  wxEntryReal(int&, wchar_t**)    
    36  0x00000000004021e3  WinMain  C:\\Users\\Philippe\\Documents\\GitHub\\FFwrapper\\main.cpp  11
    37  0x00000000004013c7  __tmainCRTStartup    
    38  0x00000000004014cb  WinMainCRTStartup
      0  0

  5. #5
    Membre averti
    Hello.

    Les déclarations semblent correctes : peux-tu poster le code complet de ta frame stp.

    Je pense avoir une idée mais je ne vaux pas raconter de bêtises donc je préfère vérifier avant.

    @+
    Xav'

  6. #6
    Nouveau Candidat au Club
    Citation Envoyé par wxXav Voir le message
    Hello.

    Les déclarations semblent correctes : peux-tu poster le code complet de ta frame stp.

    Je pense avoir une idée mais je ne vaux pas raconter de bêtises donc je préfère vérifier avant.

    @+
    Xav'
    Voici le code de ma frame tel qu'il est à ce jour

    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
    #include "ffwrapper.hpp"
    #include <wx/gbsizer.h>
     
    // Fenêtre principal (seul fenêtre)
    MyFrame::MyFrame(std::string var) : wxFrame(NULL, -1, "Wrapper FineFocus XXXX",
    						wxDefaultPosition, wxDefaultSize,
    						wxMINIMIZE_BOX | wxSYSTEM_MENU | wxCAPTION | wxCLOSE_BOX | wxCLIP_CHILDREN)
    {
    	// Définition du panel et du grid
    	wxPanel *panel = new wxPanel(this, -1);
    	wxGridBagSizer *grid_BS = new wxGridBagSizer(0, 0);
    	panel->SetSizerAndFit(grid_BS);
     
    	// Définition du RadioBox "Action"
    	wxArrayString action_list;
    	action_list.Add("Sauvegarder");
    	action_list.Add("Restaurer");
    	wxRadioBox *ActionBox = new wxRadioBox(panel, -1, "1-Choisir l'action a effectuer", wxDefaultPosition, wxDefaultSize, action_list, 1, wxRA_SPECIFY_COLS);
     
    	// Définition du RadioBox "Focuser"
    	wxArrayString focuser_list;
    	focuser_list.Add("Focuser C8");
    	focuser_list.Add("Crayford C8");	
    	focuser_list.Add("Crayford LU80");
    	wxRadioBox *FocuserBox = new wxRadioBox(panel, -1, "2-Choisir le focuser à utiliser", wxDefaultPosition, wxDefaultSize, focuser_list, 1, wxRA_SPECIFY_COLS);
     
    	// Définition des boutons
    	wxButton *CloseButton = new wxButton(panel, -1, "Fermer", wxPoint(20,20), wxDefaultSize);
    	wxButton *ProcessButton = new wxButton(panel, -1, "3-Lancer FineFocus", wxPoint(20,20), wxDefaultSize);
     
    	grid_BS->Add(ActionBox, wxGBPosition(0, 0), wxGBSpan(1, 1), wxTOP | wxBOTTOM | wxLEFT | wxRIGHT, 15, NULL);
    	grid_BS->Add(FocuserBox, wxGBPosition(0, 1), wxGBSpan(1, 1), wxTOP | wxBOTTOM |wxRIGHT, 15, NULL);
    	grid_BS->Add(ProcessButton, wxGBPosition(1, 0), wxGBSpan(1, 1), wxALIGN_CENTER | wxBOTTOM |wxLEFT, 15, NULL);
    	grid_BS->Add(CloseButton, wxGBPosition(1, 1), wxGBSpan(1, 1), wxALIGN_CENTER | wxBOTTOM |wxLEFT | wxRIGHT, 15, NULL);
     
    	// Bind des boutons
    	CloseButton->Bind(wxEVT_BUTTON, &MyFrame::OnQuit, this);
    	ProcessButton->Bind(wxEVT_BUTTON, &MyFrame::OnProcess, this);
     
    	grid_BS->Fit(this);
    	grid_BS->SetSizeHints(this);
    }
     
    void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event)) 
    {
        // Bouton fermeture
    	this->Close(true);
    }
     
    void MyFrame::OnProcess(wxCommandEvent& WXUNUSED(event))
    {
    	wxString focuser = FocuserBox.GetStringSelection();
    	wxString action = ActionBox.GetStringSelection();
        // à partir de là... code des process sauvegarde et restauration
    }

  7. #7
    Nouveau Candidat au Club
    A priori il y a quelque chose de pas initialisée !
    J'ai un SIGSEGV

  8. #8
    Membre éclairé
    Bonjour.

    Si tu as déjà déclaré tes 2 contrôles wxRadioBox dans la partie déclarative de ta classe il est alors inutile de les redéclarer dans la partie implémentation.

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    // Définition du RadioBox "Action"
    	wxArrayString action_list;
    	action_list.Add("Sauvegarder");
    	action_list.Add("Restaurer");
    	ActionBox = new wxRadioBox(panel, -1, "1-Choisir l'action a effectuer", wxDefaultPosition, wxDefaultSize, action_list, 1, wxRA_SPECIFY_COLS);
     
    	// Définition du RadioBox "Focuser"
    	wxArrayString focuser_list;
    	focuser_list.Add("Focuser C8");
    	focuser_list.Add("Crayford C8");	
    	focuser_list.Add("Crayford LU80");
    	FocuserBox = new wxRadioBox(panel, -1, "2-Choisir le focuser à utiliser", wxDefaultPosition, wxDefaultSize, focuser_list, 1, wxRA_SPECIFY_COLS);


    Ensuite dans ta fonction OnProcess, puisque tu as déclaré tes 2 contrôles comme pointeurs tu dois utiliser l'opérateur -> pour accéder aux propriétés de tes contrôles;

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	wxString focuser = FocuserBox->GetStringSelection();
    	wxString action = ActionBox->GetStringSelection();
        // à partir de là... code des process sauvegarde et restauration
    	wxMessageBox(focuser + wxT(" ") + action);

  9. #9
    Nouveau Candidat au Club
    Citation Envoyé par ddaime Voir le message
    Bonjour.

    Si tu as déjà déclaré tes 2 contrôles wxRadioBox dans la partie déclarative de ta classe il est alors inutile de les redéclarer dans la partie implémentation...

    Ensuite dans ta fonction OnProcess, puisque tu as déclaré tes 2 contrôles comme pointeurs tu dois utiliser l'opérateur -> pour accéder aux propriétés de tes contrôles...

    Cool... ça fonctionne !!!

    Etrange... je pensais que le compilateur réagissait avec une erreur suite à ce genre de double déclaration

    Maintenant il ne me reste plus qu'à continuer...

    Prochaine étape :
    • Lecture d'un fichier de conf dans Main puis chargement d'une variable JSON (déjà fait)
    • Passage de cette variable JSON dans la class MyFrame pour être utilisée dans les méthodes MyFrame et OnProcess (à faire...)


    Un grand Merci

  10. #10
    Nouveau Candidat au Club
    Citation Envoyé par pe78420 Voir le message
    Cool... ça fonctionne !!!

    Etrange... je pensais que le compilateur réagissait avec une erreur suite à ce genre de double déclaration

    Maintenant il ne me reste plus qu'à continuer...

    Prochaine étape :
    • Lecture d'un fichier de conf dans Main puis chargement d'une variable JSON (déjà fait)
    • Passage de cette variable JSON dans la class MyFrame pour être utilisée dans les méthodes MyFrame et OnProcess (à faire...)


    Un grand Merci
    Sans oublier la problématique de la visualisation des accents dans les labels !!!!

  11. #11
    Membre averti
    Citation Envoyé par pe78420 Voir le message
    Sans oublier la problématique de la visualisation des accents dans les labels !!!!
    C'est généralement un problème venant de l'encodage du fichier source.

    @+
    Xav'

  12. #12
    Nouveau Candidat au Club
    Citation Envoyé par wxXav Voir le message
    C'est généralement un problème venant de l'encodage du fichier source.

    @+
    Xav'
    Bonjour Xav,

    Euh... tu peux m'en dire un peu plus STP ?

    Philippe

  13. #13
    Membre éclairé
    Bonjour.

    Le problème à déjà été maintes fois évoqué => https://www.developpez.net/forums/d2053474/c-cpp/bibliotheques/wxwidgets/wxwidget-code-blocks/

###raw>template_hook.ano_emploi###