TN006: Komunikat mapy

Uwaga ta opisuje instrumentu mapę wiadomości MFC.

Problem

Microsoft Windows implementuje, jakie są zasadniczo wirtualnego funkcje klasy okien za pomocą jego wiadomości instrumentu. Ze względu na dużą liczbę wiadomości zaangażowanych zapewniające oddzielne funkcji wirtualnych dla każdej wiadomości Windows skutkuje zbyt dużych Tablica metod wirtualnych.

Ponadto ponieważ liczba zdefiniowanych w systemie Windows wiadomości zmienia się w czasie, a ponieważ określonej aplikacji może być zdefiniowanie niektórych komunikatów systemu Windows własnej, mechanizm wiadomości Mapa zapewnia poziom zadnie, uniemożliwiający zerwania istniejącego kodu interfejsu zmiany.

Przegląd

MFC stanowi alternatywę dla instrukcji switch używane w tradycyjnych programy systemu Windows do obsługi wiadomości wysłane do okna. Mapowanie wiadomości na funkcje składowe mogą zostać zdefiniowane tak, że kiedy wiadomość ma być obsługiwany przez okno, funkcja Członkowskich właściwe jest wywoływana automatycznie. Ten instrument wiadomości mapa jest zaprojektowany są podobne do funkcji wirtualnych, ale ma dodatkowe korzyści nie jest możliwe z wirtualnej funkcje C++.

Definiowanie mapy wiadomości

Makro DECLARE_MESSAGE_MAP deklaruje trzech członków dla klasy.

To makro powinny być umieszczane w deklaracji każda klasa mapom wiadomości. Umownie to na końcu deklaracji klasy. Na przykład:

klasa CMyW&nd: CMyParentWndClass publicznych
{
 nbsp;  / / Moje stuff...

chronione:
    //{{AFX_MSG(CMyWnd)
    afx_msg void OnPaint();
    //}}AFX_MSG

DECLARE_MESSAGE_MAP()
}

Jest to format generowanych przez AppWizard i ClassWizard podczas tworzenia nowych klas. / / {{I / /}} nawiasy są potrzebne dla ClassWizard.

Mapa wiadomości tabela jest zdefiniowana z zestawu makr, które rozszerzają wiadomości mapę wpisów. Tabeli zaczyna się od wywołania makra BEGIN_MESSAGE_MAP , który definiuje klasę, który jest obsługiwany przez tej mapy wiadomości i klasa nadrzędna, której nieobsługiwany wiadomości są przekazywane. Tabela kończy połączenie makra END_MESSAGE_MAP.

Między te wywołania dwóch makro jest wpis dla każdej wiadomości mają być przetwarzane przez tej mapy wiadomości. Każda wiadomość standardową systemu Windows zawiera makro formy ON_WM_xxx (gdzie xxx jest nazwą wiadomości), który generuje wpis dla tej wiadomości.

Podpis standardową funkcję został zdefiniowany rozpakowywania parametry każdej wiadomości systemu Windows i zapewnienie bezpieczeństwa typu. Te podpisy można znaleźć w pliku AFXWIN.H w deklaracji CWnd. Każdy z nich jest oznaczony przy użyciu słowa afx_msg dla łatwej identyfikacji.

Uwaga   ClassWizard wymaga użycia słowa kluczowego afx_msg w Twojej wiadomości mapę obsługi deklaracji.

Te podpisy funkcji zostały otrzymane, za pomocą prostego Konwencji. Nazwa funkcji rozpoczyna się zawsze z "On". Następuje to nazwa komunikatu systemu Windows z WM_ usunięte i tylko pierwszą literę każdego wyrazu wpisać wielkimi literami. Kolejność parametrów jest wParam przez LOWORD (fikcyjnymi) , a następnie HIWORD(fikcyjnymi). Niewykorzystane parametry nie są przekazywane. Uchwyty, które są pakowane według klas MFC są konwertowane na wskaźniki do odpowiednich obiektów MFC. Poniższy przykład ilustruje sposób obsługi wiadomości WM_PAINT i spowodować CMyWnd:: OnPaint wywołanie funkcji

