[C++] Riconoscere tasto premuto

di il
4 risposte

[C++] Riconoscere tasto premuto

Ciao a tutti, volevo chiedervi un consiglio.
Sto facendo un programma in c++, mi servirebbe sapere se c'è una strada per far sì che venga riconosciuto il tasto che vien premuto sulla tastiera. Sto usando freeglut, ma lì le funzioni apposite prendono come argomento o il carattere o il codice ascii corrispondente al tasto premuto.
Qualche funzione magari propria del c++ in grado di far questo esiste? Non voglio che il carattere appaia sul terminale, voglio semplicemente che venga riconosciuto e salvato in una stringa (alla fine apparirà nella finestra di glut, per quello non devo passare da terminale).
Potrei farlo impostando un enum con tutti i vari casi per i vari tasti, ma mi sembra lungo e doloroso come percorso (oltre che poco 'elegante')
Grazie in anticipo!

4 Risposte

  • Re: [C++] Riconoscere tasto premuto

    eugen ha scritto:


    Ciao a tutti, volevo chiedervi un consiglio.
    Sto facendo un programma in c++, mi servirebbe sapere se c'è una strada per far sì che venga riconosciuto il tasto che vien premuto sulla tastiera. Sto usando freeglut, ma lì le funzioni apposite prendono come argomento o il carattere o il codice ascii corrispondente al tasto premuto.
    Ma o mi sfugge qualcosa o non capisco che vuoi dire. In C\C++ e altri linguaggi un carattere assume già il suo valore ASCII corrispondente.

    Esempio:
    
    char carattere = ' ';
    
    Lo spazio in ASCII ha valore esadecimale 0x20, decimale 32, ecc.. quindi avrei potuto anche specificare direttamente il valore e non sarebbe cambiato nulla.

    Oltretutto in ASCII da 0x30 a 0x39 ci sono i numeri da '0' a '9', da 0x41 a 0x5A ci sono le lettere maiuscole da 'A' a 'Z' e da 0x61 a 0x7A quelle minuscole da 'a' a 'z' quindi una stringa alfanumerica è facile da individuare ( o quando parli di enumeratori per tutti e 255 i valori ( o 127 nel caso di ASCII non esteso ) .. questo ti risparmierebbe 62 caratteri da esaminare, usando delle semplici operazioni aritmetiche.

    Poi, per avere un input intendi una funzione che riceva l'input non bufferizzato ( quindi non come la scanf () o la getchar () et simila che aspettano l'invio per rilasciare l'input ) ? Se si, da terminale conosco le ncurses con getch () ..

    Ciao
  • Re: [C++] Riconoscere tasto premuto

    Ciao!
    Provo a spiegarmi meglio: sto lavorando con un'interfaccia grafica, quindi tutti gli "eventi" (ad es. un tasto schiacciato sulla tastiera) per ora li ho gestiti attraverso funzioni di freeglut. Un esempio di questo è quando schiaccio un tasto da tastiera:
    void interface::keyPressed (unsigned char key, int x, int y)    //METHOD:	keyPRESSED
    {  
    	keyStates[key] = true; // Set the state of the current key to pressed 
    } 
    
    
    questa è la funzione che gestisce la chiamata, e per ora l'ho usata in un questo modo:
    if(keyStates['a']==true) launch();
    Posso sia esplicitare il carattere che il codice ASCII (es. '13' se voglio "enter").

    Il problema è che ora non devo più assegnare ad un tasto una funzione specifica, devo far sì che se un tasto qualsiasi è schiacciato il suo carattere venga immagazzinato in una std::string (non penso di poter fare getchar o cin.get perchè non digito su terminale). In pratica la mia finestra grafica chiede di digitare sulla finestra il nome del file da salvare/caricare per poi fare la fstream. In parole povere, voglio fare il salvataggio/caricamento di un file non da terminale ma da finestra grafica.

    Potrei fare un ciclo con un contatore che mi passa tutti i vari ASCII che mi interessano (caratteri alfanumerici+ segni di interpunzione "banali"), come:
    
    for(int i=valore iniziale, i=valore finale, i++){
              if(keyStates[i]==true) do_something(); //salva nella stringa;
    }
    In alternativa, c'è una funzione propria del c++ (oppure di freeglut/opengl) che restituisca automaticamente il codice ASCII di un tasto EVENTUALMENTE premuto, senza bisogno che la scriva io con il metodo del ciclo?

    Capisco che prima posso non essermi espresso bene, spero che così sia più chiaro

    Grazie ancora per il tuo interessamento!
  • Re: [C++] Riconoscere tasto premuto

    Ciao eugen,

    perché non usi la glutKeyboardFunc?
    
    void Input (unsigned char key)
    {
      static char my_data[SIZE];
      static unsigned int pos;
      
      if (pos==SIZE-1 || key==13)
      {
        my_data[pos]=0;
        pos=0;
        
        printf ("Input=%s\n",my_data);
        
        return;
      }
       
      my_data[pos++]=key;
    }
    
    void Keyboard(unsigned char key, int x, int y)
    {
      Input (key);
    }
    
    int main(int argc, char** argv)
    {
      glutInit (&argc, argv);
      glutCreateWindow ("GLUT example");
    
      glutKeyboardFunc (Keyboard);
    
      glutMainLoop ();
      return 0;
    }
    
  • Re: [C++] Riconoscere tasto premuto

    Grazie ixamit, è che sono un pistola e a volte c'è bisogno di qualcuno che ti metta davanti agli occhi la soluzione, per banale che possa essere
    Mi ero perso in un bicchier d'acqua, la glutKeyboardFunc già la usavo per la chiamata a keyPressed, ma il fatto che finora l'avevo usata solo per assegnare eventi a tasti specifici mi ha mandato in confusione non appena sono "uscito dal seminato", per così dire...

    Grazie ancora, a questo punto non dovrebbero esserci problemi, uso la glutKeyboardFunc per il motivo per cui è stata creata! Se per qualche motivo dovessi aver ancora bisogno di qualcosa ritorno. Grazie a tutti!
Devi accedere o registrarti per scrivere nel forum
4 risposte