Freigeben über


Zugriffstastentabellen

Anwendungen definieren häufig Tastenkombinationen, z. B. STRG+O für den Befehl "Datei öffnen". Sie könnten Tastenkombinationen implementieren, indem Sie einzelne WM_KEYDOWN Nachrichten behandeln. Zugriffstastentabellen bieten jedoch eine bessere Lösung:

  • Erfordert weniger Codierung.
  • Konsolidiert alle Verknüpfungen in einer Datendatei.
  • Unterstützt die Lokalisierung in andere Sprachen.
  • Ermöglicht Tastenkombinationen und Menübefehle die Verwendung derselben Anwendungslogik.

Eine Zugriffstastentabelle ist eine Datenressource, die Tastenkombinationen wie STRG+O Anwendungsbefehlen zuordnet. Bevor wir sehen, wie Sie eine Zugriffstastentabelle verwenden, benötigen wir eine kurze Einführung in Ressourcen. Eine Ressource ist ein Datenblob, das in eine Anwendungs-Binärdatei (EXE oder DLL) integriert ist. Ressourcen speichern Daten, die von der Anwendung benötigt werden, z. B. Menüs, Cursor, Symbole, Bilder, Textzeichenfolgen oder benutzerdefinierte Anwendungsdaten. Die Anwendung lädt die Ressourcendaten zur Laufzeit aus der Binärdatei. Gehen Sie wie folgt vor, um Ressourcen in eine Binärdatei einzuschließen:

  1. Erstellen Sie eine Ressourcendefinitionsdatei (RC). Diese Datei definiert die Typen von Ressourcen und deren Bezeichner. Die Ressourcendefinitionsdatei kann Verweise auf andere Dateien enthalten. Beispielsweise wird eine Symbolressource in der RC-Datei deklariert, aber das Symbolbild wird in einer separaten Datei gespeichert.
  2. Verwenden Sie den Microsoft Windows Resource Compiler (RC), um die Ressourcendefinitionsdatei in eine kompilierte Ressourcendatei (RES) zu kompilieren. Der RC-Compiler wird mit Visual Studio und auch dem Windows SDK bereitgestellt.
  3. Verknüpfen Sie die kompilierte Ressourcendatei mit der Binärdatei.

Diese Schritte entsprechen ungefähr dem Kompilierungs-/Verknüpfungsprozess für Codedateien. Visual Studio bietet eine Reihe von Ressourcen-Editoren, die das Erstellen und Ändern von Ressourcen vereinfachen. (Diese Tools sind in den Express-Editionen von Visual Studio nicht verfügbar.) Aber eine RC-Datei ist einfach eine Textdatei, und die Syntax ist auf MSDN dokumentiert, sodass es möglich ist, eine RC-Datei mit einem beliebigen Text-Editor zu erstellen. Weitere Informationen finden Sie unter Informationen zu Ressourcendateien.

Definieren einer Zugriffstastentabelle

Eine Zugriffstastentabelle ist eine Tabelle mit Tastenkombinationen. Jede Verknüpfung wird durch:

  • Ein numerischer Bezeichner. Diese Nummer identifiziert den Anwendungsbefehl, der von der Verknüpfung aufgerufen wird.
  • Der ASCII-Zeichen- oder virtual-key-Code der Verknüpfung.
  • Optionale Zusatztasten: ALT, UMSCHALT oder STRG.

Die Zugriffstastentabelle selbst weist einen numerischen Bezeichner auf, der die Tabelle in der Liste der Anwendungsressourcen identifiziert. Erstellen wir eine Schnellinfotabelle für ein einfaches Zeichenprogramm. Dieses Programm verfügt über zwei Modi, den Zeichenmodus und den Auswahlmodus. Im Zeichenmodus kann der Benutzer Shapes zeichnen. Im Auswahlmodus kann der Benutzer Shapes auswählen. Für dieses Programm möchten wir die folgenden Tastenkombinationen definieren.

Abkürzung Befehl
STRG+M Umschalten zwischen Modi.
F1 Wechseln zum Zeichenmodus.
F2 Wechseln zum Auswahlmodus.

 

Definieren Sie zunächst numerische Bezeichner für die Tabelle und für die Anwendungsbefehle. Diese Werte sind beliebig. Sie können symbolische Konstanten für die Bezeichner zuweisen, indem Sie sie in einer Headerdatei definieren. Zum Beispiel:

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

In diesem Beispiel identifiziert der Wert IDR_ACCEL1 die Zugriffstastentabelle, und die nächsten drei Konstanten definieren die Anwendungsbefehle. Standardmäßig wird eine Headerdatei, die Ressourcenkonstanten definiert, häufig "resource.h" genannt. Die nächste Auflistung zeigt die Ressourcendefinitionsdatei an.

