TN061: komunikaty ON_NOTIFY i WM_NOTIFY
[!UWAGA]
Następująca uwaga techniczna nie został zaktualizowana od pierwszego uwzględnienia jej w dokumentacji online.W rezultacie niektóre procedury i tematy może być nieaktualne lub nieprawidłowe.Aby uzyskać najnowsze informacje, zaleca się wyszukać temat w indeksie dokumentacji online.
Ta uwaga techniczna podano informacje na temat nowych WM_NOTIFY wiadomość i w tym artykule opisano zalecane (i najczęściej) sposób obsługi WM_NOTIFY wiadomości w aplikacji MFC.
Zawiadomienie wiadomości w systemie Windows 3.x
W systemie Windows 3.x, formanty powiadomić rodziców wydarzeń, takich jak kliknięcie myszą, zmiany w zawartości i wybór i obraz tła formantu poprzez wysłanie wiadomości do obiektu nadrzędnego.Proste powiadomienia są wysyłane jako specjalne WM_COMMAND wiadomości z kod powiadomienia (takie jak BN_CLICKED) i zapakowane w identyfikator formantu wParam i uchwytu sterującego w lParam.Należy zauważyć, że ponieważ wParam i lParam są pełne, nie istnieje sposób przekazać wszelkie dodatkowe dane — te wiadomości mogą być tylko zwykłego powiadomienia.Na przykład, w BN_CLICKED powiadomienia, nie istnieje sposób do wysyłania informacji o lokalizacji kursora myszy, gdy przycisk został kliknięty.
Kiedy formantów w Windows 3.x potrzeby, aby wysłać komunikat z powiadomieniem, która zawiera dodatkowe dane, używają różnych specjalnych wiadomości, łącznie z WM_CTLCOLOR, WM_VSCROLL, WM_HSCROLL, WM_DRAWITEM, WM_MEASUREITEM, WM_COMPAREITEM, WM_DELETEITEM, WM_CHARTOITEM, WM_VKEYTOITEM, i tak dalej.Komunikaty te mogą zostać uwzględnione powrót do formantu, który je wysłał.Aby uzyskać więcej informacji, zobacz TN062: odbicie wiadomość dla formantów systemu Windows.
Komunikaty powiadamiające w systemie Win32
W przypadku formantów, które istniały w systemie Windows 3.1 interfejsu Win32 API używa większość wiadomości powiadomień, które były używane w systemie Windows 3.x.Jednakże Win32 dodaje również kilku formantów zaawansowanych, złożonych do tych obsługiwane w systemie Windows 3.x.Często trzeba wysłać dodatkowe dane z ich komunikaty powiadamiające tych formantów.Zamiast dodawać nową WM_ * wiadomość dla każdego nowe powiadomienie, że wymaga dodatkowych danych, projektanci interfejsu Win32 API zdecydowała się dodać tylko jednej wiadomości, WM_NOTIFY, który można przekazać dowolną ilość dodatkowych danych w sposób standardowy.
WM_NOTIFY wiadomości zawierają identyfikator formantu, wiadomość jest wysyłana w wParam i wskaźnik do struktury lParam.Ta struktura jest albo NMHDR strukturę lub strukturę niektórych większych, który ma NMHDR struktury pierwszą.Należy zauważyć, że ponieważ NMHDR Członkowskich jest pierwszym, wskaźnik do tej struktury może być używany jako wskaźnik do NMHDR lub jako wskaźnik do struktury większy w zależności od tego, jak oddanych.
W większości przypadków kursor będzie wskazywał większe struktury i co jest potrzebne do oddania go, gdy jest używany.Tylko kilka powiadomień, takich jak wspólne powiadomienia (o nazwach zaczynających NM_) i narzędzie kontroli tip TTN_SHOW i TTN_POP powiadomienia, jest NMHDR struktury faktycznie wykorzystanych.
NMHDR strukturę lub pierwszy członek zawiera uchwyt i identyfikator formantu, wysyłając wiadomości i kod powiadomienia (takie jak TTN_SHOW).Format NMHDR struktury jest pokazany poniżej:
typedef struct tagNMHDR {
HWND hwndFrom;
UINT idFrom;
UINT code;
} NMHDR;
Dla TTN_SHOW wiadomość, Kod czy zestaw elementów członkowskich, TTN_SHOW.
Większość zawiadomień przekazać wskaźnik do większych strukturę, która zawiera NMHDR struktury pierwszą.Na przykład, należy uwzględnić strukturę używane przez formant widoku listy LVN_KEYDOWN komunikat z powiadomieniem, który jest wysyłany, gdy zostanie naciśnięty klawisz w formantu widoku listy.Wskaźnik wskazuje na LV_KEYDOWN strukturę, która jest zdefiniowana, jak pokazano poniżej:
typedef struct tagLV_KEYDOWN {
NMHDR hdr;
WORD wVKey;
UINT flags;
} LV_KEYDOWN;
Należy zauważyć, że ponieważ NMHDR Członkowskich jest pierwszym w tej strukturze, wskaźnik jest przekazany komunikat z powiadomieniem mogą być rzutowane na wskaźnik do NMHDR , albo wskaźnik do LV_KEYDOWN.
Powiadomienia o wspólne dla wszystkich nowych formantów systemu Windows
Niektóre powiadomienia są wspólne dla wszystkich nowych formantów systemu Windows.Te powiadomienia przekazać wskaźnik do NMHDR struktury.
Kod powiadomienia |
Wysłana, ponieważ |
---|---|
NM_CLICK |
Użytkownik kliknął przycisk lewy przycisk myszy w formancie |
NM_DBLCLK |
Użytkownik dwukrotne kliknięcie lewym przyciskiem myszy w formancie |
NM_RCLICK |
Użytkownik kliknął prawym przyciskiem myszy na formancie |
NM_RDBLCLK |
Użytkownik dwukrotnym kliknięciu prawym przyciskiem myszy w formancie |
NM_RETURN |
Użytkownik naciśnie klawisz ENTER, podczas gdy formant ma wejście fokus |
NM_SETFOCUS |
Formant ma fokus wprowadzania |
NM_KILLFOCUS |
Kontrola utracił fokus wprowadzania |
NM_OUTOFMEMORY |
Formant nie może ukończyć operacji, ponieważ nie były dostępne za mało pamięci |
ON_NOTIFY: Obsługa wiadomości WM_NOTIFY w aplikacjach MFC
Funkcja CWnd::OnNotify obsługuje komunikaty powiadamiające.Jego domyślna implementacja sprawdza, czy mapa wiadomość dla obsługi powiadomień do wywołania.Ogólnie rzecz biorąc, nie zastępują OnNotify.Zamiast funkcji obsługi i dodać wpis mapy wiadomość dla programu obsługi do mapy wiadomości klasy okna właściciela.
ClassWizard, za pomocą arkusza właściwości ClassWizard, można utworzyć ON_NOTIFY wpisu mapowania wiadomości i dostarczają funkcji obsługi szkielet.Aby uzyskać więcej informacji dotyczących używania ClassWizard Aby to ułatwić, zobacz Mapowania wiadomości do funkcji.
ON_NOTIFY Mapy wiadomości makro ma następującą składnię:
ON_NOTIFY( wNotifyCode, id, memberFxn )
gdzie są zastępowane pochyły parametrów:
wNotifyCode
Kod komunikat z powiadomieniem do obsługi, takie jak LVN_KEYDOWN.id
Identyfikator podrzędnego formant, dla którego powiadomienie jest wysyłane.memberFxn
Element członkowski funkcja ma być wywoływana po to powiadomienie jest wysyłane.
Z funkcji składowej musi być zadeklarowana z następującym prototypie:
afx_msg void memberFxn( NMHDR * pNotifyStruct, LRESULT * result );
Uwagi
gdy pochyły parametry są:
pNotifyStruct
Wskaźnik do struktury powiadomienia, zgodnie z opisem w poprzedniej sekcji.wynik
Wskaźnik do kod wyniku będzie ustawiona przed zwróceniem.
Przykład
Aby określić funkcję członka OnKeydownList1 do obsługi LVN_KEYDOWN wiadomości od CListCtrl , którego identyfikator jest IDC_LIST1, ClassWizard można użyć w celu Dodaj następującą wartość do mapy wiadomości:
ON_NOTIFY( LVN_KEYDOWN, IDC_LIST1, OnKeydownList1 )
W powyższym przykładzie funkcji oferowanych przez ClassWizard jest:
void CMessageReflectionDlg::OnKeydownList1(NMHDR* pNMHDR, LRESULT* pResult)
{
LV_KEYDOWN* pLVKeyDow = (LV_KEYDOWN*)pNMHDR;
// TODO: Add your control notification handler
// code here
*pResult = 0;
}
Uwaga ClassWizard automatycznie zawiera wskaźnik właściwego typu.Struktury powiadomień można uzyskać dostęp za pomocą jednego pNMHDR lub pLVKeyDow.
ON_NOTIFY_RANGE
Jeśli chcesz przetwarzać takie same WM_NOTIFY wiadomość dla zestaw formantów, można użyć ON_NOTIFY_RANGE zamiast ON_NOTIFY.Na przykład może być zestaw przycisków, dla której chcesz wykonać tę samą czynność dla niektórych komunikat z powiadomieniem.
Użycie ON_NOTIFY_RANGE, określ ciągły zakres identyfikatorów podrzędnych dla którego do obsługi komunikat z powiadomieniem przez określanie początku i zakończenia identyfikatorów podrzędnych zakresu.
Nie obsługuje ClassWizard ON_NOTIFY_RANGE; Aby go użyć, należy edytować mapę wiadomość samodzielnie.
Prototyp wpis i funkcja mapy wiadomości dla ON_NOTIFY_RANGE są następujące:
ON_NOTIFY_RANGE( wNotifyCode, id, idLast, memberFxn )
gdzie są zastępowane pochyły parametrów:
wNotifyCode
Kod komunikat z powiadomieniem do obsługi, takie jak LVN_KEYDOWN.id
Identyfikator pierwszego w ciągły zakres identyfikatorów.idLast
Identyfikator ostatniego w ciągły zakres identyfikatorów.memberFxn
Element członkowski funkcja ma być wywoływana po to powiadomienie jest wysyłane.
Z funkcji składowej musi być zadeklarowana z następującym prototypie:
afx_msg void memberFxn( UINT id, NMHDR * pNotifyStruct, LRESULT * result );
Uwagi
gdy pochyły parametry są:
id
Identyfikator podrzędnego formant, do którego wysłane powiadomienie.pNotifyStruct
Wskaźnik do struktury powiadomień, jak opisano powyżej.wynik
Wskaźnik do kod wyniku będzie ustawiona przed zwróceniem.
ON_NOTIFY_EX, ON_NOTIFY_EX_RANGE
Jeśli chcesz więcej niż jeden obiekt w zgłoszeniu routingu do obsługi wiadomości, można użyć ON_NOTIFY_EX (lub ON_NOTIFY_EX_RANGE) a nie ON_NOTIFY (lub ON_NOTIFY_RANGE).Jedyną różnicą między EX i regularne wersja jest, że element członkowski funkcja wywoływana dla EX zwraca wersję BOOL , która wskazuje czy należy kontynuować przetwarzania wiadomości.Zwracanie FALSE z ta funkcja umożliwia przetworzenie tej samej wiadomości w więcej niż jeden obiekt.
Nie obsługuje ClassWizard ON_NOTIFY_EX lub ON_NOTIFY_EX_RANGE; Jeśli chcesz skorzystać z jednej z nich, należy edytować mapę wiadomość samodzielnie.
Prototyp wpis i funkcja mapy wiadomości dla ON_NOTIFY_EX i ON_NOTIFY_EX_RANGE są następujące.Znaczenia parametrów są takie same, jak w przypadku non -EX wersji.
ON_NOTIFY_EX( nCode, id, memberFxn )
ON_NOTIFY_EX_RANGE( wNotifyCode, id, idLast, memberFxn )
Prototyp dla obu powyższych jest taka sama:
afx_msg BOOL memberFxn( UINT id, NMHDR * pNotifyStruct, LRESULT * result );
Uwagi
W obu przypadkach id posiada identyfikator dziecko formant, do którego wysłane powiadomienie.
Funkcja musi zwracać TRUE jeśli całkowicie zrealizowana komunikat z powiadomieniem lub FALSE Jeśli inne obiekty w polecenia routingu powinny mieć możliwość obsługi wiadomości.