Informazioni sugli acceleratori di tastiera

Gli acceleratori sono strettamente correlati ai menu, entrambi consentono all'utente di accedere al set di comandi di un'applicazione. In genere, gli utenti si basano sui menu di un'applicazione per apprendere il set di comandi e quindi passare all'uso degli acceleratori man mano che diventano più esperti con l'applicazione. Gli acceleratori offrono un accesso più rapido e diretto ai comandi rispetto ai menu. Come minimo, un'applicazione deve fornire acceleratori per i comandi più comunemente usati. Anche se gli acceleratori generano in genere comandi esistenti come voci di menu, possono anche generare comandi senza voci di menu equivalenti.

In questa sezione vengono illustrati gli argomenti seguenti.

Tabelle dei tasti di scelta rapida

Una tabella di tasti di scelta rapida è costituita da una matrice di strutture ACCEL , ognuna delle quali definisce un singolo acceleratore. Ogni struttura ACCEL include le informazioni seguenti:

  • Combinazione di tasti dell'acceleratore.
  • Identificatore dell'acceleratore.
  • Vari flag. Ciò include uno che specifica se il sistema deve fornire feedback visivo evidenziando la voce di menu corrispondente, se presente, quando viene usato l'acceleratore

Per elaborare le sequenze di tasti di scelta rapida per un thread specificato, lo sviluppatore deve chiamare la funzione TranslateAccelerator nel ciclo di messaggi associato alla coda di messaggi del thread. La funzione TranslateAccelerator monitora l'input della tastiera nella coda dei messaggi, verificando le combinazioni di tasti che corrispondono a una voce nella tabella dell'acceleratore. Quando TranslateAccelerator trova una corrispondenza, converte l'input della tastiera (ovvero il WM_KEYUP e i messaggi WM_KEYDOWN ) in un messaggio di WM_COMMAND o WM_SYSCOMMAND e quindi invia il messaggio alla routine della finestra specificata. Nella figura seguente viene illustrato come vengono elaborati gli acceleratori.

modello di elaborazione dell'acceleratore di tastiera

Il messaggio WM_COMMAND include l'identificatore dell'acceleratore che ha causato la generazione del messaggio da TranslateAccelerator . La procedura della finestra esamina l'identificatore per determinare l'origine del messaggio e quindi elabora il messaggio di conseguenza.

Le tabelle degli acceleratori esistono a due livelli diversi. Il sistema gestisce una singola tabella di acceleratore a livello di sistema che si applica a tutte le applicazioni. Un'applicazione non può modificare la tabella dell'acceleratore di sistema. Per una descrizione degli acceleratori forniti dalla tabella dell'acceleratore di sistema, vedere Assegnazione di tasti di scelta rapida.

Il sistema gestisce anche le tabelle degli acceleratori per ogni applicazione. Un'applicazione può definire un numero qualsiasi di tabelle di tasti di scelta rapida da usare con le proprie finestre. Un handle a 32 bit univoco (HACCEL) identifica ogni tabella. Tuttavia, solo una tabella di tasti di scelta rapida può essere attiva alla volta per un thread specificato. L'handle per la tabella di tasti di scelta rapida passata alla funzione TranslateAccelerator determina quale tabella dell'acceleratore è attiva per un thread. La tabella dell'acceleratore attivo può essere modificata in qualsiasi momento passando un handle di tabella dell'acceleratore diverso a TranslateAccelerator.

creazione di Accelerator-Table

Per creare una tabella di acceleratore per un'applicazione sono necessari diversi passaggi. Prima di tutto, viene usato un compilatore di risorse per creare risorse della tabella acceleratore e aggiungerle al file eseguibile dell'applicazione. In fase di esecuzione, la funzione LoadAccelerators viene usata per caricare la tabella dell'acceleratore in memoria e recuperare l'handle nella tabella dell'acceleratore. Questo handle viene passato alla funzione TranslateAccelerator per attivare la tabella dell'acceleratore.

È anche possibile creare una tabella acceleratore per un'applicazione in fase di esecuzione passando una matrice di strutture ACCEL alla funzione CreateAcceleratorTable . Questo metodo supporta acceleratori definiti dall'utente nell'applicazione. Analogamente alla funzione LoadAccelerators , CreateAcceleratorTable restituisce un handle di tabella acceleratore che può essere passato a TranslateAccelerator per attivare la tabella dell'acceleratore.

