Tabelle dei tasti di scelta rapida

Le applicazioni spesso definiscono tasti di scelta rapida, ad esempio CTRL+O per il comando Apri file. È possibile implementare i tasti di scelta rapida gestendo singoli messaggi WM_KEYDOWN , ma le tabelle degli acceleratori offrono una soluzione migliore che:

  • Richiede meno codifica.
  • Consolida tutti i collegamenti in un unico file di dati.
  • Supporta la localizzazione in altre lingue.
  • Consente ai tasti di scelta rapida e ai comandi di menu di usare la stessa logica dell'applicazione.

Una tabella acceleratore è una risorsa dati che esegue il mapping delle combinazioni di tastiera, ad esempio CTRL+O, ai comandi dell'applicazione. Prima di vedere come usare una tabella degli acceleratori, è necessaria un'introduzione rapida alle risorse. Una risorsa è un BLOB di dati integrato in un file binario dell'applicazione (EXE o DLL). Le risorse archiviano i dati necessari per l'applicazione, ad esempio menu, cursori, icone, immagini, stringhe di testo o dati dell'applicazione personalizzati. L'applicazione carica i dati delle risorse dal file binario in fase di esecuzione. Per includere le risorse in un file binario, eseguire le operazioni seguenti:

  1. Creare un file di definizione della risorsa (rc). Questo file definisce i tipi di risorse e i relativi identificatori. Il file di definizione della risorsa può includere riferimenti ad altri file. Ad esempio, una risorsa icona viene dichiarata nel file RC, ma l'immagine dell'icona viene archiviata in un file separato.
  2. Usare il compilatore di risorse di Microsoft Windows (RC) per compilare il file di definizione della risorsa in un file di risorse compilato (res). Il compilatore RC viene fornito con Visual Studio e anche Con Windows SDK.
  3. Collegare il file di risorse compilato al file binario.

Questi passaggi sono approssimativamente equivalenti al processo di compilazione/collegamento per i file di codice. Visual Studio offre un set di editor di risorse che semplificano la creazione e la modifica delle risorse. Questi strumenti non sono disponibili nelle edizioni Express di Visual Studio. Tuttavia, un file RC è semplicemente un file di testo e la sintassi è documentata su MSDN, quindi è possibile creare un file RC usando qualsiasi editor di testo. Per altre informazioni, vedere Informazioni sui file di risorse.

Definizione di una tabella di tasti di scelta rapida

Una tabella di tasti di scelta rapida è una tabella di tasti di scelta rapida. Ogni collegamento è definito da:

  • Identificatore numerico. Questo numero identifica il comando dell'applicazione che verrà richiamato dal collegamento.
  • Carattere ASCII o codice di tasto virtuale del collegamento.
  • Tasti di modifica facoltativi: ALT, MAIUSC o CTRL.

La tabella dell'acceleratore ha un identificatore numerico che identifica la tabella nell'elenco delle risorse dell'applicazione. Verrà ora creata una tabella di tasti di scelta rapida per un semplice programma di disegno. Questo programma avrà due modalità, modalità di disegno e modalità di selezione. In modalità di disegno, l'utente può disegnare forme. In modalità di selezione, l'utente può selezionare le forme. Per questo programma, vorremmo definire i tasti di scelta rapida seguenti.

Tasto di scelta rapida Comando
CTRL+M Passare da una modalità all'altra.
F1 Passare alla modalità di disegno.
F2 Passare alla modalità di selezione.

 

Definire prima di tutto gli identificatori numerici per la tabella e per i comandi dell'applicazione. Questi valori sono arbitrari. È possibile assegnare costanti simboliche per gli identificatori definendole in un file di intestazione. Ad esempio:

#define IDR_ACCEL1                      101
#define ID_TOGGLE_MODE                40002
#define ID_DRAW_MODE                  40003
#define ID_SELECT_MODE                40004

In questo esempio il valore IDR_ACCEL1 identifica la tabella dell'acceleratore e le tre costanti successive definiscono i comandi dell'applicazione. Per convenzione, un file di intestazione che definisce le costanti delle risorse è spesso denominato resource.h. L'elenco successivo mostra il file di definizione della risorsa.

#include "resource.h"

IDR_ACCEL1 ACCELERATORS
{
    0x4D,   ID_TOGGLE_MODE, VIRTKEY, CONTROL    // ctrl-M
    0x70,   ID_DRAW_MODE, VIRTKEY               // F1
    0x71,   ID_SELECT_MODE, VIRTKEY             // F2
}

