Nella scorsa puntata, abbiamo detto che i gestori per i messaggi
WM_KEYDOWN, WM_KEYUP, WM_SYSKEYDOWN e WM_SYSKEYUP hanno il seguente
prototipo:
afx_msg void OnMsgName (UINT nChar, UINT nRepCnt, UINT nFlags)
- nChar è il codice di tasto virtuale del tasto oggetto del
messaggio. Questo valore è indipendente dal bios e dall'hardware
in genere.
- nRepCnt è il numero di messaggi uguali relativi a quel
tasto che la vostra applicazione ha ricevuto e che non è riuscita
a gestire. Questo parametro permette di evitare il problema dell'overrun:
ciò che l'applicazione continui ad esempio a stampare a video un
carattere anche dopo che abbiamo rilasciato il tasto corrispondente.
Per evitare il problema basta ignorare questo parametro, in caso
contrario ci si deve comportare come se il nostro gestore fosse
stato chiamato un numero di volte pari al suo valore.
- nFlags contiene il codice di scansione OEM del tasto più
alcuni bit aggiuntivi; vediamo la seguente tabella:
|
Bit |
Significato |
Descrizione |
|
0-7 |
Codice di scansione |
Codice di scansione OEM a 8 bit |
|
8 |
Indicatore tasto esteso |
1=esteso, 0=non esteso |
|
9-12 |
Riservato |
N/D |
|
13 |
Indicatore di contesto |
1=tasto ALT premuto, 0=caso opposto |
|
14 |
Indicatore stato precedente tasto |
1=premuto, 0=non premuto |
|
15 |
Indicatore stato transizione |
1=rilascio in corso, 0=pressione in corso |
Vediamo adesso cosa significano tutti questi indicatori.
- Il codice di scansione OEM a 8 bit è un codice che lega al BIOS
il tasto premuto. Solitamente si ignora questo valore perché dipende
dal particolare hardware utilizzato, per trasformarlo comunque in
un codice di tasto virtuale si può utilizzare la funzione API ::MapVirtualKey.
- L'indicatore di tasto esteso è 1 se il tasto premuto è CTRL O
ALT della parte destra della tastiera o i tasti HOME, FINE, INS,
CANC, PGSU, PGGIU, INVIO, i tasti freccia, i tasti del tastierino
numerico o la barra (/).
- L'indicatore di contesto è 1 se il tasto ALT è premuto quando
viene inviato il messaggio. Con l'eccezione che resta comunque a
0 per i messaggi WM_KEYDOWN.
- L'indicatore di stato precedente vale 1 se il tasto era premuto
anche alla ricezione del precedente messaggio OnMsgName.
Solitamente vale 1 quando il tasto è premuto per un lasso di tempo
relativamente lungo.
- L'indicatore di stato di transizione vale 1 per i messaggi WM_KEYUP
e WM_SYSKEYUP e 0 per i corrispondenti messaggi WM_KEYDOWN e WM_SYSKEYDOWN.
È buona norma non gestire i messaggi WM_SYSKEYDOWN e WM_SYSKEYUP,
infatti questi solitamente sono diretti al sistema operativo. Nel
caso che questo sia proprio necessario si raccomanda almeno di ripassarli
alla funzione di gestione di default con gli stessi parametri ricevuti
(magari come prima operazione, prima di procedere con ulteriori
elaborazioni).
In genere il valore più importante di queste funzioni è nChar,
cioè il codice di tasto virtuale. Ecco la lista completa dei codici
di tasto virtuale: ( la spiegazione per ognuno mi sembra superflua
)
VK_LBUTTON
VK_RBUTTON
VK_CANCEL
VK_MBUTTON
VK_BACK
VK_TAB
VK_CLEAR
VK_RETURN
VK_SHIFT
VK_CONTROL
VK_MENU
VK_PAUSE
VK_CAPITAL
VK_ESCAPE
VK_CONVERT
VK_NONCONVERT
VK_ACCEPT
VK_MODECHANGE
VK_SPACE
VK_PRIOR
VK_NEXT
VK_END
VK_HOME
VK_LEFT
VK_UP
VK_RIGHT
VK_DOWN
VK_SELECT
VK_PRINT
VK_EXECUTE
VK_SNAPSHOT
VK_INSERT
VK_DELETE
VK_HELP
VK_0 ... VK_9
VK_A ... VK_Z
VK_LWIN
VK_RWIN
VK_APPS
VK_NUMPAD0
VK_NUMPAD1
VK_NUMPAD2
VK_NUMPAD3
VK_NUMPAD4
VK_NUMPAD5
VK_NUMPAD6
VK_NUMPAD7
VK_NUMPAD8
VK_NUMPAD9
VK_MULTIPLY
VK_ADD
VK_SEPARATOR
VK_SUBTRACT
VK_DECIMAL
VK_DIVIDE
VK_F1
VK_F2
VK_F3
VK_F4
VK_F5
VK_F6
VK_F7
VK_F8
VK_F9
VK_F10
VK_F11
VK_F12
VK_F13
VK_F14
VK_F15
VK_F16
VK_F17
VK_F18
VK_F19
VK_F20
VK_F21
VK_F22
VK_F23
VK_F24
VK_NUMLOCK
VK_SCROLL
VK_LSHIFT
VK_RSHIFT
VK_LCONTROL
VK_RCONTROL
VK_LMENU
VK_RMENU
Per ulteriori approfondimenti sull'argomento discusso in questa
puntata, vi rimando alla prossima.
Torna all'indice Generale del corso di Corso di Visual C++ di Software Planet