Obslužné rutiny pro standardní zprávy systému Windows
Výchozí ovladače pro standardní zprávy systému Windows (WM_) jsou předdefinované třídy CWnd.Knihovna tříd vypočítá názvy pro tyto ovladače na název zprávy.Například obslužnou rutinu pro WM_PAINT zpráva je deklarován v CWnd jako:
afx_msg void OnPaint();
Afx_msg účinek C++ navrhne klíčové slovo virtuální klíčové slovo rozlišuje obslužných rutin z jiné CWnd funkce členů.Upozorňujeme však, že tyto funkce nejsou ve skutečnosti virtuální; místo toho jsou implementovány pomocí mapy zprávy.Mapy zprávy závisí výhradně na standardní makra preprocesoru, není na žádné rozšíření jazyka C++.Afx_msg klíčové slovo se překládá na prázdné místo po úpravě před zpracováním.
Potlačit obsluhu definované v základní třídě jednoduše definujte funkci s stejné prototypu v odvozené třídě a vytvořit položku mapy zprávy obslužné rutiny.Váš popisovač "přepíše" jakékoli zpracování se stejným názvem v žádné z vaší třídy základní třídy.
V některých případech by vaše popisovač volání Potlačené popisovač v základní třídě, tak základní třídy a systému Windows může pracovat ve zprávě.Kde volání rutiny základní třída v přepsání vaší závisí na okolnostech.Někdy musíte nejprve volání rutiny základní třída a někdy poslední.Někdy volání rutiny základní třída podmíněně, pokud se rozhodnete sami zpracovat zprávu.Někdy by volání rutiny základní třída pak podmíněně spustit vlastní kód zpracování, v závislosti na hodnotě nebo stav vrácený popisovač základní třída.
Upozornění |
---|
Není bezpečné upravit argumenty předané do obsluhu, pokud máte v úmyslu předat obsluze základní třída.Například můžete svádět k úpravě nChar argument OnChar popisovač (převést na velká písmena, například).Toto chování je poměrně zakrývají, ale potřebujete-li provést tento efekt použít CWnd členské funkce SendMessage místo. |
Jak můžete určit správný způsob potlačit danou zprávu?Když okno Vlastnosti zapíše kostra funkci zpracování zprávy – OnCreate obslužnou rutinu pro WM_CREATE, například – jej sketches ve formě doporučené Potlačené členské funkce.Následující příklad doporučuje obslužné nejprve základní třída popisovač volání 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 obsluhy začíná předponou "." Některé tyto ovladače během několika ostatními nezbytná žádné argumenty.Některé také obsahovat návratový typ než void.Výchozí ovladače pro všechny WM_ zpráv jsou popsány v MFC odkaz jako funkce členů třídy CWnd jejichž názvy začínají řetězcem "Na". Deklarace funkce člena v CWnd jsou s předponou afx_msg.