Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Toepassingen definiëren vaak sneltoetsen, zoals Ctrl+O voor de opdracht Bestand openen. U kunt sneltoetsen implementeren door afzonderlijke WM_KEYDOWN berichten te verwerken, maar acceleratortabellen bieden een betere oplossing die:
- Vereist minder codering.
- Voegt al uw snelkoppelingen samen in één gegevensbestand.
- Ondersteunt lokalisatie in andere talen.
- Hiermee schakelt u sneltoetsen en menuopdrachten in om dezelfde toepassingslogica te gebruiken.
Een acceleratortabel is een gegevensresource waarmee toetsenbordcombinaties, zoals Ctrl+O, worden toegewezen aan toepassingsopdrachten. Voordat we zien hoe we een acceleratortabel kunnen gebruiken, hebben we een korte inleiding tot resources nodig. Een resource is een gegevensblob die is ingebouwd in een binaire toepassing (EXE of DLL). Resources slaan gegevens op die nodig zijn voor de toepassing, zoals menu's, cursors, pictogrammen, afbeeldingen, tekstreeksen of aangepaste toepassingsgegevens. De toepassing laadt de resourcegegevens uit het binaire bestand tijdens runtime. Ga als volgt te werk om resources in een binair bestand op te nemen:
- Maak een resourcedefinitiebestand (.rc). Dit bestand definieert de typen resources en hun id's. Het resourcedefinitiebestand kan verwijzingen naar andere bestanden bevatten. Een pictogramresource wordt bijvoorbeeld gedeclareerd in het RC-bestand, maar de afbeelding van het pictogram wordt opgeslagen in een afzonderlijk bestand.
- Gebruik de Microsoft Windows Resource Compiler (RC) om het resourcedefinitiebestand te compileren in een gecompileerd resourcebestand (.res). De RC-compiler wordt geleverd met Visual Studio en ook de Windows SDK.
- Koppel het gecompileerde resourcebestand aan het binaire bestand.
Deze stappen zijn ongeveer gelijk aan het compileer-/koppelingsproces voor codebestanden. Visual Studio biedt een set resource-editors waarmee u eenvoudig resources kunt maken en wijzigen. (Deze hulpprogramma's zijn niet beschikbaar in de Express-edities van Visual Studio.) Maar een RC-bestand is gewoon een tekstbestand en de syntaxis wordt gedocumenteerd op MSDN, dus het is mogelijk om een RC-bestand te maken met behulp van een teksteditor. Zie Over resourcebestandenvoor meer informatie.
Een acceleratortabel definiëren
Een acceleratortabel is een tabel met sneltoetsen. Elke snelkoppeling wordt gedefinieerd door:
- Een numerieke id. Dit nummer identificeert de toepassingsopdracht die door de snelkoppeling wordt aangeroepen.
- Het ASCII-teken of de virtuele-sleutelcode van de snelkoppeling.
- Optionele wijzigingstoetsen: Alt, Shift of Ctrl.
De acceleratortabel zelf heeft een numerieke id, waarmee de tabel in de lijst met toepassingsbronnen wordt geïdentificeerd. Laten we een acceleratortabel maken voor een eenvoudig tekenprogramma. Dit programma heeft twee modi, tekenmodus en selectiemodus. In de tekenmodus kan de gebruiker vormen tekenen. In de selectiemodus kan de gebruiker shapes selecteren. Voor dit programma willen we de volgende sneltoetsen definiëren.
| Snelkoppeling | Bevelen |
|---|---|
| Ctrl+M | Schakelen tussen modi. |
| F1 | Schakel over naar de tekenmodus. |
| F2 | Overschakelen naar de selectiemodus. |
Definieer eerst numerieke id's voor de tabel en voor de toepassingsopdrachten. Deze waarden zijn willekeurig. U kunt symbolische constanten voor de id's toewijzen door deze in een headerbestand te definiëren. Bijvoorbeeld:
#define IDR_ACCEL1 101
#define ID_TOGGLE_MODE 40002
#define ID_DRAW_MODE 40003
#define ID_SELECT_MODE 40004
In dit voorbeeld identificeert de waarde IDR_ACCEL1 de acceleratortabel en de volgende drie constanten definiëren de toepassingsopdrachten. Volgens de conventie wordt een headerbestand dat resourceconstanten definieert, vaak resource.h genoemd. In de volgende vermelding ziet u het resourcedefinitiebestand.
#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
}
De sneltoetsen worden gedefinieerd binnen de accolades. Elke snelkoppeling bevat de volgende vermeldingen.
- De code van de virtuele sleutel of het ASCII-teken waarmee de snelkoppeling wordt aangeroepen.
- De opdracht van de toepassing. U ziet dat symbolische constanten in het voorbeeld worden gebruikt. Het resourcedefinitiebestand bevat resource.h, waarbij deze constanten worden gedefinieerd.
- Het trefwoord VIRTKEY betekent dat de eerste vermelding een code van een virtuele sleutel is. De andere optie is om ASCII-tekens te gebruiken.
- Optionele modifiers: Alt, CONTROL of Shift.
Als u ASCII-tekens gebruikt voor sneltoetsen, is een kleine letter een andere snelkoppeling dan een hoofdletter. (Als u bijvoorbeeld 'a' typt, wordt mogelijk een andere opdracht aangeroepen dan 'A'.) Dit kan gebruikers verwarren, dus het is over het algemeen beter om codes voor virtuele sleutels te gebruiken, in plaats van ASCII-tekens, voor sneltoetsen.
De acceleratortabel laden
De resource voor de acceleratortabel moet worden geladen voordat het programma deze kan gebruiken. Als u een acceleratortabel wilt laden, roept u de LoadAccelerators aan functie.
HACCEL hAccel = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDR_ACCEL1));
Roep deze functie aan voordat u de berichtenlus invoert. De eerste parameter is de ingang voor de module. (Deze parameter wordt doorgegeven aan uw WinMain-functie. Zie WinMain voor meer informatie: het toegangspunt van de toepassing.) De tweede parameter is de resource-id. De functie retourneert een ingang naar de resource. Een ingang is een ondoorzichtig type dat verwijst naar een object dat wordt beheerd door het systeem. Als de functie mislukt, wordt NULL-geretourneerd.
U kunt een acceleratortabel vrijgeven door DestroyAcceleratorTableaan te roepen. Het systeem publiceert echter automatisch de tabel wanneer het programma wordt afgesloten, dus u hoeft deze functie alleen aan te roepen als u de ene tabel vervangt door een andere. Er is een interessant voorbeeld hiervan in het onderwerp User Editable Accelerators maken.
Sleutelstreken vertalen in opdrachten
Een acceleratortabel werkt door toetsstreken te vertalen in WM_COMMAND berichten. De parameter wParam van WM_COMMAND bevat de numerieke id van de opdracht. Als u bijvoorbeeld de eerder weergegeven tabel gebruikt, wordt de toetsstreek Ctrl+M omgezet in een WM_COMMAND bericht met de waarde ID_TOGGLE_MODE. Als u dit wilt doen, wijzigt u de berichtlus in het volgende:
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(win.Window(), hAccel, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
Met deze code wordt een aanroep toegevoegd aan de TranslateAccelerator functie binnen de berichtenlus. De functie TranslateAccelerator onderzoekt elk vensterbericht, op zoek naar key-downberichten. Als de gebruiker op een van de toetsencombinaties in de acceleratortabel drukt, stuurt TranslateAccelerator een WM_COMMAND bericht naar het venster verzendt. De functie verzendt WM_COMMAND door de vensterprocedure rechtstreeks aan te roepen. Wanneer TranslateAccelerator een toetsstreek vertaalt, retourneert de functie een niet-nulwaarde, wat betekent dat u de normale verwerking voor het bericht moet overslaan. Anders retourneert TranslateAccelerator nul. Geef in dat geval het vensterbericht door aan TranslateMessage- en DispatchMessage-, zoals normaal.
Hier ziet u hoe het tekenprogramma het WM_COMMAND bericht kan verwerken:
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;
In deze code wordt ervan uitgegaan dat SetMode een functie is die door de toepassing is gedefinieerd om tussen de twee modi te schakelen. De details van hoe u elke opdracht zou verwerken, is uiteraard afhankelijk van uw programma.
Volgend