BEGI&N_MESSAGE_MAP (CMyWnd, CMyParentWndClass)
 nbsp;  //{{AFX_MSG_MAP(CMyWnd)
    ON_WM_PAINT()
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

Tabela mapowania wiadomość musi być zdefiniowana poza zakres każdej definicji funkcji lub klasy. Nie powinny być wprowadzane w obrębie bloku "C" extern.

Uwaga   ClassWizard będzie edytować wpisy mapę komunikatów, które znajdują się między / / {{i / /}} komentarz nawias.

Windows wiadomości zdefiniowane przez użytkownika

Zdefiniowane przez użytkownika wiadomości mogą zostać włączone do mapy wiadomości za pomocą makra ON_MESSAGE . To makro akceptuje wiele wiadomości i funkcji składowej formularza:

nbsp;   / / wewnątrz deklaracji klasy
    afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);

&Na przykład:
    # define WM_MYMESSAGE (WM_USER + 100)

BEGIN_MESSAGE_MAP (CMyWnd, CMyParentWndClass)
    ON_MESSAGE (WM_MYMESSAGE, OnMyMessage)
END_MESSAGE_MAP()

W tym przykładzie mamy ustalenia obsługi dla niestandardowego komunikatu identyfikatorem wiadomości Windows pochodzące od standardowego WM_USER podstawy dla wiadomości zdefiniowane przez użytkownika. Ta obsługa z kodem może wywołać takie jak:

CWnd * pWnd =...;
pWnd BT;SendMessage(WM_MYMESSA&GE)

Zakres wiadomości zdefiniowane przez użytkownika za pomocą podejście to musi być w zakresie od WM_USER do 0x7fff.

Uwaganbsp;  ClassWizard nie obsługuje wprowadzanie procedur obsługi O&N_MESSAGE z ClassWizard interfejs użytkownika: należy je ręcznie wprowadzić od Edytora Visual C++. Po wpisaniu, ClassWizard będzie analizować te zapisy i pozwala przeglądać je podobnie jak inne wpisy wiadomości Mapa.

Zarejestrowanych komunikatów systemu Windows

:: RegisterWindowMessage funkcja jest używana do określenia nowego komunikatu w oknie, który jest gwarantowane jest unikatowy całego systemu. Makro ON_REGISTERED_MESSAGE jest używany do obsługi tych wiadomości. To makro przyjmuje nazwę blisko zmienna UINT, która zawiera okna zarejestrowane wiadomości identyfikatora. Na przykład

klasa CMyWnd: CMyParentWndClass publicznych
{
publiczne:
 nbsp;  CMyWnd();

//{{AFX_MSG(CMyWnd)
    afx_msg LRESULT OnFind(WPARAM wParam, LPARAM lParam);
    //}}AFX_MSG

DECLARE_MESSAGE_MAP()
};

statyczne UI&NT NIEDALEKO WM_FIND = RegisterWindowMessage("COMMDLG_FIND");

BEGIN_MESSAGE_MAP (CMyWnd, CMyParentWndClass)
    //{{AFX_MSG_MAP(CMyWnd)
    ON_REGISTERED_MESSAGE (WM_FIND, OnFind)
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

Zarejestrowanych zmiennej identyfikator wiadomości systemu Windows (WM_FIND w powyższym przykładzie) musi być blisko zmienna ze względu na sposób, w jaki ON_REGISTERED_MESSAGE jest zaimplementowana.

Zakres wiadomości zdefiniowane przez użytkownika za pomocą tego podejścia będą należeć do zakresu od 0xC000 do 0xFFFF.

Uwaganbsp;  ClassWizard nie obsługuje wprowadzanie procedur obsługi O&N_REGISTERED_MESSAGE z ClassWizard interfejsu użytkownika, należy je ręcznie wprowadzić z edytora tekstu. Po wpisaniu, ClassWizard będzie analizować te zapisy i pozwala przeglądać je podobnie jak inne wpisy wiadomości Mapa.

Komunikaty polecenia

