TN061: ON_NOTIFY i WM_NOTIFY wiadomości

Ta Uwaga techniczna podano informacje o nowej wiadomości WM_NOTIFY i opisano zalecane (i najczęściej) sposób obsługi wiadomości WM_NOTIFY w aplikacji MFC.

Komunikaty powiadamiające w systemie Windows 3.x

W systemie Windows 3.x kontroli ich rodziców zdarzeń, takich jak kliknięcia myszą, zmiany w zawartości i wybór i malowania tła formantu przez wysyłanie wiadomości do obiektu nadrzędnego. Proste powiadomienia są wysyłane jako specjalne WM_COMMAND wiadomości, kod powiadomienia (np. BN_CLICKED) i kontroli identyfikator pakowane w wParam i uchwyt sterujący w fikcyjnymi. Należy zauważyć, że ponieważ wParam i fikcyjnymi są pełne, istnieje sposób przekazuje wszelkie dodatkowe dane — komunikaty te mogą być tylko zwykłego powiadomienia. Na przykład w zgłoszeniu BN_CLICKED istnieje sposób do wysyłania informacji o lokalizacji kursora myszy, gdy przycisk został kliknięty.

Formanty w systemie Windows 3.x konieczność wysłania wiadomości z powiadomieniem, która zawiera dodatkowe dane, stosować różne wiadomości specjalnego przeznaczenia, w tym WM_CTLCOLOR, WM_VSCROLL, WM_HSCROLL, WM_DRAWITEM, WM_MEASUREITEM, WM_COMPAREITEM, WM_DELETEITEM, WM_CHARTOITEM, WM_VKEYTOITEMi tak dalej. Komunikaty te mogą być odzwierciedlane powrót do formantu, który je wysłał. Aby uzyskać więcej informacji, zobacz TN062: komunikat refleksji dla formantów systemu Windows.

Komunikaty powiadamiające w Win32

Dla formantów, które istniały w systemach Windows 3.1 Win32 API wykorzystuje większość wiadomości powiadomień, które były używane w systemie Windows 3.x. Jednakże Win32 doda również szereg zaawansowanych, złożonych formantów do tych, które są obsługiwane w systemie Windows 3.x. często, te formanty konieczność wysłania dodatkowe dane z ich powiadomieniu. Zamiast dodawać nową wiadomość WM_ * dla każdego nowego powiadomienia, że potrzebuje dodatkowych danych, projektantów interfejsu Win32 API wybrał opcję Dodaj tylko jednej wiadomości, WM_NOTIFY, której można przekazać wszelkie kwoty dodatkowych danych w sposób znormalizowany.

WM_NOTIFY wiadomości zawierają identyfikator formantu wysyłania wiadomości w wParam i wskaźnik do struktury w fikcyjnymi. Ta struktura jest struktura NMHDR lub niektórych większych strukturę, która ma strukturę NMHDR jako jej pierwszego Państwa. Zauważ, że od członka NMHDR po raz pierwszy, wskaźnik do tej struktury mogą być używane jako wskaźnik do NMHDR lub wskaźnik większe struktury w zależności od tego, jak można rzutować.

W większości przypadków wskaźnik będzie wskaż większe struktury i potrzebne do oddania go, gdy używasz go. Tylko kilka zgłoszeń, takich jak wspólne zgłoszenia (których nazwy zaczynają się NM_) oraz TTN_SHOW kontroli Porada narzędzia i TTN_POP powiadomienia jest struktura NMHDR faktycznie wykorzystanych.

Struktura NMHDR lub pierwszy członek zawiera uchwyt i identyfikator formantu wysyłania wiadomości i kod powiadomienia (np. TTN_SHOW). Format struktury NMHDR jest pokazany poniżej:

element TypeDef struct tag&NMHDR {}
 nbsp;  HWND hwndFrom;
    UINT idFrom;
    UINT kod;
} NMHDR

Wiadomość TTN_SHOW czy należy ustawić Państwa kodu TTN_SHOW.

