TN006: Mesaj Maps

Bu notu mfc iletisi göster tesis açıklar.

Sorunu

Microsoft Windows, kendi ileti özelliğini kullanarak pencere sınıfları esas sanal fonksiyonları nelerdir uygular. Çok sayıda ileti yer nedeniyle, her Windows ileti için ayrı bir sanal işlevi sağlayan prohibitively büyük vtable içinde sonuç.

Ayrıca, sistem tanımlı Windows ileti sayısı zaman içinde değişir ve belirli bir uygulama bazı Windows mesajları kendi tanımlamak isteyebilirsiniz çünkü, bir düzey mevcut kod kırma arabirimi değişiklikleri engelleyen dolaylı mesaj-harita mekanizma sağlar.

Genel bakış

Mfc pencere gönderilen iletileri işlemek için geleneksel Windows programlarında kullanılan switch deyimi bir alternatif sağlar. Bir pencere tarafından ele alınması için bir mesaj olduğunu, uygun üye işlevi otomatik olarak denir böylece üye işlevler iletilerden bir eşleme kullanılarak tanımlanabilir. Bu iletiyi göster tesis sanal işlevlerine benzer olacak şekilde tasarlanmıştır ancak ek yararları c++ sanal fonksiyonları ile mümkün olan.

Bir iletiyi göster tanımlama

declare_message_map makro bir sınıf için üç üyesi ilan etti.

Bu makro, ileti haritalar kullanılarak herhangi bir sınıf bildiriminde yerleştirilmelidir. Kongre tarafından sınıf bildirisinin sonudur. Örneğin:

cMyW&nd sınıfı: Genel CMyParentWndClass
{
 nbsp;  / / benim malzeme...

Korumalı:
    //{{AFX_MSG(CMyWnd)
    afx_msg void OnPaint();
    //}}AFX_MSG

DECLARE_MESSAGE_MAP()
}

Bu yeni sınıf oluşturduğunuzda, AppWizard ve ClassWizard tarafından üretilen biçimidir. / / {{Ve / /}} destekleri için ClassWizard ihtiyaç vardır.

İletiyi göster'ın tablo genişletmek için ileti eşleme girdilerini makro kümesiyle tanımlanır. Tablo, bu iletiyi göster tarafından işlenir sınıf ve hangi işlenemeyen iletiler iletilir üst sınıf tanımlayan bir BEGIN_MESSAGE_MAP makro çağrısı ile başlar. Tablo end_message_map makro çağrısı ile sona erer.

Bu iki makro aramalar arasında bu iletiyi göster tarafından ele alınması her iletinin bir girdidir. Her standart Windows ileti makro formu o ileti için bir giriş oluşturur (burada xxx ileti adıdır) ON_WM_xxx vardır.

Standart fonksiyon imza, her Windows ileti parametrelerinin açma ve tür güvenliği sağlamak için tanımlanmış. Bu imzaları AFXWIN dosyasında bulunabilir.H CWnd bildiriminde. Her biri kolay tanımlanması için kelime afx_msg ile işaretlenmiş.

&Notnbsp;  ClassWizard requires that you use afx_msg anahtar kelime, ileti göster işleyici bildirimleri.

Bu işlev imzaları, basit bir kuralı kullanılarak elde edilmiştir. İşlevin adını her zaman "Açık" ile başlar. Bu kaldırılan wm_ Windows ileti adını ve sadece tarafından izliyor her sözcüğün ilk harfini büyük harfle yazılmış. Parametreleri sipariş takip wParam olduğunu loword (lParam) sonra HIWORD(lParam). Kullanılmayan parametreler geçmedi. mfc sınıfları tarafından sarılmış olan herhangi bir tanıtıcı işaretçiler uygun mfc nesnelerine dönüştürülür. Aşağıdaki örnek nasıl WM_PAINT iletiyi işlemek ve CMyWnd neden gösterir:: OnPaint çağrılacak işlev

BEGI&N_MESSAGE_MAP (CMyWnd, CMyParentWndClass)
 nbsp;  //{{AFX_MSG_MAP(CMyWnd)
    ON_WM_PAINT()
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

İletiyi göster tablo herhangi bir işlev veya sınıf tanımı kapsamı dışında tanımlanması gerekir. O bir extern "c" blok içinde yer almalıdır değil.

&Notnbsp;  ClassWizard arasında bulunan ileti eşleme girdilerini düzenleme / / {{ve / /}} yorum aparatı.

Windows mesajları kullanıcı tanımlı

Kullanıcı tanımlı iletileri, bir iletinin haritasında on_message makro kullanarak eklenebilir. Bu makro bir ileti numarası ve formun bir üye işlev kabul eder.:

nbsp;   / / içinde sınıf bildirimi
    afx_msg lresult OnMyMessage(WPARAM wParam, LPARAM lParam);

Örneğin:
    # define wm_mymessage (wm_user + 100)

BEGI&N_MESSAGE_MAP (CMyWnd, CMyParentWndClass)
    on_message (wm_mymessage, OnMyMessage)
END_MESSAGE_MAP()

Örneğin, standart wm_user için kullanıcı tanımlı iletileri temel türetilen Windows ileti kimliği özel bir ileti için bir işleyici oluşturun. Bu işleyici kodu gibi çağırmak:

CWnd * pWnd =...;
pWnd-gt;SendMessage(WM_MYMESSA&GE)

Bu yaklaşımı kullanarak kullanıcı tanımlı ileti aralığı 0x7fff ile wm_user aralığında olmalıdır.

&Notnbsp;  ClassWizard girme on_message işleyicisi rutinleri ClassWizard kullanıcı arabiriminden desteklemez: elle Visual c++ Editör'den girmeniz gerekir. Bir kez girmiş, ClassWizard bu girdileri ayrıştırmak ve onları sadece herhangi bir diğer mesaj-eşleme girdilerini gibi insanlar izin.