I tasti di scelta rapida sono definiti all'interno delle parentesi graffe. Ogni collegamento contiene le voci seguenti.

  • Codice della chiave virtuale o carattere ASCII che richiama il collegamento.
  • Comando dell'applicazione. Si noti che nell'esempio vengono usate costanti simboliche. Il file di definizione della risorsa include resource.h, dove vengono definite queste costanti.
  • La parola chiave VIRTKEY indica che la prima voce è un codice di chiave virtuale. L'altra opzione consiste nell'usare caratteri ASCII.
  • Modificatori facoltativi: ALT, CONTROL o MAIUSC.

Se si usano caratteri ASCII per i tasti di scelta rapida, un carattere minuscolo sarà un collegamento diverso da un carattere maiuscolo. Ad esempio, la digitazione di 'a' potrebbe richiamare un comando diverso rispetto alla digitazione di 'A'. Ciò potrebbe confondere gli utenti, quindi in genere è preferibile usare codici di chiave virtuale, anziché caratteri ASCII, per i tasti di scelta rapida.

Caricamento della tabella dell'acceleratore

La risorsa per la tabella dell'acceleratore deve essere caricata prima che il programma possa usarlo. Per caricare una tabella di acceleratore, chiamare la funzione LoadAccelerators .

    HACCEL hAccel = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDR_ACCEL1));

Chiamare questa funzione prima di immettere il ciclo di messaggi. Il primo parametro è l'handle per il modulo. Questo parametro viene passato alla funzione WinMain . Per informazioni dettagliate, vedere WinMain: il punto di ingresso dell'applicazione. Il secondo parametro è l'identificatore della risorsa. La funzione restituisce un handle alla risorsa. Tenere presente che un handle è un tipo opaco che fa riferimento a un oggetto gestito dal sistema. Se la funzione ha esito negativo, restituisce NULL.

È possibile rilasciare una tabella di acceleratore chiamando DestroyAcceleratorTable. Tuttavia, il sistema rilascia automaticamente la tabella all'uscita dal programma, pertanto è necessario chiamare questa funzione solo se si sostituisce una tabella con un'altra. Questo è un esempio interessante nell'argomento Creazione di acceleratori modificabili utente.

Conversione dei tratti chiave in comandi

Una tabella di tasti di scelta rapida funziona convertendo i tratti chiave in messaggi WM_COMMAND . Il parametro wParam di WM_COMMAND contiene l'identificatore numerico del comando. Ad esempio, usando la tabella illustrata in precedenza, il tratto del tasto CTRL+M viene convertito in un messaggio WM_COMMAND con il valore ID_TOGGLE_MODE. A tale scopo, modificare il ciclo di messaggi nel modo seguente:

    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {
        if (!TranslateAccelerator(win.Window(), hAccel, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }

Questo codice aggiunge una chiamata alla funzione TranslateAccelerator all'interno del ciclo del messaggio. La funzione TranslateAccelerator esamina ogni messaggio della finestra, cercando messaggi chiave-down. Se l'utente preme una delle combinazioni di tasti elencate nella tabella dell'acceleratore, TranslateAccelerator invia un messaggio WM_COMMAND alla finestra. La funzione invia WM_COMMAND richiamando direttamente la routine della finestra. Quando TranslateAccelerator converte correttamente un tratto chiave, la funzione restituisce un valore diverso da zero, il che significa che è consigliabile ignorare la normale elaborazione per il messaggio. In caso contrario, TranslateAccelerator restituisce zero. In tal caso, passare il messaggio della finestra a TranslateMessage e DispatchMessage, come di consueto.

Ecco come il programma di disegno potrebbe gestire il messaggio WM_COMMAND :

    case WM_COMMAND:
        switch (LOWORD(wParam))
        {
        case ID_DRAW_MODE:
            SetMode(DrawMode);
            break;

        case ID_SELECT_MODE:
            SetMode(SelectMode);
            break;

        case ID_TOGGLE_MODE:
            if (mode == DrawMode)
            {
                SetMode(SelectMode);
            }
            else
            {
                SetMode(DrawMode);
            }
            break;
        }
        return 0;

Questo codice presuppone che SetMode sia una funzione definita dall'applicazione per passare da una modalità all'altra. I dettagli di come gestire ogni comando dipendono ovviamente dal programma.

Prossima

Impostazione dell'immagine del cursore