Tastatureingabe einlesen



  • Hallo zusammen!
    Ich benutze wxDev-C++ und möchte ein kleines Programm schreiben das auf Tastendruck einen Wert um 10 erhöht bzw. verringert. Auf der Konsole klappt das schon recht gut (solange das Konsolenfenster das aktive Fenster ist), hier mal der code:

    #include <iostream>
    #include <conio.h>
    using namespace std;
    
    int main()
    { 
    double x=1000;
    int key;
         do{
            key = getch();
    
                if(key == 72)        //Taste Pfeil-hoch
                {x=x+10;
                cout << "x: " << x <<'\n';}
    
                else if(key == 80)  //Taste Pfeil-runter
                {x=x-10;
                cout << "x: " << x << '\n';}
    
            }while(true);
    return 0;
    }
    

    Nun möchte ich gerne den Designer von wxWidgets benutzen um einen kleinen Dialog zu erstellen welcher immer im Vordergrund sein soll und ebenfalls auf Tastendruck den Wert erhöht und verringert.

    Bei der Benutzung des Programms soll ein anderes Programm (eine Flugsimulation) laufen, das Fenster wird deshalb nicht das aktive Fenster sein. Ist es möglich es trotzdem auf Tastendruck reagieren zu lassen?

    Meine erste Idee war es, die Funktion durch einen "Event" aufzurufen, etwa durch "OnKeyDown", das funktioniert aber leider nicht. Der Compiler meckert zwar nicht, der Wert von x wird auf Tastendruck aber auch nicht verändert.

    Hier mein Versuch:

    #include <conio.h>
    void TastatureingabeDlg::TastatureingabeDlgKeyDown(wxKeyEvent& event)
    {
    
    double x=1000;
    int key;
         do{
            key = getch();
    
                if(key == 72)        //Taste Pfeil-hoch
                {x=x+10;}
    
                else if(key == 80)  //Taste Pfeil-runter
                {x=x-10;}
    
            }while(true);
    
         wxString strX = wxString::Format("%.0f",x); //Zahl x in wxString umwandeln
    	 txtX->SetLabel("x: " + strX);  //den String im Textfeld (wxStaticText) "txtX" ausgeben
    }
    

    Ich denke hier komme ich mit getch() nicht mehr weiter...
    Hat jemand eine Idee wie ich das umsetzen könnte?

    Schonmal Danke und LG,
    Martin



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x) in das Forum Andere GUIs - Qt, GTK+, wxWidgets verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Eh, wenn du wxWidgets benutzt brauchst du doch kein getch().. oO

    #include <wx/wx.h>
    
    class Mainframe : public wxFrame
    {
    public:
      Mainframe() 
        : wxFrame(NULL, wxID_ANY, "Hello World")
      {
          m_txt = new wxText(this, wxID_ANY, "Tipp mal drauf los");
      }
    
      virtual ~Mainframe() {}
    
      virtual void MyKeyDown(wxKeyEvent& evt)
      {
         m_getippter_text += evt.GetUnicodeKey();
         m_txt.SetLabel(m_getippter_text);
      }
    
    private:
      wxTextCtrl* m_txt;
      wxString m_getippter_text;
    
      DECLARE_EVENT_TABLE();
    };
    
    BEGIN_EVENT_TABLE(Mainframe, wxFrame)
       EVT_KEY_DOWN(Mainframe::MyKeyDown)
    END_EVENT_TABLE()
    
    class Application : public wxApp
    {
    public:
       virtual bool OnInit()
       {
         Mainframe* f = new Mainframe();
         f->Show();
         SetTopWindow(f);
       }
    };
    
    IMPLEMENT_APP(Application);
    

    Nicht getestet, sollte aber klappen...



  • Vielen Dank für die Hilfe, werd ich ausprobieren!
    Wie man sieht bin ich ein Neuling in C++, und besonders grün hinter den Ohren was das Erstellen einer GUI angeht. Die Event-Handler sollte ich mir mal genauer anschauen...

    Ich habe inzwischen, mehr durch Zufall, eine andere Lösung gefunden. Sie funktioniert, obs allerdings geschickt ist...

    Sieht im Moment etwa so aus:

    include# <Windows.h>
    double x=1000;
    // "OnIdle"
    void TastatureingabeDlg::TastatureingabeDlgIdle(wxIdleEvent& event)
    {
        //...
        if(GetAsyncKeyState(VK_UP)!=0)
            {
            x=x+10;
            }
        if(GetAsyncKeyState(VK_DOWN)!=0)
            {
            x=x-10;
            }
        //...
    }
    

    Es funktioniert, aber lege ich mich durch das Includieren der Windows.h schon auf Windows-Betriebssysteme fest?



  • Ja, tust du. Natürlich auch durch die Verwendung von GetAsyncKeyState.
    Aber die Funktion macht keinen Sinn. Warum den Key-Status OS-Abhängig abfragen wenn Dir ein Event bereits den Key liefert und zwar genau dann wenn er gedrückt wird? Das Idle Event ist dafür kein guter Ort.

    Du solltest vllt erstmal C++ lernen und dann mit GUI's was machen.



  • Einverstanden, ums Lernen gehts mir ja 🙂



  • Er kann auch durch GUI-Programmierung C++ lernen.


Anmelden zum Antworten