wxWidgets:wxButton und wxKeyEvent



  • Also ich hab folgendes Problem sobald eins meiner Frames einen Button besitzt funktionieren die KeyEvents nur, wenn ich mit SetFocus das Hauptfenster focusiere und dann auch nur bis zum ersten Klick auf das Fenster. Weiß jmd wie ich ohne Accelerates(oder wie sie heißen) das ändern kann? (also das die Keyevents trotzdem funktionieren).

    #include "testWindow.h"
    
    BEGIN_EVENT_TABLE(contentPanel,wxPanel)
      EVT_BUTTON(ID_BUTTON1,contentPanel::onButton1)
      EVT_BUTTON(ID_BUTTON2,contentPanel::onButton2)
    END_EVENT_TABLE()
    
    contentPanel::contentPanel(wxFrame *parent)
        : wxPanel(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxBORDER_SUNKEN){
    
        m_parent = parent;
    
        m_box_v = new wxBoxSizer(wxVERTICAL);
        m_box_h1 = new wxBoxSizer(wxHORIZONTAL);
        m_box_h2 = new wxBoxSizer(wxHORIZONTAL);
    
        m_p_staticText = new wxStaticText(this,wxID_ANY,wxT("300 sind sehr viele!"));
    
        m_box_h1->Add(m_p_staticText);
        m_box_v->Add(m_box_h1);
    
        m_button1 = new wxButton(this,ID_BUTTON1,wxT("CLOSE"));
        m_button2 = new wxButton(this,ID_BUTTON2,wxT("DESTROY"));
    
        m_box_h2->Add(m_button1);
        m_box_h2->Add(m_button2);
        m_box_v->Add(m_box_h2);
    
        this->SetSizer(m_box_v);
    
        this->SetFocus();
    
        Connect(wxEVT_KEY_DOWN,wxKeyEventHandler(contentPanel::onKeyDown));
    }
    
    void contentPanel::onKeyDown(wxKeyEvent &event){
      #if wxUSE_UNICODE
        int key = event.GetUnicodeKey();
      #else
        int key = event.GetKeyCode();
      #endif
    
      if(key){
        wxString dummy(wxT("IN_PANEL"));
    
        m_p_staticText->SetLabel(dummy);
      }
      else{
        event.Skip();
      }
    }
    
    void contentPanel::onButton1(wxCommandEvent &event){
      m_parent->Close();
    }
    
    void contentPanel::onButton2(wxCommandEvent &event){
      if(m_button1){
        m_button1->~wxButton();
        m_button1 = NULL;
      }
      else{
        m_p_staticText->SetLabel(wxT("NIX DA!"));
      }
    }
    
    BEGIN_EVENT_TABLE(mainWindow,wxFrame)
      EVT_MENU(wxID_EXIT,mainWindow::onExit)
      //EVT_BUTTON(ID_BUTTON1,mainWindow::onButton1)
      //EVT_BUTTON(ID_BUTTON2,mainWindow::onButton2)
    END_EVENT_TABLE()
    
    mainWindow::mainWindow(const wxString& title)
        : wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(400, 230)){
      //MENU
    
      wxMenu *t_datei = new wxMenu;
      t_datei->Append(wxID_EXIT,wxT("&Beenden\tF2"), wxT("Dat Programm schliessen"));
    
      wxMenuBar *t_menubar = new wxMenuBar;
      t_menubar->Append(t_datei,wxT("&Datei"));
    
      SetMenuBar(t_menubar);
    
      //----
    
      m_panel = new contentPanel(this);
    
      Connect(wxEVT_KEY_DOWN,wxKeyEventHandler(mainWindow::onKeyDown));
    
      //this->SetFocus();
    }
    
    void mainWindow::onKeyDown(wxKeyEvent &event){
      #if wxUSE_UNICODE
        int key = event.GetUnicodeKey();
      #else
        int key = event.GetKeyCode();
      #endif
    
      if(key){
        wxString dummy(wxT("IN_FRAME"));
    
        m_panel->m_p_staticText->SetLabel(dummy);
      }
      else{
        event.Skip();
      }
    }
    
    void mainWindow::onExit(wxCommandEvent &event){
      Close();
    }
    


  • Nimm mal statt des wxStaticText eine multiline-wxTextCtrl, mit Append().
    Dann bei jedem KeyDown immer event.Skip() machen, vielleicht wird dir dann das Verhalten einleuchten.



  • hast du vllt noch ein codebeispiel...

    oder könnetst du es mir näher erläutern, wie ich damit mein problem lösen kann?

    vllt wurde es auch nicht ganz verstanden:

    wie kann ich einen key abfragen trotz einem button, ohne button funktioniert es problemlos, mit nur mit focus auf das hauptfenster (insgesamt ohne accelerate table).


Log in to reply