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ředdefinované ve třídě CWnd. Knihovna tříd založí názvy těchto obslužných rutin na názvu zprávy. Obslužná rutina zprávy WM_PAINT je například deklarována CWnd takto:

afx_msg void OnPaint();

Klíčové slovo afx_msg navrhuje účinek klíčového slova C++ virtual odlišením obslužných rutin od jiných CWnd členských funkcí. Upozorňujeme však, že tyto funkce nejsou ve skutečnosti virtuální; místo toho se implementují prostřednictvím map zpráv. Mapy zpráv závisí výhradně na standardních makrech preprocesoru, ne na žádném rozšíření jazyka C++. Klíčové slovo afx_msg se po předběžném zpracování přeloží na prázdné znaky.

Chcete-li přepsat obslužnou rutinu definovanou v základní třídě, jednoduše definujte funkci se stejným prototypem v odvozené třídě a vytvořte položku mapy zpráv pro obslužnou rutinu. Obslužná rutina "přepíše" jakoukoli obslužnou rutinu se stejným názvem v jakékoli základní třídě vaší třídy.

V některých případech by obslužná rutina měla volat přepsánou obslužnou rutinu v základní třídě, aby základní třídy a Windows mohly pracovat se zprávou. Při volání obslužné rutiny základní třídy v přepsání závisí na okolnostech. Někdy musíte nejprve zavolat obslužnou rutinu základní třídy a někdy také poslední. Někdy voláte obslužnou rutinu základní třídy podmíněně, pokud se rozhodnete zprávu nezpracovávat sami. Někdy byste měli volat obslužnou rutinu základní třídy a pak podmíněně spustit vlastní kód obslužné rutiny v závislosti na hodnotě nebo stavu vrácené obslužnou rutinou základní třídy.

Upozornění

Není bezpečné upravit argumenty předané obslužné rutině, pokud je chcete předat obslužné rutině základní třídy. Můžete být například lákaví změnit argument nChar OnChar obslužné rutiny (například převést na velká písmena). Toto chování je poměrně nejasné, ale pokud potřebujete tento efekt provést, použijte místo toho členovu CWnd funkci SendMessage .

Jak určíte správný způsob přepsání dané zprávy, když Průvodce třídou zapíše kostru funkce obslužné rutiny pro danou zprávu – obslužnou rutinu OnCreate pro WM_CREATE , například – načrtá ve formě doporučené přepsané členské funkce. Následující příklad doporučuje, aby obslužná rutina nejprve volala obslužnou rutinu základní třídy a pokračovala pouze v podmínce, že nevrací -1.

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

   // TODO:  Add your specialized creation code here

   return 0;
}

Podle konvence začínají názvy těchto obslužných rutin předponou "Zapnuto". Některé z těchto obslužných rutin nezabírají žádné argumenty, zatímco jiné berou několik. Některé mají také návratový typ jiný než void. Výchozí obslužné rutiny pro všechny WM_ zprávy jsou zdokumentovány v odkazu MFC jako členské funkce třídy CWnd , jejichž názvy začínají na "Zapnuto". Deklarace členské funkce jsou CWnd předponou afx_msg.

Viz také

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