wxWidgets close button senden wxID_OK



  • Hallo zusammen,

    ich habe folgendes Problem.

    Ich habe ein eigenen Dialog, den ich über ShowModal() benutze. Als zeigbares Beispiel hat der Dialog nur zwei Knöpfe, einmal ok, einmal close.

    Wenn ich den Close Button an wxID_CLOSE binde, bekomme ich von dem automatisch hinzuhgefügten Betriebssystem abhängigem Schließen-Knopf (bei Windows dem Kreuz oben in der Ecke) ein EVT_BUTTON Command Event mit der Id wxID_OK, was eben die Aktion für den Ok Knopf aufruft. Was ja nicht, das erwartete Verhalten ist.

    Hier mal ein kompilierbares Beispiel:

    #include <wx/app.h>
    #include <wx/frame.h>
    #include <wx/sizer.h>
    #include <wx/dialog.h>
    #include <wx/msgdlg.h>
    #include <wx/button.h>
    
    class myDialog : public wxDialog
    {
     public:
    
      myDialog(wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxString(""), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize) :
        wxDialog(parent, id, title, pos, size) {
    
        auto sizer = new wxBoxSizer(wxHORIZONTAL);
        auto closeButton = new wxButton(this, wxID_CLOSE, "Close");
        auto okButton = new wxButton(this, wxID_OK, "Ok");
        sizer->Add(closeButton);
        sizer->Add(okButton);
    
        SetSizerAndFit(sizer);
      };
    
      void onOk(wxCommandEvent& event) {
        wxMessageBox("everything is ok", "ok");
      };
    
      void onClose(wxCommandEvent& event) {
        EndModal(wxID_CLOSE);
      };
      DECLARE_EVENT_TABLE();
    };
    
    BEGIN_EVENT_TABLE(myDialog, wxDialog)
      EVT_BUTTON(wxID_OK, myDialog::onOk)
      EVT_BUTTON(wxID_CLOSE, myDialog::onClose)
    END_EVENT_TABLE()
    
    class TestFrame : public wxFrame {
    public:
      TestFrame::TestFrame(bool restorePerspective, wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& caption = _T(""), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize) :
        wxFrame(parent, id, caption) {
    
        auto top = new wxBoxSizer(wxVERTICAL);
    
        auto button =  new wxButton(this, wxID_CLOSE, "show dialog");
        top->Add(button);
        button->Bind(wxEVT_BUTTON, [this](wxCommandEvent& evt) {
          myDialog dialog(this);
          dialog.ShowModal(); });
    
        SetSizerAndFit(top);
      };
    
    };
    
    class TestApp : public wxApp {
    public:
      virtual bool OnInit() {
        auto frame = new TestFrame(false, nullptr);
        frame->Show();
        return true;
      }
    };
    
    wxIMPLEMENT_APP(TestApp);
    

    Wenn ich in Zeilen 16 und 36 wxID_CLOSE durch wxID_CANCEL ersetze, funktioniert alles wie erwartet.
    Aber eigentlich sollten ja auch mehrere Buttons Events mit der gleichen Id versenden können, oder?

    Testweise habe ich dann nochmal ein eigene Id verwendet und in den Zeillen 16 und 36 wxID_CLOSE fest durch 10000 ersetzt. Damit bekomme ich das selbe Ergebnis, wie mit wxID_CLOSE, also das Schließen-Kreuz sendet ein EVT_BUTTON command event mit wxID_OK.

    Hat jemand eine Ahnung, wodran das liegen könnte. Übersehe ich grade was ganz gewaltig?
    Oder ist es für euch erwartetes Verhalten, wenn Schließen die selbe Auswirkung wir ein Ok-Button hat?

    Ich benutze im Moment VS 2015 und wxWidgets 3.1



  • Hm, ok. Offensichtlich doch eigene Dummheit.

    Offensichtlich generiert der Schließen Button (das Kreuz) ein Event mit der Id wxID_CANCEL. Und wenn es dazu keinen event handler gibt, wird ein event mit exID_OK generiert.

    Für mich ist das trotzdem nicht erwartbares Verhalten. Ich überlege noch ob ich da ein wxWidgets Issue zu aufmachen soll.



  • Gut zu wissen..
    Haste mal in den docs geschaut, ob dazu was drin steht?? Meiner Erfahrung nach, haben die Entwickler sich bei jeder Kleinigkeit von wxWidgets etwas gedacht. ..Hatten ja auch lange Zeit.

    Evtl soll das ein generisches Verhalten sein, dass für diverse Dialoge nützlich ist. Hat dein Dialog zB nur einen OK-Button, wird beim X eben auch (nur) das OK-Event abgerufen. Hat er aber auch einen Cancel-Button, erwartet man beim X eher die Cancel-Aktion, statt der OK-Aktion (...ausser man ist das MS Zwangsupdateprogramm auf Win10; war das nicht so?!.......)


Log in to reply