Tabulky akcelerátorů
Aplikace často definují klávesové zkratky, například CTRL+O pro příkaz Otevřít soubor. Klávesové zkratky můžete implementovat zpracováním jednotlivých WM_KEYDOWN zpráv, ale tabulky akcelerátorů poskytují lepší řešení, které:
- Vyžaduje méně kódování.
- Sloučit všechny klávesové zkratky do jednoho datového souboru.
- Podporuje lokalizaci do jiných jazyků.
- Umožňuje zástupcům a příkazům nabídky používat stejnou logiku aplikace.
Tabulka akcelerátoru je datový prostředek, který mapuje kombinace kláves, například CTRL+O, na příkazy aplikace. Než se podíváme, jak používat tabulku akcelerátorů, budeme potřebovat rychlý úvod k prostředkům. prostředek je objekt blob dat, který je integrovaný do binárního souboru aplikace (EXE nebo DLL). Prostředky ukládají data potřebná aplikací, jako jsou nabídky, kurzory, ikony, obrázky, textové řetězce nebo jakákoli vlastní data aplikace. Aplikace načte data prostředků z binárního souboru za běhu. Pokud chcete zahrnout prostředky do binárního souboru, postupujte takto:
- Vytvořte soubor definice prostředku (.rc). Tento soubor definuje typy prostředků a jejich identifikátory. Definiční soubor prostředku může obsahovat odkazy na jiné soubory. Například prostředek ikony je deklarován v souboru .rc, ale obrázek ikony je uložen v samostatném souboru.
- Pomocí kompilátoru prostředků systému Microsoft Windows (RC) zkompilujte definiční soubor prostředku do zkompilovaného souboru prostředku (.res). Kompilátor RC je k dispozici se sadou Visual Studio a také sadou Windows SDK.
- Propojte kompilovaný soubor prostředků s binárním souborem.
Tyto kroky jsou přibližně ekvivalentní procesu kompilace nebo propojení pro soubory kódu. Visual Studio poskytuje sadu editorů prostředků, které usnadňují vytváření a úpravy prostředků. (Tyto nástroje nejsou k dispozici v edicích Express sady Visual Studio.) Ale .rc soubor je jednoduše textový soubor a syntaxe je zdokumentovaná na MSDN, takže je možné vytvořit soubor .rc pomocí libovolného textového editoru. Další informace najdete v tématu oo souborech prostředků .
Definování tabulky akcelerátorů
Tabulka akcelerátorů je tabulka klávesových zkratek. Každá klávesová zkratka je definována takto:
- Číselný identifikátor. Toto číslo identifikuje příkaz aplikace, který bude vyvolán zástupcem.
- Znak ASCII nebo kód virtuálního klíče zástupce.
- Volitelné modifikační klávesy: ALT, SHIFT nebo CTRL.
Samotná tabulka akcelerátorů má číselný identifikátor, který identifikuje tabulku v seznamu prostředků aplikace. Pojďme vytvořit tabulku akcelerátorů pro jednoduchý program kreslení. Tento program bude mít dva režimy, režim kreslení a režim výběru. V režimu kreslení může uživatel kreslit obrazce. V režimu výběru může uživatel vybrat obrazce. Pro tento program bychom chtěli definovat následující klávesové zkratky.
Zkratka | Příkaz |
---|---|
CTRL+M | Přepínání mezi režimy |
F1 | Přepněte do režimu kreslení. |
F2 | Přepněte do režimu výběru. |
Nejprve definujte číselné identifikátory pro tabulku a příkazy aplikace. Tyto hodnoty jsou libovolné. Symbolické konstanty pro identifikátory můžete přiřadit tak, že je definujete v souboru záhlaví. Například:
#define IDR_ACCEL1 101
#define ID_TOGGLE_MODE 40002
#define ID_DRAW_MODE 40003
#define ID_SELECT_MODE 40004
V tomto příkladu hodnota IDR_ACCEL1
identifikuje tabulku akcelerátorů a další tři konstanty definují příkazy aplikace. Podle konvence se soubor hlaviček, který definuje konstanty prostředků, často jmenuje resource.h. V dalším výpisu se zobrazí soubor definice prostředku.
#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
}
Klávesové zkratky jsou definovány v rámci složených závorek. Každá zkratka obsahuje následující položky.
- Kód virtuálního klíče nebo znak ASCII, který vyvolá zástupce.
- Příkaz aplikace. Všimněte si, že v příkladu se používají symbolické konstanty. Soubor definice prostředku obsahuje resource.h, kde jsou tyto konstanty definovány.
- Klíčové slovo VIRTKEY znamená, že první položka je kód virtuálního klíče. Druhou možností je použít znaky ASCII.
- Volitelné modifikátory: ALT, CONTROL nebo SHIFT.
Pokud pro zástupce používáte znaky ASCII, bude malá písmena jinou klávesovou zkratkou než velká písmena. (Například zadáním "a" můžete vyvolat jiný příkaz než zadáním "A".) To může uživatele zmást, takže pro klávesové zkratky je obecně lepší používat kódy virtuálních klíčů místo znaků ASCII.
Načtení tabulky akcelerátorů
Prostředek tabulky akcelerátoru musí být načten, aby ho program mohl použít. Pokud chcete načíst tabulku akcelerátoru, zavolejte LoadAccelerators funkci.
HACCEL hAccel = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDR_ACCEL1));
Před zadáním smyčky zprávy zavolejte tuto funkci. Prvním parametrem je popisovač modulu. (Tento parametr se předá vaší funkci WinMain. Podrobnosti najdete v tématu WinMain: Vstupní bod aplikace.) Druhým parametrem je identifikátor prostředku. Funkce vrátí popisovač prostředku. Vzpomeňte si, že popisovač je neprůhlený typ, který odkazuje na objekt spravovaný systémem. Pokud funkce selže, vrátí null.
Tabulku akcelerátoru můžete uvolnit voláním DestroyAcceleratorTable. Systém však automaticky uvolní tabulku při ukončení programu, takže tuto funkci stačí volat pouze v případě, že nahrazujete jednu tabulku jinou. Existuje zajímavý příklad v tématu Vytváření akcelerátorů upravitelných uživatelů.
Převod klíčových tahů do příkazů
Tabulka akcelerátorů funguje tak, že přeloží tahy kláves do WM_COMMAND zpráv. Parametr wParamWM_COMMAND obsahuje číselný identifikátor příkazu. Například pomocí výše uvedené tabulky se klávesová zkratka CTRL+M přeloží do WM_COMMAND zprávy s hodnotou ID_TOGGLE_MODE
. Pokud to chcete udělat, změňte smyčku zprávy na následující:
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(win.Window(), hAccel, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
Tento kód přidá volání TranslateAccelerator funkce uvnitř smyčky zprávy. Funkce TranslateAccelerator zkoumá každou zprávu okna a hledá zprávy s klávesou dolů. Pokud uživatel stiskne jednu z kombinací kláves uvedených v tabulce akcelerátorů, TranslateAccelerator odešle do okna zprávu WM_COMMAND. Funkce odešle WM_COMMAND přímo vyvoláním procedury okna. Když TranslateAccelerator úspěšně přeloží klávesový tah, vrátí funkce nenulovou hodnotu, což znamená, že byste měli přeskočit normální zpracování zprávy. V opačném případě TranslateAccelerator vrátí nulu. V takovém případě předejte okno zprávu TranslateMessage a DispatchMessage, jako obvykle.
Tady je postup, jak může kreslicí program zpracovat zprávu 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;
Tento kód předpokládá, že SetMode
je funkce definovaná aplikací pro přepínání mezi těmito dvěma režimy. Podrobnosti o tom, jak byste každý příkaz zpracovávali, samozřejmě závisí na vašem programu.
Další