2008-10-14 9 views
5

Sadece (eğer varsa) fark, MFC'de aşağıdaki iki mesaj tuzağı arasındaki farkdı (OnSize (..)).MFC'de iletileri yakalama - Fark nedir?

1 - Via Mesaj haritası:

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

2 - afx_message Via:

afx_msg type OnSize(...); 

Onlar birbirlerinin yerine kullanılabilir görünmektedir, biri kullanılmalıdır veya diğer faktörlere bağlıdır?

cevap

12

Her iki parça da bir sınıfa bir ileti işleyicisi eklemek için gereklidir. Mesaj haritası, herhangi bir mesaj işleyici işlevi için bildirimlerle birlikte sınıfınızın içinde beyan edilmelidir (ör. OnSize). aslında bir şey yapmaz, ama her zaman kongre tarafından dahildir -

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

afx_msg sadece boş yer tutucu makrosudur.

mesajı haritası

sonra sınıfın .cpp dosyasında tanımlanır:

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

Bu makrolar pencere tarafından alınan mesajları ilgili işleyici fonksiyonları sevk edilmesini sağlar sınıf için bir arama tablosu oluşturur. ON_WM_SIZE makro WM_SIZE mesajda wParam ve lParam mesajı parametreleri ileti işleyicisi işlevi (bu durumda nType, cx ve cy) için daha anlamlı değerlere deşifre edilmesini sağlar. MFC, çoğu pencere mesajı için makrolar sağlar (WM_LBUTTONDOWN, WM_DESTROY, vb.).

İleti haritalarının, MSDN'de MFC here'da nasıl çalıştığı hakkında daha fazla bilgi bulabilirsiniz.

3

afx_msg sadece boş bir makrodur, yalnızca burada yöntemin okunabilirlik amacıyla bir MFC ileti işleyicisi olduğunu belirtmek içindir. Afx_msg ile bile, mesaj haritasına hala bir girişiniz olması gerekir.

+0

Bunu bilmek güzel, bir süredir merak ettiğim bir şey. Belki ellerimde çok fazla zamanım var ...;) –

0

Windows iletisinin bir kısmı zaten MFC tarafından işleniyor, bu nedenle, bu tür durumlarda yalnızca türetilmiş sınıfınıza bir yöntem ekleyerek kurtulup alabilirsiniz.

Örneğin CWnd sınıf (diğer birçok MFC sınıfları yapmak gibi) zaten içine birkaç Windows iletilerini eşleyen mesajı haritası bulunuyor (yani ON_WM_DRAWITEM, ON_WM_MEASUREITEM, ON_WM_ENTERIDLE vs, vs). Ancak, MFC tarafından henüz eşlenmemiş olan diğer herhangi bir iletinin, çalışması için ileti haritasında bir sınıf yöntemine ve girdisine sahip olması gerekir.