Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Akceleratory są ściśle powiązane z menu — obie zapewniają użytkownikowi dostęp do zestawu poleceń aplikacji. Zazwyczaj użytkownicy korzystają z menu aplikacji, by nauczyć się zestawu poleceń, a następnie przełączają się na używanie akceleratorów, gdy stają się bardziej biegli w obsłudze aplikacji. Akceleratory zapewniają szybszy, bardziej bezpośredni dostęp do poleceń niż menu. Co najmniej aplikacja powinna dostarczać akceleratory dla najczęściej używanych poleceń. Mimo że akceleratory zwykle generują polecenia, które istnieją jako elementy menu, mogą również generować polecenia, które nie mają równoważnych elementów menu.
W tej sekcji omówiono następujące tematy.
- Tabele akceleratora
- tworzenie Accelerator-Table
- przypisania klawiszy akceleratora
- akceleratory i menu
- stan interfejsu użytkownika
Tabele akceleratora
Tabela akceleratora składa się z tablicy struktur ACCEL, z których każdy definiuje pojedynczy akcelerator. Każda struktura ACCEL zawiera następujące informacje:
- Kombinacja naciśnięć akceleratora.
- Identyfikator akceleratora.
- Różne flagi. Obejmuje to taki, który określa, czy system ma zapewnić wizualną informację zwrotną przez wyróżnienie odpowiedniego elementu menu, jeśli istnieje, gdy akcelerator jest używany.
Aby przetworzyć skróty klawiaturowe akceleratora dla określonego wątku, deweloper musi wywołać funkcję TranslateAccelerator w pętli wiadomości skojarzonej z kolejką wiadomości wątku. Funkcja TranslateAccelerator monitoruje wprowadzanie klawiatury do kolejki komunikatów, sprawdzając kombinacje pasujące do wpisu w tabeli akceleratora. Gdy TranslateAccelerator znajdzie dopasowanie, tłumaczy dane wejściowe klawiatury (czyli komunikaty WM_KEYUP i WM_KEYDOWN) na komunikat WM_COMMAND lub WM_SYSCOMMAND, a następnie wysyła komunikat do procedury okna określonego okna. Na poniższej ilustracji przedstawiono sposób przetwarzania akceleratorów.
Komunikat WM_COMMAND zawiera identyfikator akceleratora, który spowodował wygenerowanie komunikatu przez TranslateAccelerator. Procedura okna sprawdza identyfikator w celu określenia źródła komunikatu, a następnie odpowiednio przetwarza komunikat.
Tabele akceleratorów istnieją na dwóch poziomach. System obsługuje jedną tabelę akceleratora całego systemu, która ma zastosowanie do wszystkich aplikacji. Aplikacja nie może zmodyfikować tabeli akceleratora systemu. Aby uzyskać opis akceleratorów dostarczonych przez tablicę akceleratorów systemowych, patrz Przypisania naciśnięć akceleratora.
System również utrzymuje tabele przyspieszenia dla każdej aplikacji. Aplikacja może zdefiniować dowolną liczbę tabel akceleratora do użycia z własnymi oknami. Unikatowy 32-bitowy uchwyt (HACCEL) identyfikuje każdą tabelę. Jednak tylko jedna tabela akceleratora może być aktywna jednocześnie dla określonego wątku. Uchwyt do tabeli przyspieszenia przekazany do funkcji TranslateAccelerator określa, która tabela przyspieszenia jest aktywna dla wątku. Tabela aktywnego akceleratora może być zmieniona w dowolnym momencie poprzez przekazanie innego uchwytu tabeli akceleratora do TranslateAccelerator.
Accelerator-Table Tworzenie
Aby utworzyć tabelę akceleratora dla aplikacji, wymagane jest wykonanie kilku kroków. Najpierw kompilator zasobów służy do tworzenia zasobów tabeli akceleratora i dodawania ich do pliku wykonywalnego aplikacji. W czasie wykonywania funkcja LoadAccelerators służy do załadowania tabeli akceleratora do pamięci i pobrania uchwytu do tej tabeli. Ten uchwyt jest przekazywany do funkcji TranslateAccelerator w celu aktywowania tabeli przyspieszenia.
Tabelę akceleratora można również utworzyć dla aplikacji w czasie wykonywania, przekazując tablicę struktur ACCEL do funkcji CreateAcceleratorTable. Ta metoda obsługuje akceleratory zdefiniowane przez użytkownika w aplikacji. Podobnie jak funkcja LoadAccelerators, CreateAcceleratorTable zwraca uchwyt tabeli akceleratora, który można przekazać do TranslateAccelerator w celu aktywowania tabeli akceleratora.
System automatycznie niszczy tabele akceleratorów załadowane przez LoadAccelerators lub utworzone przez CreateAcceleratorTable. Jednak aplikacja może zwolnić zasoby, gdy jest uruchomiona, niszcząc tabele akceleratora, które nie są już potrzebne, wywołując funkcję DestroyAcceleratorTable.
Istniejącą tabelę akceleratora można skopiować i zmodyfikować. Istniejąca tabela akceleratora jest kopiowana przy użyciu funkcji CopyAcceleratorTable. Po zmodyfikowaniu kopii uchwyt do nowej tabeli akceleratora zostanie pobrany przez wywołanie metody CreateAcceleratorTable. Na koniec uchwyt jest przekazywany do TranslateAccelerator w celu aktywacji nowej tabeli.
Przypisania akceleratora
Kod znaku ASCII lub kod klucza wirtualnego może służyć do definiowania akceleratora. Kod znaku ASCII czyni akcelerator czułym na wielkość liter. W związku z tym użycie znaku ASCII "C" definiuje akcelerator jako ALT+C, a nie ALT+c. Jednak akceleratory rozróżniające wielkość liter mogą być mylące w użyciu. Na przykład akcelerator ALT+C zostanie wygenerowany, jeśli klucz CAPS LOCK nie działa lub jeśli SHIFT nie działa, ale nie, jeśli oba są wyłączone.
Zazwyczaj akceleratory nie muszą uwzględniać wielkości liter, więc większość aplikacji używa kodów wirtualnych klawiszy dla akceleratorów, a nie kodów znaków ASCII.
Należy unikać akceleratorów powodujących konflikt z mnemonikami menu aplikacji, ponieważ akcelerator zastępuje mnemoniki, co może mylić użytkownika. Aby uzyskać więcej informacji na temat mnemoników menu, zobacz Menu.
Jeśli aplikacja definiuje akcelerator, który jest również zdefiniowany w tabeli akceleratora systemu, akcelerator zdefiniowany przez aplikację zastępuje akcelerator systemu, ale tylko w kontekście aplikacji. Należy jednak unikać tej praktyki, ponieważ uniemożliwia akceleratorowi systemu wykonywanie standardowej roli w interfejsie użytkownika. Akceleratory dla całego systemu zostały opisane na poniższej liście:
Akcelerator | Opis |
---|---|
ALT+ESC | Przełącza się do następnej aplikacji. |
ALT+F4 | Zamyka aplikację lub okno. |
ALT +ŁĄCZNIK | Otwiera menu okna dla okna dokumentu. |
ALT+PRINT SCREEN | Kopiuje obraz w aktywnym oknie do schowka. |
ALT+SPACJA | Otwiera menu okna dla głównego okna aplikacji. |
ALT+TAB | Przełącza się do następnej aplikacji. |
CTRL+ESC | Przełącza się do menu Start. |
CTRL+F4 | Zamyka okno aktywnej grupy lub dokumentu. |
F1 | Uruchamia plik pomocy aplikacji, jeśli istnieje. |
EKRAN WYDRUKU | Kopiuje obraz z ekranu do schowka. |
SHIFT+ALT+TAB | Przełącza się do poprzedniej aplikacji. Użytkownik musi przytrzymać ALT+SHIFT, naciskając TAB. |
Akceleratory i menu
Użycie akceleratora jest takie samo jak wybranie elementu menu: Obie akcje powodują, że system wysyła WM_COMMAND lub WM_SYSCOMMAND komunikat do odpowiedniej procedury okna. Komunikat WM_COMMAND zawiera identyfikator, który procedura okna sprawdza w celu określenia źródła komunikatu. Jeśli akcelerator wygenerował komunikat WM_COMMAND, identyfikatorem jest akcelerator. Podobnie, jeśli element menu wygenerował komunikat WM_COMMAND, identyfikator jest identyfikatorem elementu menu. Ponieważ akcelerator udostępnia skrót do wybierania polecenia z menu, aplikacja zazwyczaj przypisuje ten sam identyfikator do akceleratora i odpowiadający mu element menu.
Aplikacja przetwarza komunikat akceleratora WM_COMMAND w dokładnie taki sam sposób, jak odpowiedni komunikat elementu menu WM_COMMAND. Jednak komunikat WM_COMMAND zawiera flagę określającą, czy komunikat pochodzi z akceleratora, czy elementu menu, w przypadku, gdy akceleratory muszą być przetwarzane inaczej niż odpowiednie elementy menu. Komunikat WM_SYSCOMMAND nie zawiera tej flagi.
Identyfikator określa, czy akcelerator generuje komunikat WM_COMMAND, czy WM_SYSCOMMAND. Jeśli identyfikator ma taką samą wartość jak element menu w menu System, akcelerator generuje komunikat WM_SYSCOMMAND. W przeciwnym razie akcelerator generuje komunikat WM_COMMAND.
Jeśli akcelerator ma ten sam identyfikator co element menu, a element menu jest szary lub wyłączony, akcelerator jest wyłączony i nie generuje komunikatu WM_COMMAND lub WM_SYSCOMMAND. Ponadto akcelerator nie generuje komunikatu polecenia, jeśli odpowiednie okno zostanie zminimalizowane.
Gdy użytkownik używa akceleratora odpowiadającego elementowi menu, procedura okna odbiera WM_INITMENU i WM_INITMENUPOPUP komunikaty, tak jakby użytkownik wybrał element menu. Aby uzyskać informacje na temat przetwarzania tych komunikatów, zobacz Menu.
Akcelerator odpowiadający elementowi menu powinien być uwzględniony w tekście elementu menu.
Stan interfejsu użytkownika
System Windows umożliwia aplikacjom ukrywanie lub pokazywanie różnych funkcji w interfejsie użytkownika. Te ustawienia są nazywane stanem interfejsu użytkownika. Stan interfejsu użytkownika obejmuje następujące ustawienia:
- wskaźniki koncentracji uwagi (takie jak prostokąty fokusu na przyciskach)
- akceleratory klawiatury (oznaczone podkreśleniem w etykietach kontrolek)
Okno może wysyłać komunikaty, aby zażądać zmiany stanu interfejsu użytkownika, może wykonywać zapytania dotyczące stanu interfejsu użytkownika lub wymuszać określony stan dla jego okien podrzędnych. Te komunikaty są następujące.
Komunikat | Opis |
---|---|
WM_CHANGEUISTATE | Wskazuje, że stan interfejsu użytkownika powinien ulec zmianie. |
WM_QUERYUISTATE | Pobiera stan interfejsu użytkownika dla okna. |
WM_UPDATEUISTATE | Zmienia stan interfejsu użytkownika. |
Domyślnie wszystkie okna podrzędne okna najwyższego poziomu są tworzone z tym samym stanem interfejsu użytkownika co okno nadrzędne.
System obsługuje stan interfejsu użytkownika dla kontrolek w oknach dialogowych. Podczas tworzenia okna dialogowego system inicjuje odpowiednio stan interfejsu użytkownika. Wszystkie kontrolki podrzędne dziedziczą ten stan. Po utworzeniu okna dialogowego system monitoruje naciśnięcia użytkownika. Jeśli ustawienia stanu interfejsu użytkownika są ukryte, a użytkownik przechodzi za pomocą klawiatury, system aktualizuje stan interfejsu użytkownika. Na przykład, jeśli użytkownik naciśnie klawisz Tab, aby przenieść fokus do następnej kontrolki, system wywołuje WM_CHANGEUISTATE, aby wskaźniki fokusu były widoczne. Jeśli użytkownik naciśnie klawisz Alt, system wywołuje WM_CHANGEUISTATE, aby akceleratory klawiatury były widoczne.
Jeśli kontrolka obsługuje nawigację między elementami interfejsu użytkownika, które zawiera, może zaktualizować swój własny stan interfejsu użytkownika. Kontrolka może wywołać WM_QUERYUISTATE, aby pobrać i zbuforować początkowy stan interfejsu użytkownika. Za każdym razem, gdy kontrolka odbiera komunikat WM_UPDATEUISTATE, może zaktualizować stan swojego interfejsu użytkownika i wysłać komunikat WM_CHANGEUISTATE do swojego elementu nadrzędnego. Każde okno będzie nadal wysyłać komunikat do elementu nadrzędnego, dopóki nie osiągnie okna najwyższego poziomu. Okno najwyższego poziomu wysyła komunikat WM_UPDATEUISTATE do okien w drzewie okien. Jeśli okno nie przekaże komunikatu WM_CHANGEUISTATE, nie osiągnie okna najwyższego poziomu, a stan interfejsu użytkownika nie zostanie zaktualizowany.