Menu — informacje
Menu to lista elementów, które określają opcje lub grupy opcji (podmenu) dla aplikacji. Kliknięcie elementu menu otwiera podmenu lub powoduje wykonanie polecenia przez aplikację. Ta sekcja zawiera informacje na temat następujących tematów:
- paski menu i menu
- Menu Skrótów
- menu okna
- Identyfikator Pomocy
-
dostęp za pomocą klawiatury do menu
- Standardowy Interfejs Klawiaturowy
- Klawisze dostępu do menu
- Klawisze skrótów menu
-
Tworzenie menu
- Zasoby szablonu menu
- Szablon menu w pamięci
- Menu uchwyty
- funkcje tworzenia menu
- Wyświetlanie menu
- menu klas okien
- Elementy menu
- Elementy poleceń i elementy, które otwierają submenu
- Menu-Item identyfikator
- Menu-Item położenie
- uzyskiwanie dostępu do elementów menu programowo
- domyślne elementy menu
- Wybrane i przejrzyste elementy menu
- włączone, szare i wyłączone elementy menu
- Wyróżnione elementy menu
- Elementy menu Owner-Drawn
- separatory elementów menu i podziały wierszy
- Komunikaty używane w menu
- niszczenie menu
Bary menu i menu
Menu jest rozmieszczane w hierarchii. Na najwyższym poziomie hierarchii znajduje się pasek menu ; zawiera listę menu , które z kolei mogą zawierać podmenu. Pasek menu jest czasami nazywany menu najwyższego poziomu, a menu i podmenu są również znane jako menu wyskakujące .
Element menu może wykonać polecenie lub otworzyć podmenu. Element, który wykonuje polecenie, jest nazywany elementem polecenia lub poleceniem .
Element na pasku menu prawie zawsze otwiera menu. Paski menu rzadko zawierają elementy poleceń. Menu otwierane z górnego paska rozwija się z niego i czasami nazywane jest menu rozwijanym. Po wyświetleniu menu rozwijanego jest on dołączony do paska menu. Element menu na pasku menu, który otwiera menu rozwijane, jest również nazywany nazwą menu .
Nazwy menu na pasku menu reprezentują główne kategorie poleceń zapewnianych przez aplikację. Wybranie nazwy menu na pasku menu zwykle otwiera menu, którego elementy menu odpowiadają poleceniam w kategorii. Na przykład pasek menu może zawierać nazwę menu Plik, która po kliknięciu przez użytkownika aktywuje menu z opcjami menu, takimi jak Nowy, Otwórzi Zapisz. Aby uzyskać informacje o pasku menu, wywołaj GetMenuBarInfo.
Tylko nakładające się lub wyskakujące okno może zawierać pasek menu; okno podrzędne nie może go zawierać. Jeśli okno ma pasek tytułu, system umieszcza pasek menu tuż pod nim. Pasek menu jest zawsze widoczny. Podmenu nie jest jednak widoczny, dopóki użytkownik nie wybierze elementu menu, który go aktywuje. Aby uzyskać więcej informacji o nakładających się oknach i oknach podręcznych, zobacz Typy okien.
Każde menu musi mieć okno właściciela. System wysyła komunikaty do okna właściciela menu, gdy użytkownik wybierze menu lub wybierze element z menu.
W tej sekcji omówiono następujące tematy.
Menu skrótów
System udostępnia również menu skrótów . Menu skrótów nie jest dołączone do paska menu; może pojawić się w dowolnym miejscu na ekranie. Aplikacja zazwyczaj kojarzy menu skrótów z częścią okna, taką jak obszar klienta lub z określonym obiektem, takim jak ikona. Z tego powodu te menu są również nazywane menu kontekstowymi.
Menu skrótów pozostaje ukryte do momentu aktywowania go przez użytkownika, zazwyczaj przez kliknięcie prawym przyciskiem myszy zaznaczenia, paska narzędzi lub przycisku paska zadań. Menu jest zwykle wyświetlane na pozycji karetki lub kursora myszy.
Menu okna
Menu okna (znane również jako menu systemu lub menu sterowania ) to menu podręczne zdefiniowane i zarządzane niemal wyłącznie przez system operacyjny. Użytkownik może otworzyć menu okna, klikając ikonę aplikacji na pasku tytułu lub klikając prawym przyciskiem myszy w dowolnym miejscu na pasku tytułu.
Menu okna zawiera standardowy zestaw elementów menu, które użytkownik może wybrać, aby zmienić rozmiar lub położenie okna albo zamknąć aplikację. Elementy w menu okna można dodawać, usuwać i modyfikować, ale większość aplikacji używa tylko standardowego zestawu elementów menu. Nakładające się, wyskakujące lub podrzędne okna mogą mieć menu okna. Rzadko zdarza się, że nakładające się lub wyskakujące okno nie zawiera menu okna.
Gdy użytkownik wybierze polecenie z menu okna, system wysyła komunikat WM_SYSCOMMAND do okna właściciela menu. W większości aplikacji procedura okna nie przetwarza komunikatów z menu okna. Zamiast tego po prostu przekazuje komunikaty do funkcji DefWindowProc na potrzeby domyślnego przetwarzania komunikatu przez system. Jeśli aplikacja dodaje polecenie do menu okna, procedura okna musi przetworzyć polecenie.
Aplikacja może użyć funkcji GetSystemMenu, aby utworzyć kopię domyślnego menu okna w celu zmodyfikowania. Każde okno, które nie używa funkcji GetSystemMenu do tworzenia własnej kopii menu okna, otrzymuje standardowe menu okna.
Identyfikator pomocy
Skojarzony z każdym paskiem menu, menu, podmenu i menu skrótów jest identyfikator pomocy. Jeśli użytkownik naciśnie F1, gdy menu jest aktywne, ta wartość jest wysyłana do okna właściciela w ramach komunikatu WM_HELP.
Dostęp za pomocą klawiatury do menu
System zapewnia standardowy interfejs klawiatury dla menu. Ten interfejs można ulepszyć, udostępniając klucze mnemoniczne i klawisze skrótów (przyspieszające) dla elementów menu.
W poniższych tematach opisano standardowy interfejs klawiatury, klawiszy dostępu i skrótów klawiszowych.
- Standardowy Interfejs Klawiaturowy
- Menu Klawisze dostępu
- Skróty klawiszowe menu
Standardowy interfejs klawiatury
System jest przeznaczony do pracy z myszą, bez myszy lub z innym urządzeniem wskazującym. Ponieważ system zapewnia standardowy interfejs klawiatury, użytkownik może użyć klawiatury do wybrania elementów menu. Ten interfejs klawiatury nie wymaga specjalnego kodu. Aplikacja otrzymuje komunikat polecenia, czy użytkownik wybiera element menu za pomocą klawiatury, czy za pomocą myszy. Standardowy interfejs klawiatury przetwarza następujące naciśnięcia.
Naciśnięcie | Akcja |
---|---|
Znak alfabetyczny | Wybiera pierwszy element menu z określonym znakiem jako jego klucz dostępu. Jeśli wybrany element wywołuje menu, zostanie wyświetlone menu, a pierwszy element zostanie wyróżniony. W przeciwnym razie zostanie wybrany element menu. |
ALT | Przełącza tryb paska menu i wyłącza go. |
ALT+SPACJA | Wyświetla menu okna. |
WEJŚĆ | Aktywuje menu i wybiera pierwszy element menu, jeśli element ma skojarzone z nim menu. W przeciwnym razie naciśnięcie wybiera element tak, jakby użytkownik zwolnił przycisk myszy podczas wybierania elementu. |
ESC | Zamyka tryb menu. |
STRZAŁKA W LEWO | Przechodzi do poprzedniego elementu menu najwyższego poziomu. Elementy menu najwyższego poziomu obejmują nazwy menu i menu okna. Jeśli wybrany element znajduje się w menu, wybrana jest poprzednia kolumna w menu lub zaznaczono poprzedni element menu najwyższego poziomu. |
STRZAŁKA W PRAWO | Działa jak STRZAŁKA W LEWO, z wyjątkiem odwrotnego kierunku. W menu to naciśnięcie przesuwa się do przodu o jedną kolumnę; gdy aktualnie zaznaczony element znajduje się w prawej kolumnie, zostanie wybrane następne menu. |
STRZAŁKI W GÓRĘ LUB W DÓŁ | Menu jest aktywowane po naciśnięciu jego nazwy. Po naciśnięciu klawisza STRZAŁKA W GÓRĘ w menu wybierany jest poprzedni element, a klawisza STRZAŁKA W DÓŁ wybierany jest następny element. |
Menu Klucze dostępu
Standardowy interfejs klawiatury dla menu można ulepszyć, dodając klawisze dostępu (mnemoniki) do elementów menu. Klucz dostępu to podkreślona litera w tekście elementu menu. Gdy menu jest aktywne, użytkownik może wybrać element menu, naciskając klawisz odpowiadający podkreślonej literze elementu. Użytkownik uaktywnia pasek menu, naciskając ALT, aby wyróżnić pierwszy element na pasku menu. Po wyświetleniu menu jest aktywne.
Aby utworzyć klucz dostępu dla elementu menu, umieść znak ampersand przed dowolnym znakiem w tekście elementu. Na przykład ciąg tekstowy "&Move" powoduje, że system podkreśla literę "M".
Klawisze skrótów menu
Oprócz posiadania klucza dostępu, element menu może mieć przypisany skrót. Klucz skrótu różni się od klucza dostępu, ponieważ menu nie musi być aktywne, aby klucz skrótu działał. Ponadto klucz dostępu jest zawsze skojarzony z elementem menu, podczas gdy skrót klawiszowy jest zwykle (ale nie musi być) skojarzony z elementem menu.
Tekst identyfikujący skrót jest dodawany do napisu tekstowego elementu menu. Tekst skrótu pojawia się po prawej stronie nazwy elementu menu, po znaku ukośnika odwrotnego i tabulacji (\t). Na przykład "&Close\tAlt+F4" reprezentuje polecenie Close z kombinacją ALT+F4 jako skrótu i literą "C" jako jego kluczem dostępu. Aby uzyskać więcej informacji, zobacz Akceleratory klawiaturowe.
Tworzenie menu
Menu można utworzyć przy użyciu szablonu menu lub funkcji tworzenia menu. Szablony menu są zwykle definiowane jako zasoby. Zasoby szablonu menu można załadować jawnie lub przypisać jako menu domyślne dla klasy okna. Możesz również dynamicznie tworzyć zasoby szablonu menu w pamięci.
W poniższych tematach szczegółowo opisano tworzenie menu:
- Zasoby szablonu menu
- Szablon menu w pamięci
- Menu dojścia
- funkcje tworzenia menu
- Wyświetlanie menu
- menu klas okien
Zasoby szablonów Menu
Większość aplikacji tworzy menu przy użyciu zasobów menu-template. Szablon menu definiuje menu, w tym elementy na pasku menu i wszystkie menu. Aby uzyskać informacje na temat tworzenia zasobu szablonu menu, zapoznaj się z dokumentacją zawartą w narzędziach programistycznych.
Po utworzeniu zasobu szablonu menu i dodaniu go do pliku wykonywalnego aplikacji (.exe) możesz użyć funkcji LoadMenu, aby załadować zasób do pamięci. Ta funkcja zwraca uchwyt do menu, który można przypisać do okna, używając funkcji SetMenu. Można przypisać menu do dowolnego okna, które nie jest oknem podrzędnym.
Implementowanie menu jako zasobów ułatwia lokalizowanie aplikacji w wielu krajach/regionach. Tylko plik definicji zasobów musi być zlokalizowany dla każdego języka, a nie kodu źródłowego aplikacji.
Szablon menu w pamięci
Menu można utworzyć na podstawie szablonu menu wbudowanego w pamięć w czasie wykonywania. Na przykład aplikacja, która umożliwia użytkownikowi dostosowanie menu, może utworzyć szablon menu w pamięci na podstawie preferencji użytkownika. Aplikacja może następnie zapisać szablon w pliku lub w rejestrze do użycia w przyszłości. Aby utworzyć menu na podstawie szablonu w pamięci, użyj funkcji LoadMenuIndirect. Aby uzyskać opisy formatów szablonów menu, zobacz Menu Template Resources.
Standardowy szablon menu składa się ze struktury MENUITEMTEMPLATEHEADER, po której następuje co najmniej jedna struktura MENUITEMTEMPLATE.
Szablon menu rozszerzonego składa się z struktury MENUEX_TEMPLATE_HEADER, po której następuje co najmniej jedna struktura MENUEX_TEMPLATE_ITEM.
Uchwyty menu
System generuje unikatowy uchwyt dla każdego menu. Uchwyt menu jest wartością typu HMENU. Aplikacja musi określić uchwyt menu w wielu funkcjach menu. Tworząc menu lub ładując zasób menu, otrzymujesz uchwyt do paska menu.
Aby pobrać uchwyt do paska menu dla menu, które zostało utworzone lub załadowane, użyj funkcji GetMenu. Aby pobrać uchwyt do podmenu skojarzonego z elementem menu, użyj funkcji GetSubMenu lub GetMenuItemInfo. Aby pobrać uchwyt do menu okna, użyj funkcji GetSystemMenu.
Funkcje tworzenia menu
Za pomocą funkcji tworzenia menu można tworzyć menu w czasie wykonywania lub dodawać elementy menu do istniejących menu. Możesz użyć funkcji CreateMenu, aby utworzyć pusty pasek menu oraz funkcję CreatePopupMenu, aby utworzyć puste menu. Można zapisać niektóre informacje o ustawieniach dla menu, używając struktury MENUINFO. Aby pobrać lub odczytać ustawienia menu, użyj GetMenuInfo lub SetMenuInfo. Aby dodać elementy do menu, użyj funkcji InsertMenuItem. Starsze funkcje AppendMenu i InsertMenu są nadal obsługiwane, ale InsertMenuItem powinny być używane dla nowych aplikacji.
Wyświetlanie menu
Po załadowaniu lub utworzeniu menu należy go przypisać do okna, zanim system będzie mógł go wyświetlić. Menu można przypisać, definiując menu klasy. Aby uzyskać więcej informacji, zobacz Menu klasy okna. Można również przypisać menu do okna, określając uchwyt do menu jako parametr hMenu funkcji CreateWindow lub CreateWindowEx, albo wywołując funkcję SetMenu.
Aby wyświetlić menu skrótów, użyj funkcji TrackPopupMenuEx. Menu skrótów, nazywane również przestawnymi menu podręcznymi lub menu kontekstowymi, są zwykle wyświetlane po przetworzeniu komunikatu WM_CONTEXTMENU.
Można przypisać menu do dowolnego okna, które nie jest oknem podrzędnym.
Starsza funkcja TrackPopupMenu jest nadal obsługiwana, ale nowe aplikacje powinny używać funkcji TrackPopupMenuEx.
Menu klasy okien
Możesz określić menu domyślne o nazwie menu klasy , podczas rejestrowania klasy okna. W tym celu należy przypisać nazwę zasobu szablonu menu do lpszMenuName składowej WNDCLASS struktury używanej do rejestrowania klasy.
Domyślnie każde okno ma przypisane menu klasy dla swojej klasy, więc nie trzeba jawnie ładować menu i przypisywać je do każdego okna. Menu klas można zastąpić, podając inny uchwyt menu podczas wywoływania funkcji CreateWindowEx. Możesz również zmienić menu okna po jego utworzeniu przy użyciu funkcji SetMenu. Aby uzyskać więcej informacji, zobacz Klasy okien.
Elementy menu
W poniższych tematach omówiono działanie systemu podczas wybierania elementu menu przez użytkownika oraz sposoby kontrolowania wyglądu i funkcjonalności elementu przez aplikację:
- Elementy Poleceń i Elementy, które otwierają Submenu
- Menu-Item identyfikator
- Menu-Item położenie
- uzyskiwanie dostępu do elementów menu programowo
- domyślne elementy menu
- Zaznaczone i Wyraźne Elementy Menu
- Włączone, wyszarzone i wyłączone elementy menu
- Wyróżnione elementy menu
- Elementy menu Owner-Drawn
- separatory elementów menu i podziały wierszy
Elementy poleceń i elementy, które otwierają podmenu
Gdy użytkownik wybierze element polecenia, system wysyła komunikat polecenia do okna, które jest właścicielem menu. Jeśli element polecenia znajduje się w menu okna, system wysyła komunikat WM_SYSCOMMAND. W przeciwnym razie wysyła komunikat WM_COMMAND.
Każdy element menu, który otwiera podmenu, jest skojarzony z uchwytem do odpowiedniego podmenu. Gdy użytkownik wskazuje taki element, system otworzy podmenu. Do okna właściciela nie jest wysyłany żaden komunikat polecenia. Jednak system wysyła komunikat WM_INITMENUPOPUP do okna właściciela przed wyświetleniem podmenu. Dojście do podmenu skojarzonego z elementem można uzyskać przy użyciu funkcji GetSubMenu lub GetMenuItemInfo.
Pasek menu zazwyczaj zawiera nazwy menu, ale może również zawierać elementy poleceń. Podmenu zazwyczaj zawiera elementy poleceń, ale może również zawierać elementy, które otwierają zagnieżdżone podmenu. Dodając takie elementy do podmenu, można zagnieżdżać menu do dowolnej głębokości. Aby zapewnić użytkownikowi wizualną wskazówkę, system automatycznie wyświetla małą strzałkę po prawej stronie tekstu elementu menu, który otwiera podmenu.
Identyfikator Menu-Item
Z każdym elementem menu wiąże się unikatowa liczba całkowita zdefiniowana przez aplikację, nazywana identyfikatorem elementu menu . Gdy użytkownik wybierze element polecenia z menu, system wysyła identyfikator elementu do okna właściciela w ramach komunikatu WM_COMMAND. Procedura okna sprawdza identyfikator w celu określenia źródła komunikatu i odpowiednio przetwarza komunikat. Ponadto można określić element menu przy użyciu jego identyfikatora podczas wywoływania funkcji menu; na przykład aby włączyć lub wyłączyć element menu.
Elementy menu, które otwierają podmenu, mają identyfikatory tak samo jak elementy poleceń. Jednak system nie wysyła komunikatu polecenia, gdy taki element jest wybierany z menu. Zamiast tego system otwiera podmenu skojarzony z elementem menu.
Aby pobrać identyfikator elementu menu w określonej pozycji, użyj funkcji GetMenuItemID lub GetMenuItemInfo.
Menu-Item Położenie
Oprócz unikatowego identyfikatora, każdy element na pasku menu lub w menu ma unikatową wartość pozycji. Lewy element na pasku menu lub górny element w menu ma pozycję zero. Wartość pozycji jest zwiększana dla kolejnych elementów menu. System przypisuje wartość pozycji do wszystkich elementów w menu, w tym separatorów. Na poniższej ilustracji przedstawiono wartości pozycji elementów na pasku menu i w menu.
Podczas wywoływania funkcji menu, która modyfikuje lub pobiera informacje o określonym elemencie menu, możesz określić element przy użyciu jego identyfikatora lub jego położenia. Aby uzyskać więcej informacji, zobacz następną sekcję.
Programowe uzyskiwanie dostępu do elementów menu
Większość funkcji menu umożliwia określenie elementu menu według pozycji lub polecenia. Niektóre funkcje używają flag MF_BYPOSITION i MF_BYCOMMAND do wskazywania algorytmu wyszukiwania; inne mają jawny parametr fByPosition. Jeśli określisz element menu według pozycji, numer elementu jest indeksem zerowym w menu. Jeśli określisz element menu za pomocą polecenia, menu i jego podmenu zostanie wyszukany element, którego identyfikator menu jest równy podanemu numerowi elementu. Jeśli więcej niż jeden element w hierarchii menu jest zgodny z numerem elementu, nie jest określony, który z nich jest używany. Jeśli menu zawierają zduplikowane identyfikatory menu, należy użyć operacji menu opartych na pozycji, aby uniknąć tej niejednoznaczności.
Domyślne elementy menu
Podmenu może zawierać jeden domyślny element menu. Gdy użytkownik otworzy podmenu, klikając dwukrotnie, system wysyła komunikat polecenia do okna właściciela menu i zamyka menu tak, jakby został wybrany domyślny element polecenia. Jeśli nie ma domyślnego elementu polecenia, podmenu pozostaje otwarte. Aby pobrać i ustawić element domyślny dla podmenu, użyj funkcji GetMenuDefaultItem i SetMenuDefaultItem.
Zaznaczone i wyczyść elementy menu
Element menu można wybrać lub wyczyścić. System wyświetla mapę bitową obok wybranych elementów menu, aby wskazać ich wybrany stan. System nie wyświetla mapy bitowej obok wyczyszczenia elementów, chyba że określono mapę bitową zdefiniowaną przez aplikację. Można wybrać tylko elementy menu w menu; nie można wybrać elementów na pasku menu.
Aplikacje zazwyczaj sprawdzają lub odznaczają element menu, aby wskazać, czy opcja jest aktywna. Załóżmy na przykład, że aplikacja ma pasek narzędzi, który użytkownik może pokazać lub ukryć, używając polecenia Toolbar w menu. Gdy pasek narzędzi jest ukryty, element menu Toolbar jest widoczny. Gdy użytkownik wybierze polecenie, aplikacja sprawdza element menu i wyświetla pasek narzędzi.
Atrybut znacznika wyboru kontroluje, czy element menu jest zaznaczony. Można ustawić znacznik zaznaczenia elementu menu za pomocą funkcji CheckMenuItem. Możesz użyć funkcji GetMenuState, aby określić, czy pozycja menu jest obecnie zaznaczona, czy odznaczona.
Zamiast CheckMenuItem i GetMenuStatemożna użyć GetMenuItemInfo i funkcji SetMenuItemInfo w celu pobrania i ustawienia stanu sprawdzania elementu menu.
Czasami grupa elementów menu odpowiada zestawowi wzajemnie wykluczających się opcji. W takim przypadku można wskazać wybraną opcję przy użyciu wybranego elementu menu radiowego (analogicznie do kontrolki przycisku radiowego). Wybrane elementy radiowe są wyświetlane z mapą bitową punktorów zamiast mapy bitowej znacznika wyboru. Aby sprawdzić element menu i ustawić go jako element radiowy, użyj funkcji CheckMenuRadioItem.
Domyślnie system wyświetla znacznik wyboru lub punktorową mapę bitową obok zaznaczonych elementów menu i bez mapy bitowej obok wyczyszczonego elementu menu. Można jednak użyć funkcji SetMenuItemBitmaps, aby skojarzyć zaznaczone i wyczyszczone mapy bitowe zdefiniowane przez aplikację z elementem menu. Następnie system używa określonych map bitowych do wskazania wybranego lub wyczyszczonego stanu elementu menu.
Mapy bitowe zdefiniowane przez aplikację skojarzone z elementem menu muszą mieć taki sam rozmiar jak domyślna mapa bitowa znacznika wyboru, z których wymiary mogą się różnić w zależności od rozdzielczości ekranu. Aby pobrać prawidłowe wymiary, użyj funkcji GetSystemMetrics. Można utworzyć wiele zasobów mapy bitowej dla różnych rozdzielczości ekranu; utwórz jeden zasób mapy bitowej i w razie potrzeby przeprowadź skalowanie go; lub utwórz mapę bitową w czasie wykonywania i narysuj w nim obraz. Mapy bitowe mogą być monochromatyczne lub kolorowe. Jednak ponieważ elementy menu są odwrócone po podkreśleniu, wygląd niektórych odwróconych kolorowych map bitowych może być niepożądany. Aby uzyskać więcej informacji, zobacz Mapy bitowe.
Włączone, szare i wyłączone elementy menu
Element menu może być włączony, szary lub wyłączony. Domyślnie element menu jest włączony. Gdy użytkownik wybierze włączony element menu, system wysyła komunikat polecenia do okna właściciela lub wyświetla odpowiedni podmenu, w zależności od rodzaju elementu menu.
Gdy elementy menu nie są dostępne dla użytkownika, powinny być szare lub wyłączone. Nie można wybrać szarych i wyłączonych elementów menu. Wyłączony element wygląda podobnie jak włączony element. Gdy użytkownik kliknie wyłączony element, element nie zostanie wybrany i nic się nie stanie. Wyłączone elementy mogą być przydatne na przykład w samouczku, który przedstawia menu, które wygląda aktywne, ale nie jest.
Aplikacja szara niedostępny element menu, aby udostępnić użytkownikowi sygnał wizualny, że polecenie jest niedostępne. Można użyć wyszarzonego elementu, gdy akcja nie jest odpowiednia (na przykład można wyszarzyć polecenie Drukuj w menu Plik, gdy system nie ma zainstalowanej drukarki).
Funkcja EnableMenuItem włącza, dezaktywuje lub wyłącza element menu. Aby określić, czy element menu jest włączony, szary lub wyłączony, użyj funkcji GetMenuItemInfo.
Zamiast GetMenuItemInfomożna również użyć funkcji GetMenuState, aby określić, czy element menu jest włączony, szary lub wyłączony.
Wyróżnione elementy menu
System automatycznie wyróżnia elementy menu w menu, gdy użytkownik je wybiera. Jednak wyróżnianie można jawnie dodać lub usunąć z nazwy menu na pasku menu przy użyciu funkcji HiliteMenuItem. Ta funkcja nie ma wpływu na elementy menu w menu. Gdy hiliteMenuItem jest używana do wyróżniania nazwy menu, jednak nazwa jest wyświetlana tylko do wybrania. Jeśli użytkownik naciśnie ENTER, wyróżniony element nie zostanie wybrany. Ta funkcja może być przydatna na przykład w aplikacji szkoleniowej, która demonstruje korzystanie z menu.
Elementy menu Owner-Drawn
Aplikacja może całkowicie kontrolować wygląd elementu menu przy użyciu elementu rysowanego przez właściciela. Elementy rysowane przez właściciela wymagają, aby aplikacja ponosiła całkowitą odpowiedzialność za wybrany rysunek (wyróżniony), zaznaczony i wyczyszczone stany. Jeśli na przykład aplikacja podała menu czcionek, może narysować każdy element menu przy użyciu odpowiedniej czcionki; przedmiot dla Romana zostanie narysowany z romanem, przedmiot kursywy zostanie narysowany kursywą itd. Aby uzyskać więcej informacji, zobacz Tworzenie elementów menu Owner-Drawn.
Separatory elementów menu i podziały wierszy
System udostępnia specjalny typ elementu menu, nazywany separatorem , który jest wyświetlany jako linia pozioma. Separator umożliwia podzielenie menu na grupy powiązanych elementów. Nie można użyć separatora na pasku menu, a użytkownik nie może wybrać separatora.
Gdy pasek menu zawiera więcej nazw menu niż będzie pasował w jednym wierszu, system opakowuje pasek menu, automatycznie dzieląc go na co najmniej dwa wiersze. Możesz spowodować podział wiersza na określonym elemencie paska menu, przypisując do elementu flagę typu MFT_MENUBREAK. System umieszcza ten element i wszystkie kolejne elementy w nowym wierszu.
Gdy menu zawiera więcej elementów niż zmieści się w jednej kolumnie, menu zostanie obcięte. Możesz spowodować, że przerwa w kolumnie wystąpi przy określonym elemencie menu, przypisując elementowi flagę typu MFT_MENUBREAK lub używając opcji MENUBREAK w instrukcji MENUITEM. System umieszcza ten element i wszystkie kolejne elementy w nowej kolumnie. Flaga typu MFT_MENUBARBREAK ma taki sam efekt, z tą różnicą, że linia pionowa pojawia się między nową kolumną a starym.
Jeśli używasz funkcji AppendMenu, InsertMenulub ModifyMenu do przypisywania podziałów wierszy, należy przypisać flagi typów MF_MENUBREAK lub MF_MENUBARBREAK.
Komunikaty używane z menu
System raportuje działanie związane z menu, wysyłając komunikaty do procedury okna, które jest właścicielem menu. System wysyła serię komunikatów, gdy użytkownik wybiera elementy na pasku menu lub klika prawym przyciskiem myszy, aby wyświetlić menu skrótów.
Gdy użytkownik aktywuje element na pasku menu, okno właściciela najpierw otrzymuje komunikat WM_SYSCOMMAND. Ten komunikat zawiera flagę wskazującą, czy użytkownik aktywował menu przy użyciu klawiatury (SC_KEYMENU) czy myszy (SC_MOUSEMENU). Aby uzyskać więcej informacji, zobacz Dostęp za pomocą klawiatury do menu.
Następnie przed wyświetleniem jakichkolwiek menu system wysyła komunikat WM_INITMENU do procedury okna, aby aplikacja mogła zmodyfikować menu przed wyświetleniem ich przez użytkownika. System wysyła komunikat WM_INITMENU tylko raz na aktywację menu.
Gdy użytkownik wskazuje element menu, który otwiera podmenu, system wysyła do okna właściciela komunikat WM_INITMENUPOPUP, przed wyświetleniem podmenu. Ten komunikat daje aplikacji możliwość zmodyfikowania podmenu przed jego wyświetleniem.
Za każdym razem, gdy użytkownik przenosi wyróżnianie z jednego elementu do innego, system wysyła komunikat WM_MENUSELECT do procedury okna właściciela menu. Ten komunikat identyfikuje aktualnie wybrany element menu. Wiele aplikacji udostępnia obszar informacji w dolnej części okna głównego i użyj tego komunikatu, aby wyświetlić dodatkowe informacje o wybranym elemencie menu.
Gdy użytkownik wybierze element polecenia z menu, system wysyła komunikat WM_COMMAND do procedury okna. Niższy wyraz parametru wParam komunikatu WM_COMMAND zawiera identyfikator wybranego elementu. Procedura okna powinna odpowiednio zbadać identyfikator i przetworzyć komunikat.
Informacje o menu można zapisać przy użyciu strukturyMENUINFO. Jeśli menu jest zdefiniowane za pomocą MENUINFO.dwStyle wartość MNS_NOTIFYBYPOS system wysyła WM_MENUCOMMAND zamiast WM_COMMAND po wybraniu elementu. Dzięki temu można uzyskać dostęp do informacji w strukturze MENUINFO, a także bezpośrednio udostępnia indeks wybranego elementu.
Nie wszystkie menu są dostępne za pośrednictwem paska menu okna. Wiele aplikacji wyświetla menu skrótów, gdy użytkownik kliknie prawym przyciskiem myszy w określonej lokalizacji. Takie aplikacje powinny przetwarzać komunikat WM_CONTEXTMENU i wyświetlać menu skrótów, jeśli jest to konieczne. Jeśli aplikacja nie wyświetla menu skrótów, powinna przekazać komunikat WM_CONTEXTMENU do funkcji DefWindowProc na potrzeby przetwarzania domyślnego.
Komunikat WM_MENURBUTTONUP jest wysyłany, gdy użytkownik zwolni prawy przycisk myszy, gdy kursor znajduje się w elemencie menu. Ten komunikat jest dostarczany, aby aplikacje mogły wyświetlać menu kontekstowe lub menu skrótów dla elementu menu.
Istnieje kilka komunikatów, które obejmują tylko menu przeciągania i upuszczania. WM_MENUGETOBJECT jest wysyłany do właściciela menu opartego na metodzie przeciągnij i upuść, gdy kursor myszy przechodzi do elementu menu lub przenosi się ze środka do góry lub do dołu elementu. Komunikat WM_MENUDRAG jest wysyłany, gdy użytkownik faktycznie przeciąga element menu.
Gdy menu rozwijane lub podmenu zostało zniszczone, system wysyła komunikat WM_UNINITMENUPOPUP.
Niszczenie menu
Jeśli menu zostanie przypisane do okna i okno to zostanie zamknięte, system automatycznie usunie menu i jego podmenu, zwalniając uchwyt menu oraz pamięć zajmowaną przez menu. System nie niszczy automatycznie menu, które nie jest przypisane do okna. Aplikacja musi zniszczyć nieprzypisane menu, wywołując funkcję DestroyMenu. W przeciwnym razie menu nadal istnieje w pamięci nawet po zamknięciu aplikacji. Aby zakończyć aktywne menu wątku wywołującego, użyj EndMenu. Jeśli platforma nie obsługuje EndMenu, wyślij właścicielowi aktywnego menu komunikat WM_CANCELMODE.