Over toetsenbordversnellers
Accelerators zijn nauw verwant aan menu's. Beide bieden de gebruiker toegang tot de opdrachtenset van een toepassing. Normaal gesproken zijn gebruikers afhankelijk van de menu's van een toepassing om de opdrachtenset te leren en vervolgens over te schakelen naar het gebruik van accelerators naarmate ze efficiënter worden met de toepassing. Accelerators bieden snellere, meer directe toegang tot opdrachten dan menu's. Een toepassing moet minimaal accelerators bieden voor de veelgebruikte opdrachten. Hoewel accelerators doorgaans opdrachten genereren die bestaan als menu-items, kunnen ze ook opdrachten genereren die geen equivalente menu-items hebben.
In deze sectie worden de volgende onderwerpen behandeld.
- Accelerator-tabellen
- Accelerator-Table maken
- Versneller Toetsaanslagtoewijzingen
- Accelerators en Menu's
- gebruikersinterface-status
Acceleratortabellen
Een acceleratortabel bestaat uit een matrix van ACCEL- structuren, die elk een afzonderlijke accelerator definiëren. Elke ACCEL- structuur bevat de volgende informatie:
- De toetsaanslagcombinatie van de accelerator.
- De id van de accelerator.
- Verschillende vlaggen. Dit omvat een die aangeeft of het systeem visuele feedback moet geven door het bijbehorende menu-item te markeren, indien van toepassing, wanneer de accelerator wordt gebruikt
Als je toetsaanslagen voor een opgegeven thread wilt verwerken, moet de ontwikkelaar de functie TranslateAccelerator aanroepen in de berichtenlus die aan de berichtenwachtrij van de thread is gekoppeld. De TranslateAccelerator functie bewaakt de toetsenbordinvoer in de berichtenwachtrij en controleert op toetscombinaties die overeenkomen met een vermelding in de acceleratortabel. Wanneer TranslateAccelerator een overeenkomst vindt, wordt de toetsenbordinvoer (dat wil gezegd de WM_KEYUP en WM_KEYDOWN berichten) omgezet in een WM_COMMAND- of WM_SYSCOMMAND bericht en wordt het bericht verzonden naar de vensterprocedure van het opgegeven venster. In de volgende afbeelding ziet u hoe accelerators worden verwerkt.
Het WM_COMMAND bericht bevat de identificatie van de accelerator die TranslateAccelerator veroorzaakte om het bericht te genereren. De vensterprocedure onderzoekt de identifier om de bron van het bericht te bepalen en verwerkt vervolgens het bericht dienovereenkomstig.
Accelerator-tabellen bestaan op twee verschillende niveaus. Het systeem onderhoudt één, systeembrede acceleratortabel die van toepassing is op alle toepassingen. Een toepassing kan de tabel met systeemversnellers niet wijzigen. Voor een beschrijving van de door de systeemversnellerstabel geleverde sneltoetsen, zie Accelerator Keystroke Assignments.
Het systeem onderhoudt ook acceleratortabellen voor elke toepassing. Een toepassing kan een willekeurig aantal acceleratortabellen definiëren voor gebruik met eigen vensters. Een unieke 32-bits greep (HACCEL) identificeert elke tabel. Er kan echter slechts één acceleratortabel tegelijk actief zijn voor een opgegeven thread. De greep naar de acceleratortabel die wordt doorgegeven aan de TranslateAccelerator functie bepaalt welke acceleratortabel actief is voor een thread. De actieve acceleratortabel kan op elk gewenst moment worden gewijzigd door een andere greep voor acceleratortabellen door te geven aan TranslateAccelerator-.
Accelerator-Table creatie
Er zijn verschillende stappen vereist voor het maken van een acceleratortabel voor een toepassing. Eerst wordt een resourcecompilator gebruikt om accelerator-tabelresources te maken en deze toe te voegen aan het uitvoerbare bestand van de toepassing. Op runtime wordt de LoadAccelerators functie gebruikt om de acceleratortabel in het geheugen te laden en de handler voor de acceleratortabel op te halen. Deze handle wordt doorgegeven aan de TranslateAccelerator functie om de acceleratortabel te activeren.
Een acceleratortabel kan ook worden gemaakt voor een toepassing tijdens runtime door een matrix van ACCEL- structuren door te geven aan de functie CreateAcceleratorTable. Deze methode ondersteunt door de gebruiker gedefinieerde accelerators in de toepassing. Net als de functie LoadAccelerators, retourneert CreateAcceleratorTable een handle voor de acceleratortabel die kan worden doorgegeven aan TranslateAccelerator- om de acceleratortabel te activeren.
Het systeem vernietigt automatisch acceleratortabellen die zijn geladen door LoadAccelerators of gemaakt door CreateAcceleratorTable. Een toepassing kan echter resources vrijmaken terwijl deze wordt uitgevoerd door acceleratortabellen te vernietigen die niet meer nodig zijn door de DestroyAcceleratorTable--functie aan te roepen.
Een bestaande acceleratortabel kan worden gekopieerd en gewijzigd. De bestaande acceleratortabel wordt gekopieerd met behulp van de functie CopyAcceleratorTable. Nadat de kopie is gewijzigd, wordt een verwijzing naar de nieuwe acceleratortabel verkregen door CreateAcceleratorTableaan te roepen. Ten slotte wordt de handle doorgegeven aan TranslateAccelerator om de nieuwe tabel te activeren.
Toewijzingen van sneltoetsen voor versneller
Een ASCII-tekencode of een code voor virtuele sleutels kan worden gebruikt om de accelerator te definiëren. Een ASCII-tekencode maakt de accelerator hoofdlettergevoelig. Als u dus het ASCII-teken 'C' gebruikt, wordt de accelerator gedefinieerd als Alt+C in plaats van Alt+c. Hoofdlettergevoelige accelerators kunnen echter verwarrend zijn om te gebruiken. De Alt+C-sneltoets wordt bijvoorbeeld gegenereerd als de CAPS LOCK-toets is ingedrukt of als de Shift-toets is ingedrukt, maar niet als beide zijn ingedrukt.
Accelerators hoeven doorgaans niet hoofdlettergevoelig te zijn, dus de meeste toepassingen gebruiken virtuele-sleutelcodes voor accelerators in plaats van ASCII-tekencodes.
Vermijd toetscombinaties die conflicteren met de menumnemonics van een toepassing, omdat de toetscombinatie de mnemonic overschrijft, wat voor verwarring bij de gebruiker kan zorgen. Voor meer informatie over menu-mnemonics, raadpleeg Menus.
Als een toepassing een accelerator definieert die ook in de tabel van de systeemversneller is gedefinieerd, overschrijft de toepassingsversneller de systeemversneller, maar alleen binnen de context van de toepassing. Vermijd deze procedure echter omdat de systeemversneller de standaardrol in de gebruikersinterface niet kan uitvoeren. De systeembrede accelerators worden beschreven in de volgende lijst:
Gaspedaal | Beschrijving |
---|---|
Alt+ESC | Hiermee schakelt u over naar de volgende toepassing. |
Alt+F4 | Hiermee sluit u een toepassing of een venster. |
Alt+Koppelteken | Hiermee opent u het venstermenu voor een documentvenster. |
ALT+PRINTSCREEN | Kopieert een afbeelding in het actieve venster naar het klembord. |
Alt+spatiebalk | Hiermee opent u het venstermenu voor het hoofdvenster van de toepassing. |
Alt+TAB | Hiermee schakelt u over naar de volgende toepassing. |
Ctrl+ESC | Hiermee schakelt u over naar het menu Start. |
Ctrl+F4 | Hiermee sluit u de actieve groep of het actieve documentvenster. |
F1 | Hiermee wordt het Help-bestand van de toepassing gestart, indien aanwezig. |
Scherm afdrukken | Met deze functie kopieert u een afbeelding van het scherm naar het klembord. |
Shift+Alt+Tab | Hiermee schakelt u over naar de vorige toepassing. De gebruiker moet Alt+Shift ingedrukt houden terwijl hij op Tab drukt. |
Versnellers en menu's
Het gebruik van een accelerator is hetzelfde als het kiezen van een menu-item: beide acties zorgen ervoor dat het systeem een WM_COMMAND of WM_SYSCOMMAND bericht naar de bijbehorende vensterprocedure verzendt. Het WM_COMMAND bericht bevat een id die door de vensterprocedure wordt onderzocht om de bron van het bericht te bepalen. Als een accelerator het WM_COMMAND bericht heeft gegenereerd, is de id die van de accelerator. Evenzo, als een menu-item het WM_COMMAND bericht genereert, is de id die van het menu-item. Omdat een accelerator een snelkoppeling biedt voor het kiezen van een opdracht in een menu, wijst een toepassing meestal dezelfde id toe aan de accelerator en het bijbehorende menu-item.
Een toepassing verwerkt een accelerator WM_COMMAND bericht op exact dezelfde manier als het bijbehorende menu-item WM_COMMAND bericht. Het WM_COMMAND bericht bevat echter een vlag die aangeeft of het bericht afkomstig is van een accelerator of een menu-item, voor het geval accelerators anders moeten worden verwerkt dan de bijbehorende menu-items. Het WM_SYSCOMMAND bericht bevat deze vlag niet.
De id bepaalt of een accelerator een WM_COMMAND of WM_SYSCOMMAND bericht genereert. Als de id dezelfde waarde heeft als een menu-item in het systeemmenu, genereert de accelerator een WM_SYSCOMMAND bericht. Anders genereert de accelerator een WM_COMMAND bericht.
Als een accelerator dezelfde id heeft als een menu-item en het menu-item grijs of uitgeschakeld is, wordt de accelerator uitgeschakeld en wordt er geen WM_COMMAND of WM_SYSCOMMAND bericht gegenereerd. Een accelerator genereert ook geen opdrachtbericht als het bijbehorende venster is geminimaliseerd.
Wanneer de gebruiker een accelerator gebruikt die overeenkomt met een menu-item, ontvangt de vensterprocedure de WM_INITMENU en WM_INITMENUPOPUP berichten alsof de gebruiker het menu-item had geselecteerd. Zie Menu'svoor informatie over het verwerken van deze berichten.
Een accelerator die overeenkomt met een menu-item, moet worden opgenomen in de tekst van het menu-item.
Status van de UI
Met Windows kunnen toepassingen verschillende functies in de gebruikersinterface verbergen of weergeven. Deze instellingen worden de status van de gebruikersinterface genoemd. De gebruikersinterfacestatus bevat de volgende instellingen:
- focusindicatoren (zoals focusrechthoeken op knoppen)
- toetsenbordversnellers (aangegeven door onderstrepingen in besturingslabels)
Een venster kan berichten verzenden om een wijziging aan te vragen in de gebruikersinterfacestatus, kan de gebruikersinterfacestatus opvragen of een bepaalde status afdwingen voor de onderliggende vensters. Deze berichten zijn als volgt.
Bericht | Beschrijving |
---|---|
WM_CHANGEUISTATE | Geeft aan dat de gebruikersinterfacestatus moet worden gewijzigd. |
WM_QUERYUISTATE | Hiermee haalt u de gebruikersinterfacestatus voor een venster op. |
WM_UPDATEUISTATE | Hiermee wijzigt u de gebruikersinterfacestatus. |
Standaard worden alle onderliggende vensters van een venster op het hoogste niveau gemaakt met dezelfde gebruikersinterfacestatus als de bovenliggende vensters.
Het systeem verwerkt de UI-status voor besturingselementen in dialoogvensters. Bij het maken van het dialoogvenster initialiseert het systeem de ui-status dienovereenkomstig. Alle onderliggende besturingselementen nemen deze status over. Nadat het dialoogvenster is gemaakt, controleert het systeem de toetsaanslagen van de gebruiker. Als de instellingen voor de gebruikersinterfacestatus verborgen zijn en de gebruiker met het toetsenbord navigeert, wordt de gebruikersinterfacestatus bijgewerkt. Als de gebruiker bijvoorbeeld op de Tab-toets drukt om de focus naar het volgende besturingselement te verplaatsen, roept het systeem WM_CHANGEUISTATE aan om de focusindicatoren zichtbaar te maken. Als de gebruiker op de Alt-toets drukt, roept het systeem WM_CHANGEUISTATE aan om de toetsenbordversnellers zichtbaar te maken.
Als een besturingselement navigatie ondersteunt tussen de ui-elementen die het bevat, kan het de eigen UI-status bijwerken. Het besturingselement kan WM_QUERYUISTATE aanroepen om de initiële gebruikersinterface-status op te halen en in de cache op te slaan. Wanneer het besturingselement een WM_UPDATEUISTATE bericht ontvangt, kan het de gebruikersinterfacestatus bijwerken en een WM_CHANGEUISTATE bericht naar het bovenliggende element verzenden. Elk venster blijft het bericht naar het bovenliggende venster verzenden totdat het het venster op het hoogste niveau bereikt. Het venster op het hoogste niveau verzendt het WM_UPDATEUISTATE bericht naar de vensters in de vensterstructuur. Als een venster het WM_CHANGEUISTATE bericht niet doorgeeft, wordt het venster op het hoogste niveau niet bereikt en wordt de gebruikersinterfacestatus niet bijgewerkt.