2008-10-14 12 views
5

Zastanawiam się, jaka (jeśli w ogóle) była różnica między następującymi dwoma pułapkami komunikatów w MFC dla funkcji, OnSize (..).Trapowanie wiadomości w MFC - Jaka jest różnica?

1 - za pośrednictwem wiadomości na mapie:

BEGIN_MESSAGE_MAP(CClassWnd, CBaseClassWnd) 
... 
    ON_WM_SIZE() 
.. 
END_MESSAGE_MAP() 

2 - Via afx_message:

afx_msg type OnSize(...); 

Wydają się być używane zamiennie, które należy stosować, czy też zależy od innych czynników?

Odpowiedz

12

Obie części są niezbędne, aby dodać procedurę obsługi wiadomości do klasy. Mapa komunikatów powinna zostać zadeklarowana wewnątrz twojej klasy, razem z deklaracjami dla jakichkolwiek funkcji obsługi komunikatów (np. OnSize).

class CClassWnd : public CBaseClassWnd { 
    ... 
    afx_msg void OnSize(UINT nType, int cx, int cy); 
    DECLARE_MESSAGE_MAP 
}; 

afx_msg jest tylko pustym zastępczy makro - w rzeczywistości nie robić nic, ale zawsze jest wliczone umownie.

Komunikat mapa jest następnie zdefiniowane w pliku .cpp klasy za:

BEGIN_MESSAGE_MAP(CClassWnd, CBaseClassWnd) 
    ON_WM_SIZE() 
END_MESSAGE_MAP() 

Makra te generują tabeli odnośników do klasy, która pozwala wiadomości otrzymane przez okna, aby być wysłane do odpowiednich funkcji obsługi. Makro ON_WM_SIZE zezwala na dekodowanie parametrów wiadomości i WM_SIZE na bardziej znaczące wartości dla funkcji komunikatora (nType, cx i cy w tym przypadku). MFC udostępnia makra dla większości wiadomości w oknie (WM_LBUTTONDOWN, WM_DESTROY itd.).

Możesz znaleźć więcej informacji o tym, jak działają mapy wiadomości w MFC here na MSDN.

3

afx_msg jest po prostu pustym makrem, zasadniczo jest tam po to, aby wskazać, że metoda jest funkcją obsługi komunikatów MFC dla celów czytelności. Nawet z afx_msg nadal musisz mieć wpis na mapie wiadomości.

+0

Miło wiedzieć, że coś, nad czym zastanawiałem się przez jakiś czas. Może mam zbyt dużo czasu na rękach ...;) –

0

Niektóre z komunikatów systemu Windows są już obsługiwane przez MFC, więc w takich przypadkach można uciec z dodaniem tylko tej metody do klasy pochodnej.

Na przykład cwnd klasy (podobnie jak wielu innych klas MFC) już odwzorowuje kilka komunikatów Windows do swojego wiadomość map (tj ON_WM_DRAWITEM, ON_WM_MEASUREITEM, ON_WM_ENTERIDLE etc, etc).

Jednak każda inna wiadomość, która nie została jeszcze zmapowana przez MFC, będzie wymagać zarówno metody klasy, jak i wpisu na mapie komunikatów, aby działała.

Powiązane problemy