Większość zgłoszeń przekazać wskaźnik większą strukturę, która zawiera strukturę NMHDR jako jej pierwszego Państwa. Na przykład należy wziąć pod uwagę struktury używane przez formant widoku listy LVN_KEYDOWN powiadomienie komunikatu, który jest wysyłany, gdy klawisz jest przytrzymywany w formancie widoku listy. Punkty wskaźnika do struktury LV_KEYDOWN , który jest zdefiniowany jako przedstawione poniżej:

element TypeDef struct tagLV_KEYDOW&N {}
 nbsp;  NMHDR hdr;   
    Program WORD wVKey;  
    UINT flagi;  
} LV_KEYDOWN

Należy zauważyć, że ponieważ element NMHDR jest pierwszym w tej struktury, wskaźnik, który jest przekazywany w wiadomości z powiadomieniem mogą być rzutowane na wskaźnik do NMHDR lub wskaźnik LV_KEYDOWN.

Powiadomienia o wspólnym dla wszystkich nowych formantów systemu Windows

Niektóre powiadomienia są wspólne dla wszystkich nowych formantów systemu Windows. Powiadomienia te przechodzą wskaźnika do struktury NMHDR.

Kod powiadomienia Wysłane, ponieważ
NM_CLICK Użytkownik kliknął przycisk lewy w formancie
NM_DBLCLK Użytkownik dwukrotnym kliknięciu lewy przycisk w formancie
NM_RCLICK Użytkownik kliknął przycisk prawym przyciskiem myszy w formancie
NM_RDBLCLK Użytkownik dwukrotnym kliknięciu prawym przyciskiem myszy przycisk w formancie
NM_RETURN Użytkownik nacisnął klawisz ENTER podczas kontrola ma wejście fokus
NM_SETFOCUS Kontrola została przyznana fokusa wejścia
NM_KILLFOCUS Kontrola utracił fokusa wejścia
NM_OUTOFMEMORY Formant nie może ukończyć operacji, ponieważ nie było wystarczającej ilości pamięci dostępnej

ON_NOTIFY: Obsługa wiadomości WM_NOTIFY w aplikacjach MFC

Funkcja CWnd::OnNotify obsługuje wiadomości powiadomień. Jego Domyślna implementacja sprawdza mapę wiadomości dla powiadomień obsługi do wywołania. Na ogół nie zastępują OnNotify. Zamiast tego zapewnia funkcję obsługi i dodać wpis wiadomości mapa dla tej obsługi na mapie wiadomości klasy okna właściciela.

ClassWizard, za pomocą arkusza właściwości ClassWizard lub WizardBar, można utworzyć wpis wiadomości Mapa ON_NOTIFY i umożliwiają funkcję obsługi szkielet. Aby uzyskać więcej informacji na temat używania ClassWizard ułatwić, zobacz Mapowanie wiadomości do funkcji w Visual C++ Programmer's Guide.

Makro wiadomości Mapa ON_NOTIFY ma następującą składnię:

ON_NOTIFY ( wNotifyCode, identyfikator, memberFxn )

gdzie są zastępowane kursywą parametrów:

wNotifyCode

Kod komunikat powiadomienia mają być przetwarzane, takich jak LVN_KEYDOWN.

identyfikator

Identyfikator dziecko formant, dla którego jest wysyłane powiadomienie.

memberFxn

Funkcja Państwa ma być wywoływana, gdy takie powiadomienie jest wysyłane.

Funkcji członek musi być zadeklarowana z następującym prototypie:

afx_msgnieważnememberFxn()NMHDR*pNotifyStruct,LRESULT*wynik);

gdy kursywą parametry są:

pNotifyStruct

Wskaźnik do struktury powiadomienia, jak opisano w poprzedniej sekcji.

wynik

Wskaźnik kod wyniku będzie ustawiona przed zwróceniem.

Przykład

Aby określić, że funkcja Państwa OnKeydownList1 do obsługi wiadomości LVN_KEYDOWN z CListCtrl o identyfikatorze IDC_LIST1 , czy za pomocą ClassWizard Dodaj następującą wartość do mapy wiadomości:

ON_NOTIFY (LVN_KEYDOWN, IDC_LIST1, OnKeydownList1)

W powyższym przykładzie funkcja świadczone przez ClassWizard jest:

