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, aber Zugriffstastentabellen bieten eine bessere Lösung für Folgendes:

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

Eine Zugriffstastentabelle ist eine Datenressource, die Tastaturkombinationen, z. B. STRG+O, Anwendungsbefehlen zuordnet. Bevor wir sehen, wie eine Acceleratortabelle verwendet wird, benötigen wir eine kurze Einführung in Ressourcen. Eine Ressource ist ein Datenblob, das in eine Anwendungsbinä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 Ressourcentypen 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-Ressourcencompiler (RC), um die Ressourcendefinitionsdatei in eine kompilierte Ressourcendatei (RES)-Datei zu kompilieren. Der RC-Compiler wird mit Visual Studio und dem Windows SDK bereitgestellt.
  3. Verknüpfen Sie die kompilierte Ressourcendatei mit der Binärdatei.

Diese Schritte entsprechen ungefähr dem Kompilierungs-/Linkprozess 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 definiert durch:

  • Ein numerischer Bezeichner. Diese Nummer gibt den Anwendungsbefehl an, der von der Verknüpfung aufgerufen wird.
  • Das ASCII-Zeichen oder der virtuelle Schlüsselcode der Verknüpfung.
  • Optionale Modifizierertasten: ALT, UMSCHALT oder STRG.

Die Zugriffstastentabelle selbst verfügt über einen numerischen Bezeichner, der die Tabelle in der Liste der Anwendungsressourcen identifiziert. Wir erstellen eine Zugriffstastentabelle für ein einfaches Zeichenprogramm. Dieses Programm verfügt über zwei Modi: Zeichnungsmodus und Auswahlmodus. Im Zeichnungsmodus kann der Benutzer Formen zeichnen. Im Auswahlmodus kann der Benutzer Formen auswählen. Für dieses Programm möchten wir die folgenden Tastenkombinationen definieren.

Verknüpfung Get-Help
STRG+M Wechseln Sie zwischen den Modi.
F1 Wechseln Sie in den Zeichenmodus.
F2 Wechseln Sie in den 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. Gemäß der Konvention wird eine Headerdatei, die Ressourcenkonstanten definiert, häufig als resource.h bezeichnet. Die nächste Auflistung zeigt die Ressourcendefinitionsdatei.

#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 Klammern definiert. Jede Verknüpfung enthält die folgenden Einträge.

  • Der Virtuelle Schlüsselcode oder ASCII-Zeichen, der die Verknüpfung aufruft.
  • Der Anwendungsbefehl. Beachten Sie, dass im Beispiel symbolische Konstanten verwendet werden. Die Ressourcendefinitionsdatei enthält resource.h, in der diese Konstanten definiert sind.
  • Der Schlüsselwort (keyword) VIRTKEY bedeutet, dass der erste Eintrag ein Virtueller Schlüsselcode ist. Die andere Option besteht darin, ASCII-Zeichen zu verwenden.
  • Optionale Modifizierer: ALT, CONTROL oder SHIFT.

Wenn Sie ASCII-Zeichen für Tastenkombinationen verwenden, ist ein Kleinbuchstaben eine andere Verknüpfung als ein Großbuchstaben. (Beispielsweise kann die Eingabe von "a" einen anderen Befehl als die Eingabe von "A" aufrufen.) Dies kann die Benutzer verwirren, sodass es in der Regel besser ist, virtuelle Schlüsselcodes anstelle von ASCII-Zeichen für Tastenkombinationen zu verwenden.

Laden der Accelerator-Tabelle

Die Ressource für die Acceleratortabelle muss geladen werden, bevor das Programm sie verwenden kann. Um eine Zugriffstastentabelle zu laden, rufen Sie die LoadAccelerators-Funktion auf.

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

Rufen Sie diese Funktion auf, bevor Sie in die Nachrichtenschleife gelangen. Der erste Parameter ist das Handle für das Modul. (Dieser Parameter wird an Ihre WinMain-Funktion übergeben. Weitere Informationen finden Sie unter WinMain: Der Anwendungseinstiegspunkt.) Der zweite Parameter ist der Ressourcenbezeichner. Die Funktion gibt ein Handle an die Ressource zurück. Denken Sie daran, dass ein Handle ein undurchsichtiger Typ ist, der sich auf ein vom System verwaltetes Objekt bezieht. Wenn die Funktion fehlschlägt, wird NULL zurückgegeben.

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

Übersetzen von Tastenstrichen in Befehle

Eine Zugriffstastentabelle übersetzt Tastenstriche in WM_COMMAND Nachrichten. Der wParam-Parameter von WM_COMMAND enthält den numerischen Bezeichner des Befehls. Wenn Sie beispielsweise die zuvor gezeigte Tabelle verwenden, wird der Tastenstrich STRG+M in eine WM_COMMAND Nachricht mit dem Wert ID_TOGGLE_MODEübersetzt. Ändern Sie die Nachrichtenschleife wie folgt, um dies zu ermöglichen:

    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-Meldungen. 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 , indem die Fensterprozedur direkt aufgerufen wird. Wenn TranslateAccelerator erfolgreich einen Tastenstrich übersetzt, gibt die Funktion einen Wert ungleich 0 zurück. Dies 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 wie gewohnt an TranslateMessage und DispatchMessage.

Hier erfahren Sie, wie das Zeichenprogramm die WM_COMMAND Meldung 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;

Bei diesem Code wird davon ausgegangen, dass es sich um eine Funktion handelt, SetMode die von der Anwendung definiert wird, um zwischen den beiden Modi zu wechseln. Die Details, wie Sie die einzelnen Befehle behandeln würden, hängen natürlich von Ihrem Programm ab.

Nächste

Festlegen des Cursorbilds