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.