Corso di Visual C++

Esempio di gestione della tastiera

 

In questa puntata modificheremo il progetto Prg22 e vi aggiungeremo un gestore della tastiera.
La cosa più semplice è creare un progetto ex-novo, chiamarlo Prg34 e poi inserire il codice inserito in Prg22.

Quello che vogliamo implementare in Prg34 è la logica per gestire lo scrolling con i tasti cursore e con i tasti PGGIU, PGSU, HOME ed END.
Ciò che occorre fare è creare un gestore per il messaggio WM_KEYDOWN (WM_CHAR non va bene perché serve per gestire i caratteri stampabili).
Quello che faremo è intercettare il tipo di tasto in base al suo codice di tasto virtuale contenuto nel parametro nChar e quindi inviare un messaggio di scrolling alla finestra.
Ad esempio se nChar conterrà il valore VK_UP (freccia in alto) noi provvederemo ad inviare alla finestra della vista un messaggio SB_LINEUP per effettuare lo scrolling sulla barra verticale (messaggio di tipo WM_VSCROLL).
In pratica scriveremo, per effettuare lo scrolling, la seguente riga di codice:

SendMessage(WM_VSCROLL, SBLINEUP, 0);


Molto semplice vero?, vediamo come si presenta la funzione completa:

void CPrg34View::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
      switch (nChar)
      {

            // scrolling con i tasti freccia
      case VK_UP:
            SendMessage(WM_VSCROLL, SB_LINEUP, 0);
            break;

      case VK_DOWN:
            SendMessage(WM_VSCROLL, SB_LINEDOWN, 0);
            break;

      case VK_LEFT:
            SendMessage(WM_HSCROLL, SB_LINELEFT, 0);
            break;

      case VK_RIGHT:
            SendMessage(WM_HSCROLL, SB_LINERIGHT, 0);
            break;

            // scrolling con i tasti di pagina
      case VK_PRIOR: // pagina su
            SendMessage(WM_VSCROLL, SB_PAGEUP, 0);
            break;

      case VK_NEXT: //pagina giù
            SendMessage(WM_VSCROLL, SB_PAGEDOWN, 0);
            break;

            // scrolling con i tasti HOME e FINE
      case VK_HOME:
            SendMessage(WM_VSCROLL, SB_TOP, 0);
            break;

      case VK_END:
            SendMessage(WM_VSCROLL, SB_BOTTOM, 0);
            break;

      }

     
      CScrollView::OnKeyDown(nChar, nRepCnt, nFlags);
}


Penso che tutto il codice sia autoesplicativo, faccio notare solo il richiamo alla versione base di OnKeyDown alla fine dell'implementazione. E' una buona abitudine richiamare le versioni di base di ogni funzione, a meno che non si sappia bene cosa si sta facendo e cosa accade se ciò non viene fatto.
Infatti in alcuni casi è importante, in altri no: per non sbagliarsi la richiamiamo sempre e ci togliamo ogni dubbio.

Clicca qui per scaricare il progetto Prg34: Scarica il progetto Prg34

Un ultima sottigliezza che vi potrebbe interessare riguarda il funzionamento della funzione ::TranslateMessage.
Questa funzione viene richiamata nella gestione di default del ciclo dei messaggi del Framework. Questa si occupa di tradurre le sequenze WM_KEYDOWN, WM_KEYUP, WM_SYSKEYDOWN e WMSYSKEYUP che riguardano i caratteri stampabili in sequenze WM_CHAR e WM_SYSCHAR.
Questo vi consente di liberarvi del compito di controllare gli stati dei tasti MAIUSC, ALT e CTRL quando arriva il messaggio della pressione di un tasto.
Inoltre c'è anche un aspetto nascosto: tutti i codici tasto che vi arrivano con WM_CHAR e WM_SYSCHAR non sono codici dipendenti dal particolare layout della tastiera, ma sono codici ANSI, cioè indipendenti dal particolare contesto di utilizzo. Questo significa che se voi ad esempio avete selezionato un tipo di carattere OEM, potrebbero esserci delle incongruenze nella visualizzazione di alcuni caratteri particolari.

I caratteri OEM sono quelli che solitamente sono memorizzati nelle ROM degli adattatori video e corrispondono esattamente ai caratteri ANSI con codici da 32 a 127. All'esterno di questo range non c'è più corrispondenza e può accadere che a parità di codice vengano visualizzati caratteri completamente diversi in dipendenza dal set di caratteri selezionato.
Per venire incontro a questo problema, la classe CString è dotata di due funzioni di conversione: OemToAnsi e AnsiToOem. Bisogna tenere presente però, che la traduzione non sempre è perfetta, perché potrebbe accadere che un carattere in un set non corrisponda ad alcun carattere nell'altro set e quindi Windows cerca di trovare il carattere più somigliante a quello da tradurre.
La funzione OemToAnsi è molto utilizzata per trasformare file di testo MsDos in file di testo da visualizzare con Windows.

Con questa puntata abbiamo terminato la trattazione del mouse e della tastiera, dalla prossima inizieremo un nuovo argomento: i menu.

 

Torna all'indice Generale del corso di Corso di Visual C++ di Software Planet