Udostępnij za pośrednictwem


TN061: ON_NOTIFY i WM_NOTIFY wiadomości

[!UWAGA]

Następujące Uwaga techniczna została zaktualizowana, ponieważ najpierw została uwzględniona w dokumentacji online.W rezultacie niektóre procedur i tematów może być nieaktualne lub nieprawidłowe.Najnowsze informacje zaleca się wyszukać temat zainteresowanie Indeks dokumentacji online.

Ten Uwaga techniczna podano informacje na temat nowych WM_NOTIFY wiadomości i opisano zalecane (i najczęściej) sposób obsługi WM_NOTIFY wiadomości w aplikacji MFC.

Wiadomości w systemie Windows 3.x

W systemie Windows 3.x kontroli ich rodziców zdarzeń, takich jak kliknięcie myszą, zmiany w zawartości i zaznaczenia i obraz tła formantu przez wysył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 kontroli identyfikator zapakowane w wParam i uchwytu sterującego w lParam.Należy zauważyć, że od wParam i lParam są pełne, nie ma możliwości przekazania wszelkich dodatkowych danych — komunikaty te mogą być tylko zwykłego powiadomienia.Na przykład w BN_CLICKED powiadomienia, nie ma możliwości do wysyłania informacji o lokalizacji kursora myszy, kliknięciu przycisku.

Podczas kontroli w systemie Windows 3.x musi 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_VKEYTOITEMi tak dalej.Komunikaty te można odzwierciedlenie powrót do formantu, który je wysłał.Aby uzyskać więcej informacji, zobacz TN062: odbicie komunikat dla formantów systemu Windows.

Wiadomości powiadomień w Win32

Dla formantów, które istniały w systemie 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 dodaje również liczbę formantów zaawansowanych, złożonych do obsługiwane w systemie Windows 3.x.Często te formanty konieczność wysłania dodatkowe dane z ich wiadomości powiadomień.Zamiast dodawać nową WM_ * wiadomości dla każdego powiadomienie o nowej, który potrzebuje dodatkowych danych, projektantów interfejsu Win32 API wybrał opcję Dodaj tylko jednej wiadomości, WM_NOTIFY, które można przekazać wszelkie kwoty dodatkowych danych w standardowy sposób.

WM_NOTIFY wiadomości zawierają identyfikator formantu, wysyłania wiadomości wParam i wskaźnik do struktury w lParam.Ta struktura jest albo NMHDR strukturę lub strukturę niektórych większych, który ma NMHDR struktury jej pierwszym członkiem.Należy zauważyć, że od NMHDR Członkowskie po raz pierwszy, wskaźnik do tej struktury mogą być używane 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 wskaźnik będzie wskaż większe struktury i będziesz musiał rzutować go podczas używania go.Tylko kilka zgłoszeń, takich jak wspólne powiadomienia (których nazwy zaczynają NM_) i kontroli Wskazówka do narzędzia TTN_SHOW i TTN_POP powiadomienia, jest NMHDR struktury rzeczywiście wykorzystane.

NMHDR strukturę lub pierwszy członek zawiera uchwyt i identyfikator formantu, wysyłania wiadomości i kodu 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ści, kodu czy zestaw elementów członkowskich, TTN_SHOW.

Większość notyfikacje przekazuje się wskaźnik większych strukturę, która zawiera NMHDR struktury jej pierwszym członkiem.Na przykład, należy uwzględnić strukturę używane przez formant widoku listy LVN_KEYDOWN komunikat z powiadomieniem, który jest wysyłany po naciśnięciu klawisza 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 od NMHDR Członkowskie po raz pierwszy w tej struktury, wskaźnik przekazany komunikat z powiadomieniem można rzutować na wskaźnik do NMHDR lub wskaźnika do LV_KEYDOWN.

Wspólne zgłoszenia do wszystkich nowych formantów systemu Windows

Niektóre powiadomienia są wspólne dla wszystkich nowych formantów systemu Windows.Powiadomienia te przekazuje się wskaźnik do NMHDR struktury.

Kod powiadomienia

Wysłana, ponieważ

NM_CLICK

Lewy przycisk myszy w formancie kliknięty.

NM_DBLCLK

Użytkownik dwukrotnym kliknięciu lewym przyciskiem myszy w formancie

NM_RCLICK

Użytkownik kliknie prawym przyciskiem myszy w formancie

NM_RDBLCLK

Użytkownik dwukrotnym kliknięciu prawym przyciskiem myszy w formancie

NM_RETURN

Użytkownik nacionięty klawisz ENTER, gdy formant ma wejście fokus

NM_SETFOCUS

Kontrola udzielono fokus wprowadzania

