TN061: ON_NOTIFY ve WM_NOTIFY iletileri
Not
İlk çevrimiçi belgelerinde yer almıştır beri aşağıdaki teknik Not güncelleştirilmedi.Sonuç olarak bazı yordamlar ve konuları eski veya yanlış.En son bilgiler için çevrimiçi belgelere dizini ilgilendiğiniz konu aramak önerilir.
Bu teknik notu yeni bilgiler sağlar WM_NOTIFY iletisi ve işleme önerilen (ve yaygın) biçimini tanımlar WM_NOTIFY mfc uygulama iletileri.
Windows 3.x bildirim iletileri
Windows 3.x'te denetimleri fare tıklatmaları gibi olayların Anne bildir içeriği ve seçim ve Denetim arka plan boyama üst bir ileti göndererek değiştirir. Basit bildirimleri gibi özel gönderilir wm_command iletiler, bildirim kodu (gibi BN_CLICKED) ve içine paketlenmiş kimlik denetimi wParam ve denetimin tutamacını, lParam. Bu yana dikkat wParam ve lParam olan tam ek verileri aktarmak için başka bir yolu yoktur — bu iletiler yalnızca basit bildirim olabilir. Örneğin, BN_CLICKED bildirimi, düğme tıklatıldığında, fare imlecini konumu hakkında bilgi göndermek için başka bir yolu yoktur.
Denetimleri Windows 3.x ek veriyi içeren bir bildirim iletisi göndermeniz gerektiğinde, özel amaçlı iletiler de dahil olmak üzere, çeşitli kullandıkları WM_CTLCOLOR, WM_VSCROLL, WM_HSCROLL, WM_DRAWITEM, WM_MEASUREITEM, WM_COMPAREITEM, WM_DELETEITEM, WM_CHARTOITEM, WM_VKEYTOITEMve benzeri. Bu iletileri yeniden onlara gönderilen denetim yansıtılması. Daha fazla bilgi için bkz: TN062: Windows denetimleri için ileti yansıtma.
Win32 bildirim iletileri
Windows 3.1 vardı denetimler için Win32 API bildirim iletileri, Windows 3.x'te kullanılan çoğu kullanır. Ancak, Win32 de Gelişmiş ve karmaşık denetimler sayısı Windows 3.x'te desteklediği ekler. Sık sık, bu denetimler ek verilerle kendi bildirim iletilerini göndermek gerekir. Yeni bir ekleme yerine wm_ * için gereken ek veriler, Win32 API tasarımcıları her yeni bir bildirim yalnızca bir ileti eklemek seçtiğiniz ileti WM_NOTIFY, hangi iletebilir herhangi bir ek veri miktarını standartlaştırılmış biçimde.
WM_NOTIFY iletileri içeren ileti gönderirken denetimin kimliği wParam ve bir yapıda bir işaretçi lParam. Bu yapı olması bir nmhdr yapısı ya da olan bazı büyük yapısı bir nmhdr yapısı olarak kendi ilk üyesi. Bu yana dikkat nmhdr üye olan ilk, ya da bir işaretçi işaretçi Bu yapı için kullanılan bir nmhdr veya nasıl artığını bağlı büyük yapısına işaretçinin.
Çoğu durumda, işaretçinin daha büyük bir yapıya işaret edecek ve kullandığınızda artığını gerekecektir. Genel bildirimler gibi yalnızca birkaç bildirimlerin (adları başlayarak nm_) ve araç ipucu denetimin ttn_show ve ttn_pop bildirimleri olan bir nmhdr gerçekten kullanılan yapı.
nmhdr tanıtıcı ve iletinin bildirim kodunu gönderirken denetimin kimliği yapısı veya ilk üye içerir (örneğin ttn_show). Biçimi, nmhdr yapısı aşağıda gösterilen:
typedef struct tagNMHDR {
HWND hwndFrom;
UINT idFrom;
UINT code;
} NMHDR;
İçin bir ttn_show , ileti kod üye ayarlanabilir ttn_show.
Çoğu bildirimleri bir işaretçi içeren daha büyük bir yapıya geçirmek bir nmhdr yapısı olarak kendi ilk üyesi. Örneğin, liste görünümünde denetimin tarafından kullanılan yapı dikkate lvn_keydown bir liste görünüm denetimi bir tuşa basıldığında gönderilen bildirim iletisi. İşaretçi işaret için bir lv_keydown yapısı aşağıdaki gibi tanımlanır:
typedef struct tagLV_KEYDOWN {
NMHDR hdr;
WORD wVKey;
UINT flags;
} LV_KEYDOWN;
Bu yana dikkat nmhdr üyesidir, bu yapı içinde ilk, ya da bir işaretçi için bildirim iletisinde geçirilen işaretçi tonunu bir nmhdr veya işaretçi bir lv_keydown.
Tüm yeni Windows denetimleri bildirimleri ortak
Bazı bildirimler tüm yeni Windows denetimleri ortaktır. Bu bildirimler bir işaretçi geçmesi bir nmhdr yapısı.
Bildirim kodu |
Çünkü gönderilen |
---|---|
NM_CLICK |
Kullanıcı denetimi farenin sol düğmesini tıklattınız. |
NM_DBLCLK |
Kullanıcı başlarlar sol fare düğmesi denetimi |
NM_RCLICK |
Kullanıcı denetimi farenin sağ düğmesini tıklattınız. |
NM_RDBLCLK |
Kullanıcı başlarlar sağ fare düğmesi denetimi |
NM_RETURN |
Denetim odağı giriş iken enter tuşuna basıldığında kullanıcı |
NM_SETFOCUS |
Denetim için verilen giriş odağı |
NM_KILLFOCUS |
Giriş odaklı denetim kaybetti |
NM_OUTOFMEMORY |
Denetim bir işlem tamamlanamadı çünkü kullanılabilir yeterli bellek yoktu |
ON_NOTIFY: mfc uygulamaları WM_NOTIFY iletileri işleme
İşlev CWnd::OnNotify bildirim iletilerini işleme. Kendi varsayılan uygulama bildirim işleyicisi çağırmak ileti eşleme denetler. Genel olarak, sizin değil geçersiz OnNotify. Bunun yerine bir işleyici işlevi sağlamak ve sahibi pencere sınıfı ileti haritasını Bu işleyici için ileti eşleme girdisi ekleme.
ClassWizard, ClassWizard özellik sayfası oluşturup ON_NOTIFY ileti eşleme girişi ve iskelet işleyici işlevi ile sağlar. ClassWizard kolaylaştırmak için kullanma hakkında daha fazla bilgi için bkz: İletileri işlevleri eşleme.
ON_NOTIFY İleti eşleme makro aşağıdaki sözdizimi vardır:
ON_NOTIFY( wNotifyCode, id, memberFxn )
Burada italik parametreleri ile değiştirilir:
wNotifyCode
Bildirim iletisinin gibi ele kod lvn_keydown.id
Bildirimin gönderildiği denetim alt tanıtıcısı.memberFxn
Bu bildirim gönderildiğinde adlı üye işlevi.
Sizin üye işlevi ile aşağıdaki prototipe bildirilmelidir:
afx_msg void memberFxn( NMHDR * pNotifyStruct, LRESULT * result );
Notlar
Burada italik Parametreler şunlardır:
pNotifyStruct
Yukarıdaki bölümde açıklandığı şekilde bildirim yapısı için işaretçi.Sonuç
Sonuç kodu için bir işaretçi, döndürmeden önce ayarlarsınız.
Örnek
Üye işlevi istediğinizi belirtmek için OnKeydownList1 işlemek için lvn_keydown gelen iletileri CListCtrl whose kimliği IDC_LIST1, ClassWizard, aşağıdaki iletiyi Haritası'na eklemek için kullanabilirsiniz:
ON_NOTIFY( LVN_KEYDOWN, IDC_LIST1, OnKeydownList1 )
Yukarıdaki örnekte, ClassWizard tarafından sağlanan işlev gösterir.
void CMessageReflectionDlg::OnKeydownList1(NMHDR* pNMHDR, LRESULT* pResult)
{
LV_KEYDOWN* pLVKeyDow = (LV_KEYDOWN*)pNMHDR;
// TODO: Add your control notification handler
// code here
*pResult = 0;
}
Not ClassWizard uygun türde bir işaretçi otomatik olarak sağlar. Bildirim yapısı yoluyla erişebilirsiniz pNMHDR veya pLVKeyDow.
ON_NOTIFY_RANGE
Aynı işlemi gerekiyorsa, WM_NOTIFY ileti kullanabileceğiniz bir denetimler kümesine ON_NOTIFY_RANGE yerine ON_NOTIFY. Örneğin, belirli bir bildirim iletisi için aynı eylemi gerçekleştirmek istediğiniz düğme kümesi olabilir.
Kullandığınızda ON_NOTIFY_RANGE, alt tanımlayıcıları için alt tanımlayıcıları aralığın bitiş ve başlangıç belirterek uyarı iletisi işlemek bitişik aralığını belirtin.
ClassWizard işlemiyor ON_NOTIFY_RANGE; Bunu kullanmak için ileti haritanızda kendiniz düzenlemeniz gerekir.
İleti eşleme girişi ve işlev prototipi ON_NOTIFY_RANGE şunlardır:
ON_NOTIFY_RANGE( wNotifyCode, id, idLast, memberFxn )
Burada italik parametreleri ile değiştirilir:
wNotifyCode
Bildirim iletisinin gibi ele kod lvn_keydown.id
Tanımlayıcılar bitişik aralığındaki ilk tanımlayıcısı.idLast
Tanımlayıcılar bitişik aralıktaki son tanımlayıcısı.memberFxn
Bu bildirim gönderildiğinde adlı üye işlevi.
Sizin üye işlevi ile aşağıdaki prototipe bildirilmelidir:
afx_msg void memberFxn( UINT id, NMHDR * pNotifyStruct, LRESULT * result );
Notlar
Burada italik Parametreler şunlardır:
id
Gönderilen bildirim denetim alt tanıtıcısı.pNotifyStruct
Yukarıda açıklandığı gibi bildirim yapısı için işaretçi.Sonuç
Sonuç kodu için bir işaretçi, döndürmeden önce ayarlarsınız.
ON_NOTIFY_EX, ON_NOTIFY_EX_RANGE
Birden fazla bildirim nesnesi istiyorsanız yönlendirme mesajı ele, kullanabileceğiniz ON_NOTIFY_EX (veya ON_NOTIFY_EX_RANGE) yerine ON_NOTIFY (veya ON_NOTIFY_RANGE). Arasındaki tek fark ex ve normal olan üye işlev için adlı ex sürümü döndürür bir bool ileti işleme devam olup olmadığını gösterir. Dönme yanlış aynı iletide birden çok nesneyi işlemek bu işlevi sağlar.
ClassWizard işlemiyor ON_NOTIFY_EX veya ON_NOTIFY_EX_RANGE; bunlardan birini kullanmak istiyorsanız, ileti haritanızda kendiniz düzenlemeniz gerekir.
İleti eşleme girişi ve işlev prototipi ON_NOTIFY_EX ve ON_NOTIFY_EX_RANGE gibidir. Parametrelerin anlamları olmayan aynıdır-ex sürümleri.
ON_NOTIFY_EX( nCode, id, memberFxn )
ON_NOTIFY_EX_RANGE( wNotifyCode, id, idLast, memberFxn )
Her ikisi için yukarıdaki prototip aynıdır:
afx_msg BOOL memberFxn( UINT id, NMHDR * pNotifyStruct, LRESULT * result );
Notlar
Her iki durumda id gönderilen bildirim denetim alt tanımlayıcısını içerir.
İşlevinizin döndürmelidir doğru bildirim iletisi tamamen işlendiyse, veya yanlış komut akışındaki diğer nesneleri iletiyi işlemek için bir şansı olması gerekir.