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.
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.