void CMessageReflectionDlg::OnKeydownList1 (&NMHDR * pNMHDR, LRESULT * pResult)
{
   LV_KEYDOWN * pLVKeyDow = LV_KEYDOWN ** pNMHDR;
   / / TODO: dodawanie obsługi powiadamiania użytkownika sterowania
   / / nbsp;  kod
   
   * pResult = 0;
}

Należy zauważyć, że ClassWizard zawiera wskaźnik właściwego typu automatycznie. Można uzyskać dostęp struktury powiadomienia przez albo pNMHDR lubpLVKeyDow.

ON_NOTIFY_RANGE

Jeśli chcesz przetworzyć tę samą wiadomość WM_NOTIFY dla zestawu formantów, można użyć ON_NOTIFY_RANGE zamiast ON_NOTIFY. Na przykład może mieć zestaw przycisków, dla której chcesz wykonać tę samą akcję dla niektórych wiadomości z powiadomieniem.

Podczas korzystania z ON_NOTIFY_RANGE, należy określić ciągły zakres podrzędnych identyfikatorów dla którego do obsługi wiadomości z powiadomieniem przez określanie początku i zakończenia podrzędnych identyfikatorów zakresu.

ClassWizard nie obsługuje ON_NOTIFY_RANGE; Aby go użyć, trzeba edycji mapy wiadomości, samodzielnie.

Wpisie mapy wiadomości i prototyp dla ON_NOTIFY_RANGE są następujące:

ON_NOTIFY_RANGE ( wNotifyCode, identyfikator, idLast, memberFxn )

gdzie są zastępowane kursywą parametrów:

wNotifyCode

Kod komunikat powiadomienia mają być przetwarzane, takich jak LVN_KEYDOWN.

identyfikator

Pierwszy identyfikator w ciągły zakres identyfikatorów.

idLast

Identyfikator ostatniego w ciągły zakres identyfikatorów.

memberFxn

Funkcja Państwa ma być wywoływana, gdy takie powiadomienie jest wysyłane.

Funkcji członek musi być zadeklarowana z następującym prototypie:

afx_msgnieważnememberFxn()UINT identyfikatorNMHDR*pNotifyStruct,LRESULT*wynik);

gdy kursywą parametry są:

identyfikator

Identyfikator podrzędne formantu, do którego wysyłane powiadomienia.

pNotifyStruct

Wskaźnik do struktury powiadomienia, jak opisano powyżej.

wynik

Wskaźnik kod wyniku będzie ustawiona przed zwróceniem.

ON_NOTIFY_EX, ON_NOTIFY_EX_RANGE

Jeśli chcesz więcej niż jeden obiekt w powiadomieniu, routing do obsługi wiadomości, można użyć ON_NOTIFY_EX (lub ON_NOTIFY_EX_RANGE) zamiast ON_NOTIFY (lub ON_NOTIFY_RANGE). Jedyną różnicą między wersji EX i regularnych jest, że funkcja Członkowskich wezwały do wersji EX zwraca BOOL , która wskazuje, czy należy kontynuować przetwarzanie wiadomości. Zwraca FALSE z tej funkcji umożliwia przetworzenie tej samej wiadomości w więcej niż jednym obiekcie.

ClassWizard nie obsługuje ON_NOTIFY_EX lub ON_NOTIFY_EX_RANGE; Jeśli chcesz skorzystać z jednej z nich, trzeba edycji mapy wiadomości, samodzielnie.

Wpisie mapy wiadomości i prototyp ON_NOTIFY_EX i ON_NOTIFY_EX_RANGE są następujące. Znaczenie parametry są takie same, jak w przypadku innych niż-EX wersje.

ON_NOTIFY_EX ( nCode, identyfikator, memberFxn )

ON_NOTIFY_EX_RANGE ( wNotifyCode, identyfikator, idLast,memberFxn )

Prototyp dla obu powyższych jest taka sama:

afx_msgBOOLmemberFxn()UINT identyfikatorNMHDR*pNotifyStruct,LRESULT*wynik);

W obu przypadkach identyfikator posiada identyfikator podrzędne formantu, do którego wysyłane powiadomienia.

Funkcji musi zwracać wartość PRAWDA , jeśli powiadomienie zostało całkowicie zrealizowana lub Fałsz , jeśli inne obiekty w polecenia routingu powinny mieć możliwość obsługi wiadomości.

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

Index