NM_KILLFOCUS

Formant utracił fokus wprowadzania

NM_OUTOFMEMORY

Formant nie można ukończyć operacji, ponieważ nie ma wystarczającej ilości pamięci dostępnej

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

Funkcja CWnd::OnNotify obsługi wiadomości.Jego domyślna implementacja sprawdza mapę wiadomości do obsługi powiadamiania do wywołania.Ogólnie rzecz biorąc, możesz nie zastępują OnNotify.Zamiast funkcji obsługi zapewniają i Dodaj wpis mapy wiadomości dla tego programu obsługi do mapy wiadomości klasy okna właściciela.

ClassWizard, via ClassWizard arkusz właściwości, można utworzyć ON_NOTIFY wpisu mapy wiadomości i dostarczają funkcji obsługi szkielet.Aby uzyskać więcej informacji na temat używania ClassWizard ułatwić, zobacz Mapowanie wiadomości do funkcji.

ON_NOTIFY Makro mapę wiadomość ma następującą składnię:

ON_NOTIFY( wNotifyCode, id, memberFxn )

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

  • wNotifyCode
    Kod komunikat z powiadomieniem do obsługi, takie jak LVN_KEYDOWN.

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

  • memberFxn
    Funkcja Członkowskie wywoływana, gdy to powiadomienie jest wysyłane.

Funkcji Członkowskich muszą być zadeklarowane z następującym prototypie:

afx_msg void memberFxn( NMHDR * pNotifyStruct, LRESULT * result );

Uwagi

gdy kursywą parametry są:

  • pNotifyStruct
    Wskaźnik do struktury notyfikacji, zgodnie z opisem w sekcji powyżej.

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

Przykład

Aby określić, że funkcja Członkowskie OnKeydownList1 do obsługi LVN_KEYDOWN wiadomości z CListCtrl których identyfikator jest IDC_LIST1, ClassWizard można użyć w celu dodaje się do mapy wiadomości:

ON_NOTIFY( LVN_KEYDOWN, IDC_LIST1, OnKeydownList1 )

W powyższym przykładzie funkcja dostarczonych 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 zapewnia wskaźnik właściwego typu.Możesz przejść powiadomień struktury albo pNMHDR lub pLVKeyDow.

ON_NOTIFY_RANGE

Aby przetwarzać takie same należy WM_NOTIFY komunikat zestaw 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ć operację dla niektórych komunikat z powiadomieniem.

Kiedy używać ON_NOTIFY_RANGE, określ ciągły zakres podrzędnych identyfikatorów dla którego obsługi komunikat z powiadomieniem przez określanie początku i zakończenia podrzędnych identyfikatorów zakresu.

Nie obsługuje ClassWizard ON_NOTIFY_RANGE; Aby go użyć, należy edytować mapę wiadomości samodzielnie.

Prototyp wejścia i funkcji wiadomości mapę dla ON_NOTIFY_RANGE są następujące:

ON_NOTIFY_RANGE( wNotifyCode, id, idLast, memberFxn )

gdzie są zastępowane kursywą 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
    Funkcja Członkowskie wywoływana, gdy to powiadomienie jest wysyłane.

Funkcji Członkowskich muszą być zadeklarowane z następującym prototypie:

afx_msg void memberFxn( UINT id, NMHDR * pNotifyStruct, LRESULT * result );

Uwagi

gdy kursywą parametry są:

  • id
    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 zgłoszeniu 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 EX i regularne wersja jest, że funkcja Członkowskie wywołana dla EX wersji zwraca BOOL który wskazuje, czy należy kontynuować przetwarzanie wiadomości.Zwracanie FALSE z tej funkcji 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; Aby korzystać z nich, należy edytować mapę wiadomości samodzielnie.

Prototyp wejścia i funkcji wiadomości mapę dla ON_NOTIFY_EX i ON_NOTIFY_EX_RANGE są następujące.Znaczenie parametry są takie same, jak w przypadku innych niż-EX wersji.

ON_NOTIFY_EX( nCode, id, memberFxn )
ON_NOTIFY_EX_RANGE( wNotifyCode, id, idLast, memberFxn )

Prototyp oba powyższe jest taka sama:

afx_msg BOOL memberFxn( UINT id, NMHDR * pNotifyStruct, LRESULT * result );

Uwagi

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

Funkcja musi zwracać TRUE , jeśli całkowicie zrealizowana komunikat z powiadomieniem lub FALSE Jeśli inne obiekty w routingu polecenia powinny mieć możliwość obsługi wiadomości.

Zobacz też

Inne zasoby

Uwagi techniczne przez liczbę

Uwagi techniczne według kategorii