#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
}

Die Tastenkombinationen werden in den geschweiften geschweiften Klammern definiert. Jede Verknüpfung enthält die folgenden Einträge.

  • Der virtuelle Schlüsselcode oder DAS ASCII-Zeichen, das die Verknüpfung aufruft.
  • Der Anwendungsbefehl. Beachten Sie, dass symbolische Konstanten im Beispiel verwendet werden. Die Ressourcendefinitionsdatei enthält resource.h, wobei diese Konstanten definiert sind.
  • Das Schlüsselwort VIRTKEY bedeutet, dass der erste Eintrag ein virtueller Schlüsselcode ist. Die andere Option besteht darin, ASCII-Zeichen zu verwenden.
  • Optionale Modifizierer: ALT, CTRL oder UMSCHALT.

Wenn Sie ASCII-Zeichen für Tastenkombinationen verwenden, ist ein Kleinbuchstaben eine andere Tastenkombination als ein Großbuchstaben. (Beispielsweise kann die Eingabe von "a" einen anderen Befehl als die Eingabe von "A" aufrufen.) Das kann Benutzer verwirren, daher ist es im Allgemeinen besser, virtuelle Schlüsselcodes anstelle von ASCII-Zeichen für Tastenkombinationen zu verwenden.

Laden der Schnellinfotabelle

Die Ressource für die Zugriffstastentabelle muss geladen werden, bevor das Programm sie verwenden kann. Rufen Sie zum Laden einer Zugriffstastentabelle die LoadAccelerators-Funktion auf.

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

Rufen Sie diese Funktion auf, bevor Sie die Nachrichtenschleife eingeben. Der erste Parameter ist das Handle für das Modul. (Dieser Parameter wird an ihre WinMain--Funktion übergeben. Ausführliche Informationen finden Sie unter WinMain: Application Entry Point.) Der zweite Parameter ist der Ressourcenbezeichner. Die Funktion gibt ein Handle für die Ressource zurück. Erinnern Sie sich daran, dass ein Handle ein undurchsichtiger Typ ist, der auf ein objekt verweist, das vom System verwaltet wird. Wenn die Funktion fehlschlägt, wird NULL-zurückgegeben.

Sie können eine Zugriffstastentabelle freigeben, indem Sie DestroyAcceleratorTableaufrufen. Das System gibt die Tabelle jedoch automatisch frei, wenn das Programm beendet wird. Daher müssen Sie diese Funktion nur aufrufen, wenn Sie eine Tabelle durch eine andere ersetzen. Ein interessantes Beispiel hierfür finden Sie im Thema Erstellen von bearbeitbaren Zugriffstasten.

Übersetzen von Tastenstrichen in Befehle

Eine Zugriffstastentabelle funktioniert, indem Tastenstriche in WM_COMMAND Nachrichten übersetzt werden. Der wParam--Parameter von WM_COMMAND enthält den numerischen Bezeichner des Befehls. Beispielsweise wird mithilfe der zuvor gezeigten Tabelle der Tastenstrich STRG+M in eine WM_COMMAND Nachricht mit dem Wert ID_TOGGLE_MODEübersetzt. Um diesen Vorgang vorzunehmen, ändern Sie die Nachrichtenschleife wie folgt:

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

Dieser Code fügt einen Aufruf der TranslateAccelerator Funktion innerhalb der Nachrichtenschleife hinzu. Die TranslateAccelerator--Funktion untersucht jede Fensternachricht und sucht nach Key-Down-Nachrichten. Wenn der Benutzer eine der in der Zugriffstastentabelle aufgeführten Tastenkombinationen drückt, sendet TranslateAccelerator eine WM_COMMAND Nachricht an das Fenster. Die Funktion sendet WM_COMMAND durch direktes Aufrufen der Fensterprozedur. Wenn TranslateAcceler ator erfolgreich einen Tastenstrich übersetzt, gibt die Funktion einen Wert ungleich Null zurück, was bedeutet, dass Sie die normale Verarbeitung für die Nachricht überspringen sollten. Andernfalls gibt TranslateAccelerator Null zurück. Übergeben Sie in diesem Fall die Fensternachricht an TranslateMessage- und DispatchMessage-( normal).

Hier erfahren Sie, wie das Zeichenprogramm die WM_COMMAND Nachricht behandeln kann:

    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;

Dieser Code geht davon aus, dass SetMode eine funktion ist, die von der Anwendung definiert wird, um zwischen den beiden Modi zu wechseln. Die Details dazu, wie Sie jeden Befehl behandeln würden, hängen offensichtlich von Ihrem Programm ab.

Nächster

Festlegen des Cursorbilds