Il sistema elimina automaticamente le tabelle dell'acceleratore caricate da LoadAccelerators o create da CreateAcceleratorTable. Tuttavia, un'applicazione può liberare risorse mentre è in esecuzione eliminando le tabelle dell'acceleratore non più necessarie chiamando la funzione DestroyAcceleratorTable .

È possibile copiare e modificare una tabella dell'acceleratore esistente. La tabella dell'acceleratore esistente viene copiata usando la funzione CopyAcceleratorTable . Dopo la modifica della copia, viene recuperato un handle per la nuova tabella dell'acceleratore chiamando CreateAcceleratorTable. Infine, l'handle viene passato a TranslateAccelerator per attivare la nuova tabella.

Assegnazioni di tasti di scelta rapida

È possibile usare un codice carattere ASCII o un codice di chiave virtuale per definire l'acceleratore. Un codice carattere ASCII fa distinzione tra maiuscole e minuscole dell'acceleratore. Pertanto, l'uso del carattere ASCII "C" definisce l'acceleratore come ALT+C anziché ALT+c. Tuttavia, gli acceleratori con distinzione tra maiuscole e minuscole possono confondere l'uso. Ad esempio, l'acceleratore ALT+C verrà generato se il tasto BLOC MAIUSC è inattivo o se MAIUSC è inattivo, ma non se entrambi sono inattivo.

In genere, gli acceleratori non devono fare distinzione tra maiuscole e minuscole, quindi la maggior parte delle applicazioni usa codici di chiave virtuale per acceleratori anziché codici di carattere ASCII.

Evitare acceleratori in conflitto con i mnemonic del menu di un'applicazione, perché l'acceleratore esegue l'override del tasto mnemonico, che può confondere l'utente. Per altre informazioni sui menu mnemonics, vedere Menu.

Se un'applicazione definisce un acceleratore definito anche nella tabella dell'acceleratore di sistema, l'acceleratore definito dall'applicazione esegue l'override dell'acceleratore di sistema, ma solo all'interno del contesto dell'applicazione. Evitare questa procedura, tuttavia, perché impedisce all'acceleratore di sistema di eseguire il ruolo standard nell'interfaccia utente. Gli acceleratori a livello di sistema sono descritti nell'elenco seguente:

Acceleratore Descrizione
ALT+ESC Passa all'applicazione successiva.
ALT+F4 Chiude un'applicazione o una finestra.
ALT+segno meno Apre il menu Finestra per una finestra del documento.
ALT+STAMPA SCHERMO Copia un'immagine nella finestra attiva negli Appunti.
ALT+BARRA SPAZIATRICE Apre il menu Finestra per la finestra principale dell'applicazione.
ALT+TAB Passa all'applicazione successiva.
CTRL+ESC Passa al menu Start .
CTRL+F4 Chiude il gruppo attivo o la finestra del documento.
F1 Avvia il file della Guida dell'applicazione, se presente.
STAMPA SCHERMO Copia un'immagine sullo schermo negli Appunti.
MAIUSC+ALT+TAB Passa all'applicazione precedente. L'utente deve premere e tenere premuto ALT+MAIUSC premendo TAB.

 

Acceleratori e menu

L'uso di un acceleratore equivale alla scelta di una voce di menu: entrambe le azioni fanno sì che il sistema invii un messaggio di WM_COMMAND o WM_SYSCOMMAND alla routine della finestra corrispondente. Il messaggio WM_COMMAND include un identificatore esaminato dalla routine della finestra per determinare l'origine del messaggio. Se un acceleratore ha generato il messaggio di WM_COMMAND , l'identificatore è quello dell'acceleratore. Analogamente, se una voce di menu ha generato il messaggio WM_COMMAND , l'identificatore è quello della voce di menu. Poiché un acceleratore fornisce un collegamento per la scelta di un comando da un menu, un'applicazione in genere assegna lo stesso identificatore all'acceleratore e alla voce di menu corrispondente.

