Bu teknik Not Yeni WM_NOTIFY mesaj bilgiler sağlar ve mfc uygulaması WM_NOTIFY iletileri işleme önerilen (ve yaygın) bir şekilde açıklar.
Bildirim iletileri Windows 3.x
Windows 3.x, denetimleri anne fare tıklatmaları gibi olayların bildirmek içerik ve seçim ve denetim arka plan boyama üst ileti göndererek değiştirir. Basit bildirimleri bildirim kodu ( BN_CLICKEDgibi) özel wm_command iletileri olarak gönderilir ve wParam ve denetimin tutamacını lParamiçinde paketlenmiş kimlik kontrolü. WParam ve lParam dolu olduğundan, ek verileri geçirmek için hiçbir yolu olduğunu unutmayın — bu iletileri yalnızca basit bildirim olabilir. Örneğin, BN_CLICKED bildiriminde, düğme tıklatıldığında, fare imlecinin konumu hakkında bilgi göndermek için hiçbir şekilde.
Windows 3.x denetimlerde ek veri içeren bir bildirim iletisi göndermek gerektiğinde, özel amaçlı mesajlar, wm_ctlcolor, wm_vscroll, wm_hscroll, WM_DRAWITEM, WM_MEASUREITEM, WM_COMPAREITEM, WM_DELETEITEM, WM_CHARTOITEM, WM_VKEYTOITEM, dahil olmak üzere çeşitli kullanın ve benzeri. Bu mesajları gönderdiği denetime geri yansıması olabilir. Daha fazla bilgi için bkz: TN062: ileti yansıma Windows denetimlerini.
Windows 3.1 varolan denetimler için bildirim iletilerini Windows 3.x'te kullanılan çoğu için Win32 API kullanır. Ancak, Win32 de bu desteklenen Windows 3.x. sık sık çeşitli gelişmiş, karmaşık denetimler ekler, ek verileri ile bildirim iletileri göndermek bu denetimleri gerekir. Yeni ileti wm_ * ek veri gerektiren her yeni bir bildirim eklemek yerine, Win32 API tasarımcılar tek bir ileti, hangi ek verilerin herhangi bir miktarda standartlaştırılmış bir moda geçmek WM_NOTIFY, eklemeyi tercih.
WM_NOTIFY iletileri ileti wParam ve işaretçi bir yapı içinde lParamgönderme denetimin kimliği içerir. Bu, bir nmhdr yapısı ya da bir nmhdr yapısı olarak ilk üye olan bazı büyük yapısı yapısıdır. nmhdr üye beri ilk kez, unutmayın bu yapısı için işaretçi bir nmhdr ya da bir işaretçi veya nasıl onu dökme bağlı büyük yapısı için işaretçi olarak kullanılabilir.
Çoğu durumda, işaretçinin daha büyük bir yapıya işaret eder ve bu cast gerekir. Yalnızca birkaç bildirimleri (adları nm_ile başlayan) genel bildirimleri ve araç ipucu denetimin ttn_show ve ttn_pop bildirimleri gibi aslında bir nmhdr yapısı olduğunu.
nmhdr yapısı veya ilk üye kolu ve gönderme mesaj ve bildirim kodu (örneğin, ttn_show) denetimin kimliği içerir. nmhdr yapısı biçimi aşağıda gösterilmiştir:
typedef struct tag&NMHDR {}
nbsp; hwnd hwndFrom;
UINT idFrom;
UINT kodu;
} NMHDR
ttn_show ileti için kod üye ttn_show için ayarlanmalıdır.
Çoğu bildirimleri bir işaretçi içeren bir nmhdr yapısını ilk üye olarak büyük yapısı iletin. Örneğin, bir liste görünüm denetimi bir tuşa basıldığında gönderdiği liste görünümünde denetimin lvn_keydown bildirim iletisinin tarafından kullanılan yapısı göz önünde bulundurun. İşaretçiyi aşağıdaki gibi tanımlanmış bir lv_keydown yapısını işaret eder:
typedef struct tagLV_KEYDOW&N {}
nbsp; nmhdr hdr;
word wVKey;
UINT bayrakları;
} LV_KEYDOWN
nmhdr üye olduğu bu yapı içinde ilk bildirim iletisinde geçirilen işaretçisi bir nmhdr bir işaretçi veya bir lv_keydown bir işaretçi artığını olduğunu unutmayın.
Tüm yeni Windows denetimleri bildirimleri ortak
Bazı bildirimler tüm yeni Windows denetimleri için ortaktır. Bu bildirimleri bir nmhdr yapısı için işaretçi geçmek.
| Bildirim kodu | Çünkü gönderilen |
| NM_CLICK | Kullanıcı denetimi farenin sol düğmesini tıklayan |
| NM_DBLCLK | Denetimin kullanıcı çift sol fare düğmesi |
| NM_RCLICK | Kullanıcı denetimi farenin sağ tuşuna tıklandığında |
| NM_RDBLCLK | Denetimin kullanıcı çift farenin sağ tuşuna |
| NM_RETURN | Denetim odağı giriş iken enter tuşuna basıldığında kullanıcı |
| NM_SETFOCUS | Giriş odağı denetime verilmiştir |
| NM_KILLFOCUS | Giriş odağı kontrolü kaybetti |
| NM_OUTOFMEMORY | Yoktu çünkü kullanılabilir yeterli bellek kontrol işlemi tamamlanamadı |
ON_NOTIFY: mfc uygulamaları WM_NOTIFY iletileri işleme
CWnd::OnNotify işlevi bildirim iletilerini işleme. Varsayılan uygulanması için bildirim işleyicisi çağırmak ileti göster denetler. Genel olarak, OnNotifykılmaz. Bunun yerine, bir işleyici işlevi sağlar ve bir mesaj-eşleme girdisini sahibi pencerenin sınıf ileti Haritası bu işleyicisi ekleyin.
ClassWizard özellik sayfası veya sihirbaz aracılığıyla ClassWizard ON_NOTIFY mesaj-eşleme girdisini oluşturmak ve bir iskelet işleyici işlevi sağlar. ClassWizard kolaylaştırmak için kullanma hakkında daha fazla bilgi için bkz: İşlevleri eşleme iletilere Visual c++ programlama Kılavuzu.
ON_NOTIFY iletisi göster makro sözdizimi aşağıdaki gibidir:
ON_NOTIFY ( wNotifyCode, ID, memberFxn )
nerede italik parametrelerle değiştirilir:
wNotifyCode
lvn_keydown gibi ele alınması bildirim iletisi kodunu.
id
Bildirimin gönderildiği denetim alt tanıtıcısı.
memberFxn
Bu bildirim gönderildiğinde çağrılacak üye işlevi.
Üye işlevi aşağıdaki prototip ile bildirilmeli:
afx_msgvoidmemberFxn()nmhdr*pNotifyStruct,lresult*sonucu);
İtalik parametreler nerede:
pNotifyStruct
Yukarıdaki bölümde açıklandığı gibi bildirim yapısı için işaretçi.
sonuç
Geri döndüğünüzde önce sonuç kodunu gösteren bir işaretçi ayarlamanız.
Örnek
Üye işlevi istediğiniz belirtmek için OnKeydownList1 Kimliğine sahip CListCtrl lvn_keydown iletileri işlemek için IDC_LIST1 , ClassWizard şu senin mesaj eşlemesine eklemek için kullanacağınız:
ON_NOTIFY (lvn_keydown, IDC_LIST1, OnKeydownList1)
Yukarıdaki örnekte, ClassWizard tarafından sağlanan işlevdir:
void CMessageReflectionDlg::OnKeydownList1 (nmhdr * p&NMHDR, lresult * pResult)
{
lv_keydown * pLVKeyDow (lv_keydown *) pNMHDR; =
/ / todo: Denetim bildirim işleyicisi ekleyin
/ / nbsp; Buraya kodu
* pResult = 0;
}
ClassWizard işaretçi uygun türü otomatik olarak sağlar unutmayın. Bildirim yapısı aracılığıyla erişebileceğiniz pNMHDR veyapLVKeyDow.
Aynı WM_NOTIFY ileti için bir dizi işlem gerekiyorsa, ON_NOTIFYyerine ON_NOTIFY_RANGE kullanabilirsiniz. Örneğin, belirli bir bildirim iletisi için aynı eylemi gerçekleştirmek istediğiniz düğme kümesi olabilir.
ON_NOTIFY_RANGEkullandığınızda, çocuk tanımlayıcıları başına belirleme ve çocuk tanımlayıcıları aralığın bitiş bildirim iletisini işlemek üzere bitişik aralığını belirtin.
ClassWizard ON_NOTIFY_RANGEişlemez; kullanmak için ileti göster kendini düzenlemeniz gerekir.
ON_NOTIFY_RANGE işlev prototipi ve mesaj-eşleme girdisini aşağıdaki gibidir.:
ON_NOTIFY_RANGE ( wNotifyCode, ID, idLast, memberFxn )
nerede italik parametrelerle değiştirilir:
wNotifyCode
lvn_keydown gibi ele alınması bildirim iletisi kodunu.
id
Tanımlayıcılar bitişik aralığındaki ilk tanımlayıcısı.
idLast
Tanımlayıcılar bitişik aralığındaki son tanımlayıcı.
memberFxn
Bu bildirim gönderildiğinde çağrılacak üye işlevi.
Üye işlevi aşağıdaki prototip ile bildirilmeli:
afx_msgvoidmemberFxn()UINT kimliğinmhdr*pNotifyStruct,lresult*sonucu);
İtalik parametreler nerede:
id
Çocuk tanımlayıcı bildirimi gönderen denetimi.
pNotifyStruct
Yukarıda açıklandığı gibi bildirim yapısı için işaretçi.
sonuç
Geri döndüğünüzde önce sonuç kodunu gösteren bir işaretçi ayarlamanız.
ON_NOTIFY_EX, ON_NOTIFY_EX_RANGE
Eğer birden fazla ileti işlemeye yönlendirme bildirimi nesnesinde, ON_NOTIFY (veya ON_NOTIFY_RANGE) yerine ON_NOTIFY_EX (veya ON_NOTIFY_EX_RANGE) kullanabilirsiniz. Eski sürümü ve düzenli sürüm arasındaki tek fark, eski sürümü adlı üye işlevi ileti işleme devam etmesi gerekir olup olmadığını gösteren bir bool döndürmesidir. Aynı iletide birden çok nesneyi işlemek yanlış bu işlevden dönen sağlar.
ClassWizard, ON_NOTIFY_EX ya da ON_NOTIFY_EX_RANGEişlemez; ya onları kullanmak istiyorsanız, iletiyi göster kendini düzenlemeniz gerekir.
Mesaj-eşleme girişi ve işlev prototipi ON_NOTIFY_EX ve ON_NOTIFY_EX_RANGE aşağıdaki gibidir. Parametrelerin anlamları olmayan aynıdır-eski sürümleri.
ON_NOTIFY_EX ( nCode, ID, memberFxn )
ON_NOTIFY_EX_RANGE ( wNotifyCode, ID, idLast,memberFxn )
Her ikisi de yukarıdaki aynı prototiptir:
afx_msgboolmemberFxn()UINT kimliğinmhdr*pNotifyStruct,lresult*sonucu);
Her iki durumda da, kimlik bildirimi gönderen denetimi çocuk tanıtıcısı tutar.
İşlevinizin bildirim iletisi tamamen işlenmiş ya da diğer nesneleri komut yönlendirme yanlış iletiyi işlemek için bir fırsat olması gereken return true olmalıdır.
Teknik notlar numarasına göre |nbsp; Teknik notlar kategorisine göre