Programy obsługi dla standardowych komunikatów systemu Windows
Domyślne programy obsługi standardowych komunikatów systemu Windows (WM_) są wstępnie zdefiniowane w klasie CWnd
. Biblioteka klas bazuje nazwy tych procedur obsługi w nazwie komunikatu. Na przykład program obsługi komunikatu WM_PAINT jest zadeklarowany jako CWnd
:
afx_msg void OnPaint();
Słowo kluczowe afx_msg sugeruje efekt słowa kluczowego języka C++ virtual
, rozróżniając programy obsługi od innych CWnd
funkcji składowych. Należy jednak pamiętać, że te funkcje nie są rzeczywiście wirtualne; są one zamiast tego implementowane za pomocą map komunikatów. Mapy komunikatów zależą wyłącznie od standardowych makr preprocesora, a nie od rozszerzeń języka C++. Słowo kluczowe afx_msg jest rozpoznawane jako białe znaki po wstępnym przetwarzaniu.
Aby zastąpić procedurę obsługi zdefiniowaną w klasie bazowej, po prostu zdefiniuj funkcję z tym samym prototypem w klasie pochodnej i utwórz wpis mapy komunikatów dla programu obsługi. Procedura obsługi "zastępuje" dowolną procedurę obsługi o tej samej nazwie w dowolnej z klas bazowych klasy klasy.
W niektórych przypadkach program obsługi powinien wywołać program obsługi przesłoniętej w klasie bazowej, aby klasa bazowa (es) i system Windows mógł działać na komunikacie. W przypadku wywoływania programu obsługi klasy bazowej w zastąpieniu zależy od okoliczności. Czasami należy najpierw wywołać program obsługi klasy bazowej, a czasami ostatni. Czasami program obsługi klasy bazowej jest wywoływany warunkowo, jeśli nie chcesz obsługiwać komunikatu samodzielnie. Czasami należy wywołać program obsługi klasy bazowej, a następnie warunkowo wykonać własny kod programu obsługi, w zależności od wartości lub stanu zwróconego przez program obsługi klasy bazowej.
Uwaga
Nie można bezpiecznie zmodyfikować argumentów przekazanych do programu obsługi, jeśli zamierzasz przekazać je do programu obsługi klasy bazowej. Na przykład możesz skusić się na zmodyfikowanie argumentu OnChar
nChar programu obsługi (na przykład w celu przekonwertowania na wielkie litery). To zachowanie jest dość niejasne, ale jeśli chcesz osiągnąć ten efekt, zamiast tego użyj funkcji SendMessage
składowejCWnd
.
Jak określić właściwy sposób zastąpienia danego komunikatu Gdy Kreator klas zapisuje szkielet funkcji obsługi dla danego komunikatu — OnCreate
program obsługi dla WM_CREATE, na przykład — szkicuje w postaci zalecanej funkcji przesłoniętej składowej. W poniższym przykładzie zaleca się, aby program obsługi najpierw wywołał program obsługi klasy bazowej i postępował tylko pod warunkiem, że nie zwraca -1.
int CMyView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFormView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
return 0;
}
Zgodnie z konwencją nazwy tych procedur obsługi zaczynają się od prefiksu "Włączone". Niektóre z tych procedur obsługi nie przyjmują żadnych argumentów, podczas gdy inne przyjmują kilka. Niektóre z nich mają również typ zwracany inny niż void
. Domyślne programy obsługi wszystkich komunikatów WM_ są udokumentowane w dokumentacji MFC jako funkcji składowych klasy CWnd
, której nazwy zaczynają się od "Włączone". Deklaracje funkcji składowej w pliku CWnd
są poprzedzone afx_msg.