Un'applicazione elabora un acceleratore WM_COMMAND messaggio esattamente come la voce di menu corrispondente WM_COMMAND messaggio. Tuttavia, il messaggio WM_COMMAND contiene un flag che specifica se il messaggio ha avuto origine da un acceleratore o una voce di menu, nel caso in cui gli acceleratori devono essere elaborati in modo diverso dalle voci di menu corrispondenti. Il messaggio WM_SYSCOMMAND non contiene questo flag.

L'identificatore determina se un acceleratore genera un messaggio di WM_COMMAND o di WM_SYSCOMMAND . Se l'identificatore ha lo stesso valore di una voce di menu nel menu Sistema, l'acceleratore genera un messaggio WM_SYSCOMMAND . In caso contrario, l'acceleratore genera un messaggio di WM_COMMAND .

Se un acceleratore ha lo stesso identificatore di una voce di menu e la voce di menu è disattivata o disabilitata, l'acceleratore viene disabilitato e non genera un messaggio WM_COMMAND o WM_SYSCOMMAND . Inoltre, un acceleratore non genera un messaggio di comando se la finestra corrispondente è ridotta a icona.

Quando l'utente usa un acceleratore che corrisponde a una voce di menu, la routine della finestra riceve il WM_INITMENU e WM_INITMENUPOPUP messaggi come se l'utente avesse selezionato la voce di menu. Per informazioni su come elaborare questi messaggi, vedere Menu.

Un acceleratore che corrisponde a una voce di menu deve essere incluso nel testo della voce di menu.

Stato dell'interfaccia utente

Windows consente alle applicazioni di nascondere o mostrare varie funzionalità nell'interfaccia utente. Queste impostazioni sono note come stato dell'interfaccia utente. Lo stato dell'interfaccia utente include le impostazioni seguenti:

  • indicatori di stato attivo (ad esempio rettangoli di messa a fuoco sui pulsanti)
  • tasti di scelta rapida (indicati da sottolineature nelle etichette di controllo)

Una finestra può inviare messaggi per richiedere una modifica dello stato dell'interfaccia utente, può eseguire una query sullo stato dell'interfaccia utente o applicare un determinato stato per le finestre figlio. Questi messaggi sono i seguenti.

Message Descrizione
WM_CHANGEUISTATE Indica che lo stato dell'interfaccia utente deve cambiare.
WM_QUERYUISTATE Recupera lo stato dell'interfaccia utente per una finestra.
WM_UPDATEUISTATE Modifica lo stato dell'interfaccia utente.

 

Per impostazione predefinita, tutte le finestre figlio di una finestra di primo livello vengono create con lo stesso stato dell'interfaccia utente del padre.

Il sistema gestisce lo stato dell'interfaccia utente per i controlli nelle finestre di dialogo. Al momento della creazione della finestra di dialogo, il sistema inizializza di conseguenza lo stato dell'interfaccia utente. Tutti i controlli figlio ereditano questo stato. Dopo aver creato la finestra di dialogo, il sistema monitora le sequenze di tasti dell'utente. Se le impostazioni dello stato dell'interfaccia utente sono nascoste e l'utente si sposta tramite la tastiera, il sistema aggiorna lo stato dell'interfaccia utente. Ad esempio, se l'utente preme il tasto TAB per spostare lo stato attivo sul controllo successivo, il sistema chiama WM_CHANGEUISTATE per rendere visibili gli indicatori di stato attivo. Se l'utente preme il tasto ALT, il sistema chiama WM_CHANGEUISTATE per rendere visibili i tasti di scelta rapida.

Se un controllo supporta lo spostamento tra gli elementi dell'interfaccia utente in esso contenuti, può aggiornare il proprio stato dell'interfaccia utente. Il controllo può chiamare WM_QUERYUISTATE per recuperare e memorizzare nella cache lo stato iniziale dell'interfaccia utente. Ogni volta che il controllo riceve un messaggio di WM_UPDATEUISTATE , può aggiornare lo stato dell'interfaccia utente e inviare un messaggio di WM_CHANGEUISTATE al relativo padre. Ogni finestra continuerà a inviare il messaggio al padre fino a raggiungere la finestra di primo livello. La finestra di primo livello invia il messaggio WM_UPDATEUISTATE alle finestre dell'albero delle finestre. Se una finestra non passa il messaggio WM_CHANGEUISTATE , non raggiungerà la finestra di primo livello e lo stato dell'interfaccia utente non verrà aggiornato.