Komunikaty polecenia z menu i skróty są obsługiwane w mapach wiadomości z makra ON_COMMAND . To makro akceptuje identyfikator polecenia, jak również funkcji składowej. Tylko określonej wiadomości WM_COMMAND z wParam równa określonego polecenia, którego identyfikator jest obsługiwane przez funkcję Państwa określonej we wpisie mapy wiadomości. Funkcje składowe obsługi polecenia żadnych parametrów i zwracać typ void. Makro ma postać:

 ON_COMMAND (identyfikator, memberFxn)

Polecenie aktualizacji wiadomości są routowane przez ten sam mechanizm jako ON_COMMAND obsługi. Makro ON_UPDATE_COMMAND_UI jest używany zamiast. Funkcje składowe obsługi polecenia aktualizacji korzystać z jednego parametru, wskaźnik do obiektu CCmdUI i zwracać typ void. Makro ma postać

ON_UPDATE_COMMAND_UI (identyfikator, memberFxn)

Rozszerzone formularz obsługi wiadomości polecenia jest dostępna do zaawansowanych zastosowań. Makro ON_COMMAND_EX jest używany zamiast i stanowi nadzbiór funkcji ON_COMMAND . Funkcje rozszerzone polecenie obsługi składowe korzystać z jednego parametru, UINT zawierający identyfikator polecenia i zwracają BOOL. Zwrot BOOL powinny być prawdziwy wskazują, iż polecenie zostały obsłużone, w przeciwnym razie routingu będzie nadal do innych obiektów docelowych polecenia.

Przykłady powyższych formularzy:

Również dostępne dla zaawansowanych użycie jest ON_COMMAND_RANGE i ON_COMMAND_RANGE_EX , które umożliwiają obsługę szereg poleceń z obsługi jednego polecenia. Zobacz więcej informacji można znaleźć w dokumentacji produktu na tych makr.

Uwaganbsp;  ClassWizard obsługuje tworzenie obsługi O&N_COMMAND i ON_UPDATE_COMMAND_UI , ale nie obsługuje tworzenia obsługi ON_COMMAND_EX lub ON_COMMAND_RANGE . Jednakże klasy Kreator będzie analizować i pozwala przeglądać wszystkie trzy polecenia obsługi warianty.

Komunikaty powiadamiające kontroli

Wiadomości, które są wysyłane z formantów podrzędnych do okna mają dodatkowe bity informacji w ich wiadomości mapę wejścia: identyfikator formantu. Obsługa wiadomości, określonych we wpisie mapy wiadomości nazywa się tylko wtedy, gdy (1 kod powiadomienia kontroli (wyższe słowo fikcyjnymi), takich jak BN_CLICKED, odpowiada kod powiadomienia, określonych we wpisie mapy wiadomości i (2) formantu ID (wParam) jest zgodny z Identyfikatorem kontroli określonych we wpisie mapy wiadomości.

Komunikaty powiadamiające formant niestandardowy może użyć makra ON_CONTROL do definiowania wpisie mapy wiadomości z kodu niestandardowego powiadomienia. To makro ma postać

ON_CONTROL (wNotificationCode, identyfikator memberFxn.)

Zaawansowane wykorzystanie ON_CONTROL_RANGE może służyć do obsługi powiadamiania określonego formantu z zakresu kontroli z samym obsługi.

ClassWizard nie obsługuje tworzenia programu obsługi ON_CONTROL lub ON_CONTROL_RANGE w interfejsie użytkownika; należy ręcznie wprowadzić je w edytorze tekstu. Po wpisaniu, ClassWizard będzie analizować te zapisy i pozwala przeglądać je podobnie jak inne wpisy mapę wiadomości.

Formanty standardowe systemu Windows sprawdź, wykorzystanie bardziej wydajne WM_NOTIFY w przypadku zgłoszeń złożonych kontroli. Ta wersja MFC ma bezpośrednie wsparcie dla tej nowej wiadomości z makra ON_NOTIFY i ON_NOTIFY_RANGE . Zobacz więcej informacji można znaleźć w dokumentacji produktu na tych makr.

Uwagi techniczne przez liczbę |nbsp; Uwagi techniczne według kategorii

Index