Sdílet prostřednictvím


TN061: ON_NOTIFY a WM_NOTIFY – zprávy

[!POZNÁMKA]

Následující technická poznámka nebyla aktualizována, protože byla poprvé zahrnuta v dokumentaci online.V důsledku toho některé postupy a témata mohou být nesprávné nebo zastaralé.Pro nejnovější informace je vhodné vyhledat téma zájmu v dokumentaci online index.

Tato technická poznámka obsahuje základní informace o nové WM_NOTIFY zpráva a popisuje způsob zpracování doporučené (a nejčastěji) WM_NOTIFY zprávy v aplikaci knihovny MFC.

Oznamovací zprávy v systému Windows 3.x

V systému Windows 3.x, ovládací prvky upozornění svých rodičů události, jako je například klepnutí myší, změny v obsahu a výběr a Malování pozadí ovládacího prvku odesláním zprávy k nadřazené.Jednoduché oznámení jsou odesílány jako zvláštní WM_COMMAND zprávy s kódem oznámení (například BN_CLICKED) a balí do ID ovládacího prvku wParam a popisovač tohoto ovládacího prvku v lParam.Všimněte si, že od wParam a lParam jsou úplné, neexistuje žádný způsob, jak předat všechna doplňková data, tyto zprávy mohou být pouze jednoduché oznámení.Například, v BN_CLICKED oznámení, neexistuje žádný způsob, jak odeslat informace o umístění ukazatele myši, pokud bylo stisknuto.

Když ovládací prvky v systému Windows 3.x nutné odeslat oznámení, která obsahuje další data, používají různé speciální zprávy, včetně WM_CTLCOLOR, WM_VSCROLL, WM_HSCROLL, WM_DRAWITEM, WM_MEASUREITEM, WM_COMPAREITEM, WM_DELETEITEM, WM_CHARTOITEM, WM_VKEYTOITEMa tak dále.Tyto zprávy můžete odrazit zpět do ovládacího prvku, který je odeslán.Další informace naleznete v tématu TN062: zpráva reflexe pro ovládací prvky systému Windows.

Zprávy s oznámením v systému Win32

Rozhraní Win32 API pro ovládací prvky, které existovaly v systému Windows 3.1, používá většina oznamovací zprávy, které byly použity v systému Windows 3.x.Však Win32 také přidá některé složité, složité ovládací prvky jsou podporovány v systému Windows 3.x.Často tyto ovládací prvky je nutné odeslat další data s jejich oznámení.Namísto přidávání nového WM_ * zpráva pro každé nové oznámení, že potřebuje další data, návrháři rozhraní Win32 API se rozhodl přidat pouze jednu zprávu WM_NOTIFY, které lze předat libovolné množství dalších dat standardizovaným způsobem.

WM_NOTIFY zprávy obsahovat ID ovládacího prvku odeslání zprávy wParam a ukazatel na strukturu v lParam.Tato struktura je buď NMHDR struktury nebo některé větší struktura, kterou má NMHDR strukturu jako jeho první člen.Všimněte si, že od NMHDR je první člen, ukazatel na tuto strukturu lze použít jako ukazatel na NMHDR nebo jako ukazatele na větší strukturu v závislosti na tom, jak převést.

Ve většině případů bude ukazatel přejděte na větší struktury a musíte přetypovat jej použijete.V pouze několik oznámení, například společné oznámení (jejichž názvy začínají NM_) a ovládací prvek tip nástroje TTN_SHOW a TTN_POP oznámení, je NMHDR strukturu skutečně používá.

NMHDR struktury nebo počáteční člen obsahuje úchyt a ID ovládacího prvku pro odeslání zprávy a kód oznámení (například TTN_SHOW).Formát NMHDR struktury jsou uvedeny níže:

typedef struct tagNMHDR {
    HWND hwndFrom;
    UINT idFrom;
    UINT code;
} NMHDR;

Pro TTN_SHOW zprávy, kód člen by byl nastaven na TTN_SHOW.

Většina oznámení předejte ukazatel na strukturu obsahující větší NMHDR strukturu jako jeho první člen.Například zvažte strukturu používá ovládací prvek zobrazit seznam LVN_KEYDOWN oznámení, která je odeslána při stisknutí klávesy v ovládacím prvku seznamu zobrazení.Ukazatel odkazuje LV_KEYDOWN strukturu, která je definována takto:

typedef struct tagLV_KEYDOWN {
    NMHDR hdr;   
    WORD wVKey;  
    UINT flags;  
} LV_KEYDOWN;

Všimněte si, že od NMHDR člen je první v této struktuře, ukazatele, které jsou předány v oznámení může být převeden na ukazatel na NMHDR nebo ukazatele LV_KEYDOWN.

Společná oznámení pro všechny nové ovládací prvky systému Windows

Některé oznámení jsou společná pro všechny nové ovládací prvky systému Windows.Tato oznámení můžete předat ukazatel NMHDR struktury.

Kód oznámení

Odeslat, protože

NM_CLICK

Uživatel klepnul levým tlačítkem myši v ovládacím prvku

NM_DBLCLK

Uživatel poklepání levým tlačítkem myši v ovládacím prvku

NM_RCLICK

Uživatel kliknul pravým tlačítkem myši v ovládacím prvku

NM_RDBLCLK

Uživatel poklepání pravým tlačítkem myši v ovládacím prvku

NM_RETURN

Uživatele stiskli klávesu ENTER, zatímco ovládací prvek má vstupní fokus

NM_SETFOCUS

Ovládací prvek byla poskytnuta vstup

NM_KILLFOCUS

Ovládací prvek ztratil vstup

NM_OUTOFMEMORY