Kayıtlı Windows mesajları

:: RegisterWindowMessage işlevi tüm sistemde benzersiz olduğu garanti yeni bir pencerede ileti tanımlamak için kullanılır. Makro ON_REGISTERED_MESSAGE , bu iletileri işlemek için kullanılır. Bu makro kabul eden bir kayıtlı windows içeren yakın bir UINT değişkeni adı ileti kimliği. Örneğin

cMyWnd sınıfı: Genel CMyParentWndClass
{
public:
 nbsp;  CMyWnd();

//{{AFX_MSG(CMyWnd)
    afx_msg lresult OnFind(WPARAM wParam, LPARAM lParam);
    //}}AFX_MSG

DECLARE_MESSAGE_MAP()
};

statik UI&NT YAKININDAKİ WM_FIND = RegisterWindowMessage("COMMDLG_FIND");

BEGIN_MESSAGE_MAP (CMyWnd, CMyParentWndClass)
    //{{AFX_MSG_MAP(CMyWnd)
    ON_REGISTERED_MESSAGE (WM_FIND, OnFind)
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

Kayıtlı Windows ileti kimliği (yukarıdaki örnekte WM_FIND) değişken ON_REGISTERED_MESSAGE uygulanan biçimi nedeniyle çevre değişken olmalıdır.

Bu yaklaşımı kullanarak kullanıcı tanımlı ileti aralığı 0xC000 0xFFFF aralığında olacaktır.

&Notnbsp;  ClassWizard girme ON_REGISTERED_MESSAGE işleyicisi rutinleri ClassWizard kullanıcı arabiriminden desteklemiyor, el ile Metin Düzenleyicisi'nden girmeniz gerekir. Bir kez girmiş, ClassWizard bu girdileri ayrıştırmak ve onları sadece herhangi bir diğer mesaj-eşleme girdilerini gibi insanlar izin.

Komutu iletileri

Menüler ve Hızlandırıcılar komutu iletileri, ileti Maps on_command makro işlenir. Bu makro, bir üye işlev yanı sıra bir komut kimliği kabul eder. Yalnızca belirli wm_command ile bir wParam kimliği üye işlevi ile işlenir komut eşit mesaj-eşleme girdisinde belirtilen. Komut işleyici üye işlevleri parametre alır ve void dönüş. Makro formu vardır:

 On_command (ID, memberFxn)

Komut güncelleştirme iletileri aynı mekanizma olarak on_command işleyicisi aracılığıyla yönlendirilir. ON_UPDATE_COMMAND_UI makro yerine kullanılır. Komut güncelleştirme işleyicisi üye işlevleri tek bir parametre, bir CCmdUI nesnesi işaretçisi almak ve void dönüş. Makro formu vardır

ON_UPDATE_COMMAND_UI (ID, memberFxn)

Gelişmiş kullanımlar için kullanılabilir komut ileti işleyicileri bir genişletilmiş biçimidir. on_command_ex makro yerine kullanılır ve bir üst on_command işlevselliği sağlar. Genişletilmiş komut işleyicisi üye işlevleri tek bir parametre, komut kimliği içeren bir UINT almak ve bool dönün. bool dönüş komutu işlenene belirtmek için doğru olmalı, aksi takdirde yönlendirme diğer komut hedef nesnelere devam edecek.

Yukarıdaki form örnekleri:

Ayrıca ileri düzey kullanımı bir tek komut işleyicisi ile komutları bir dizi işlemek izin on_command_range ve on_command_range_ex için kullanılabilir. Daha fazla bilgi için ürün belgelerine bakın bu makroları.

&Notnbsp;  ClassWizard oluşturma on_command ve ON_UPDATE_COMMAND_UI işleyicilerini destekler, ancak oluşturma on_command_ex ya da on_command_range işleyicileri desteklemez. Ancak, sınıf Sihirbazı ayrıştırmak ve tüm üç komut işleyicisi değişik insanlar izin.

Denetim bildirim iletileri

Çocuk denetimlerden bir pencereye sahip fazladan bit bilgi mesajı gönderilen iletileri göster girişi: denetimin kimliği. Bir ileti eşleme girdisinde belirtilen ileti işleyicisi sadece (1) denetim bildirim kodunu (yüksek kelime lParam), BN_CLICKED gibi maçlar mesaj-eşleme girdisinde belirtilen bildirim kodu ve (2) denetim kimliği (wParam) mesaj-eşleme girdisinde belirtilen denetim kimliği eşleşiyorsa denir.

Özel Denetim bildirim iletileri on_control makro bir ileti göster girişi özel bildirim kodu ile tanımlamak için kullanabilirsiniz. Bu makro formu vardır

On_control (wNotificationCode, No, memberFxn)

Gelişmiş kullanım için on_control_range ile aynı işleyicinin belirli denetim bildirim denetimleri bir dizi işlemek için kullanılabilir.

ClassWizard, kullanıcı arabiriminde bir on_control ya da on_control_range işleyicisi oluşturulmasını desteklemiyor; bunları el ile metin düzenleyicisiyle girmeniz gerekir. Bir kez girmiş, ClassWizard bu girdileri ayrıştırmak ve onları sadece herhangi bir diğer ileti eşleme girdilerini gibi insanlar izin.

Windows ortak denetimler daha güçlü WM_NOTIFY karmaşık denetimi bildirimleri için faydalanmak. mfc bu sürümü bu yeni ileti ON_NOTIFY ve ON_NOTIFY_RANGE makrolar doğrudan desteği vardır. Daha fazla bilgi için ürün belgelerine bakın bu makroları.

Teknik notlar numarasına göre |nbsp; Teknik notlar kategorisine göre

Index