Sdílet prostřednictvím


Obslužné rutiny pro standardní zprávy Windows

Výchozí obslužné rutiny pro standardní zprávy systému Windows (WM_) jsou předem definovány ve třídě CWnd.Knihovna tříd bude založena na název zprávy názvy pro tyto obslužné rutiny.Například obslužná rutina WM_PAINT zpráva je deklarován v CWnd jako:

afx_msg void OnPaint();

Afx_msg klíčové slovo naznačuje vliv C++ virtuální klíčové slovo rozlišuje obslužné rutiny z jiné CWnd členské funkce.Uvědomte si však, že tyto funkce nejsou ve skutečnosti virtuální; Místo toho jsou implementovány prostřednictvím zprávy mapy.Zpráva mapy závisí výhradně na standardní preprocesoru makra není na žádné rozšíření pro jazyk C++.Afx_msg klíčové slovo překládá na prázdné místo po úpravě před zpracováním.

Přepsat obslužná rutina definována v základní třídě, jednoduše Definujte funkci s stejný prototyp v odvozené třídě a vytvořit položku mapu zpráv obslužné rutiny.Vaše obslužná rutina "přepisuje" všechny obslužné rutiny v některém z vaší třídy základní třídy se stejným názvem.

V některých případech vaše obslužná rutina by měl zavolat přepsané obslužné rutiny v základní třídě tak základní třídy a systém Windows může pracovat ve zprávě.Pokud volání základní třídy obslužné rutiny ve vaší přepsané závisí na okolnostech.Někdy je nutné nejprve volat základní třídy obslužné rutiny a někdy naposledy.Někdy můžete volat základní třídy obslužné rutiny podmíněně, pokud se rozhodnete zpracovat zprávu sami sobě.Někdy by volání základní třídy obslužné rutiny a poté podmíněnému spuštění kódu vlastní obslužné rutiny, v závislosti na hodnotu nebo stav vrácený základní třídy obslužné rutiny.

Poznámka k upozorněníUpozornění

Není bezpečné změnit argumenty předané do obslužnou rutinu, pokud máte v úmyslu předat obslužné rutiny základní třídy.Například můžete svádět k úpravě nChar argument OnChar rutinu (převést na velká písmena, například).Toto chování je poměrně zakrývají, ale pokud potřebujete provádět tento efekt použít CWnd členské funkce SendMessage místo.

Jak můžete určit správný způsob, jak obejít dané zprávy?Když okno Vlastnosti zapíše kostru obslužné rutiny pro danou zprávu – OnCreate obslužnou rutinu pro WM_CREATE, například – nákresy ho ve formě doporučené přepsané členskou funkci.V následujícím příkladu doporučuje obslužná rutina první volání základní třídy obslužné rutiny a pokračovat pouze pod podmínkou, že nevrací –1.

int CMyView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
   if (CFormView::OnCreate(lpCreateStruct) == -1)
      return -1;

   // TODO:  Add your specialized creation code here 

   return 0;
}

Úmluvou názvy těchto rutin začíná předponou "." Některé tyto obslužné rutiny během několika ostatním uživatelům přijmout žádné argumenty.Některé mají také návratový typ než void.Obslužné rutiny výchozí pro všechny WM_ zpráv jsou popsány v Odkaz knihovny MFC jako členské funkce třídy CWnd jejichž názvy začínají řetězcem "On". Deklarace funkce členů v CWnd jsou s předponou afx_msg.

Viz také

Koncepty

Deklarace funkcí obslužných rutin zpráv