wxWidgets - Maus Events reagieren nicht + neue Frage



  • Hallo.
    Ich habe vor einer Woche mit wxWidgets angefangen, ist also ne Newbie-Frage.
    In meinem Programm möchte ich Events die von der Maus ausgehen behandeln, allerdings funktioniert das nicht so richtig bei mir.
    Wenn ich ein leeres Frame, genauer gesagt einen leeren Client-Bereich habe, kann ich ohne Probleme die Events auslesen.

    Connect(wxID_ANY, wxEVT_MOTION,(wxObjectEventFunction)&MyFrame::OnMotion);
    
    //...oder
    BEGIN_EVENT_TABLE(MyFrame, wxFrame)
        EVT_MOTION(MyFrame::OnMotion)
    END_EVENT_TABLE()
    

    Sobald ich ein Panel oder Button oder sonstewas erstelle, werden die Events nicht mehr ausgelöst.
    Ich habe auch schon vergebens folgendes probiert:

    long id_panel1 = wxNewId();
    wxPanel *panel1 = new wxPanel(this, id_panel1, wxPoint(0,0), wxDefaultSize, wxTAB_TRAVERSAL, _T("ID_PANEL1"));
    ...
    Connect(id_panel1, wxEVT_MOTION,(wxObjectEventFunction)&MyFrame::OnMotion);
    

    edit:
    Problem vorerst gelöst. Mouse Events werden, wie ich eben im Buch gelesen habe, nicht an die Parents weitergereicht. Also habe ich mir eine Klasse von wxPanel abgeleitet und werte darin die Events aus. Von wxEvtHandler abzuleiten und dann die Methode PushEventHandler klappt auch.

    Und mit dynamischen Events müsste es so lauten:

    long id_panel1 = wxNewId();
    wxPanel *panel1 = new wxPanel(this, id_panel1, wxPoint(0,0), wxDefaultSize, wxTAB_TRAVERSAL, _T("ID_PANEL1"));
    ...
    //panel1-> hat gefehlt
    panel1->Connect(id_panel1, wxEVT_MOTION,(wxObjectEventFunction)&MyFrame::OnMotion);
    

  • Mod

    Wenn du gerade mit wxWidgets anfängst, lies doch mal die beiden Tutorials im C++ Magazin dazu.



  • Ah gar nicht gesehen. Waren einige hilfreiche Sachen dabei.

    Ich bin nun auf ein neues Problem gestoßen... eher gesagt auf seltsames Verhalten.

    Ich habe wie oben beschrieben für ein Panel das Event EVT_MOTION mit label1->Connect(...) an die Methode OnMotion des Parents, MyFrame, gekoppelt. Die Funktion wird auch aufgerufen doch der this Zeiger ist auf das Panel gerichtet(mit typeid überprüft). Auf die Member von MyFrame kann ich allerdings ohne Fehler zugreifen, blos haben die irgendwie keinen Wert. Das Verrückte ist ich kann sogar mit dem this Zeiger auf die Member von MyFrame zugreifen(wieder ohne Wert natürlich).
    Also folgendes geht:

    this->MemberVonMyFrame
    

    Mein persönlicher Workaround war einen globalen Zeiger auf MyFrame zu setzen und dann diesen in der besagten Methode zu nutzen. Ein anderer Weg wäre natürlich auch gewesen ein Notifyevent auszulösen was in der EventTable von MyFrame dann abgefangen werden könnt, sodass der this Zeiger auf MyFrame gerichtet ist.

    Ich frage mich nun aber wie es überhaupt zu so diesem Verhalten kommen kann? Ich kann es mir mit meinen jetzigen C++-Kenntnissen zumindest nicht erklären und ich habe auch noch nie zuvor solch ein Verhalten beobachtet.


Anmelden zum Antworten