Ovládací prvek nelze dokončit operaci, protože nebyl k dispozici dostatek paměti k dispozici

ON_NOTIFY: Zpracování zprávy WM_NOTIFY v aplikacích knihovny MFC

Funkce CWnd::OnNotify zpracovává zprávy s oznámením.Jeho výchozí provádění kontroluje mapu zpráv obslužné rutiny oznámení pro volání.Obecně nepokryjete OnNotify.Místo toho poskytují obslužné rutiny a přidejte položku mapu zpráv pro tuto obslužnou rutinu do mapy zprávy nadřazené okno třídy.

ClassWizard, prostřednictvím seznamu vlastností ClassWizard, můžete vytvořit ON_NOTIFY zprávy načítání a poskytnout kostru obslužné rutiny.Další informace o použití ClassWizard pro zjednodušení, viz Mapování zpráv do funkcí.

ON_NOTIFY Mapu zpráv má následující syntaxi:

ON_NOTIFY( wNotifyCode, id, memberFxn )

kde jsou psané kurzívou parametry nahrazeny:

  • wNotifyCode
    Kód oznámení ke zpracování, jako například LVN_KEYDOWN.

  • id
    Identifikátor podřízené ovládací prvek, pro který bude oznámení odesláno.

  • memberFxn
    Členská funkce, která má být volána, když bude toto oznámení odesláno.

Členské funkce musí být deklarovány pomocí následující prototyp:

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

Poznámky

kde jsou psané kurzívou parametry:

  • pNotifyStruct
    Ukazatel na strukturu oznámení, jak je popsáno výše.

  • výsledek
    Ukazatel na kód výsledku nastavíte před vrácením.

Příklad

Můžete určit, že má členskou funkci OnKeydownList1 zpracovat LVN_KEYDOWN zprávy, CListCtrl , jehož ID je IDC_LIST1, by pomocí ClassWizard přidejte následující do vaší mapy zprávy:

ON_NOTIFY( LVN_KEYDOWN, IDC_LIST1, OnKeydownList1 )

V předchozím příkladu je funkce poskytované ClassWizard:

void CMessageReflectionDlg::OnKeydownList1(NMHDR* pNMHDR, LRESULT* pResult)
{
   LV_KEYDOWN* pLVKeyDow = (LV_KEYDOWN*)pNMHDR;
   // TODO: Add your control notification handler
   //       code here
   
   *pResult = 0;
}

Poznámka: ClassWizard automaticky obsahuje ukazatel správného typu.Struktura oznámení můžete přistupovat prostřednictvím buď pNMHDR nebo pLVKeyDow.

ON_NOTIFY_RANGE

Pokud potřebujete zpracovat stejné WM_NOTIFY zpráva pro sadu ovládacích prvků, můžete použít ON_NOTIFY_RANGE spíše než ON_NOTIFY.Můžete mít například sadu tlačítek, které chcete provést stejnou akci u některých oznámení.

Používáte-li ON_NOTIFY_RANGE, zadejte souvislou oblast identifikátory podřízené k určení počáteční a koncovou dítě identifikátory rozsahu zpracování oznámení.

ClassWizard nezpracovává ON_NOTIFY_RANGE; ji používat, je třeba upravit mapu zprávu sami sobě.

Mapu zpráv vstup a funkce prototyp ON_NOTIFY_RANGE jsou následující:

ON_NOTIFY_RANGE( wNotifyCode, id, idLast, memberFxn )

kde jsou psané kurzívou parametry nahrazeny:

  • wNotifyCode
    Kód oznámení ke zpracování, jako například LVN_KEYDOWN.

  • id
    První identifikátor v souvislé oblasti identifikátorů.

  • idLast
    Poslední identifikátor v souvislé oblasti identifikátorů.

  • memberFxn
    Členská funkce, která má být volána, když bude toto oznámení odesláno.

Členské funkce musí být deklarovány pomocí následující prototyp:

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

Poznámky

kde jsou psané kurzívou parametry:

  • id
    Identifikátor podřízeného ovládacího prvku, který bude odesláno oznámení.

  • pNotifyStruct
    Ukazatel na strukturu oznámení, jak je popsáno výše.

  • výsledek
    Ukazatel na kód výsledku nastavíte před vrácením.

ON_NOTIFY_EX, ON_NOTIFY_EX_RANGE

Pokud má více než jeden objekt v oznámení pro směrování zpracovat zprávu, můžete použít ON_NOTIFY_EX (nebo ON_NOTIFY_EX_RANGE) spíše než ON_NOTIFY (nebo ON_NOTIFY_RANGE).Jediný rozdíl mezi EX verze a normální verze je, že volat členské funkce pro EX verze vrátí BOOL , označuje, zda by měl pokračovat zpracování zprávy.Vrácení FALSE z této funkce umožňuje zpracovávat stejná zpráva ve více než jeden objekt.

ClassWizard nezpracovává ON_NOTIFY_EX nebo ON_NOTIFY_EX_RANGE; Pokud chcete použít některou z nich, je třeba upravit mapu zprávu sami sobě.

Mapu zpráv vstup a funkce prototyp ON_NOTIFY_EX a ON_NOTIFY_EX_RANGE jsou takto.Význam parametrů jsou stejné jako non -EX verze.

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

Prototyp pro obě výše uvedené je stejný:

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

Poznámky

V obou případech id obsahuje identifikátor podřízeného ovládacího prvku, který bude odesláno oznámení.

Funkce musí vrátit TRUE Pokud oznámení byly zcela zpracovány nebo FALSE -li ostatní objekty v příkazu směrování by měly mít možnost zpracovávat zprávy.

Viz také

Další zdroje

Technické poznámky podle čísel

Technické poznámky podle kategorií