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: ![]()
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