Standart Windows İletileri İşleyicileri
Standart Windows iletileri (WM_) için varsayılan işleyiciler sınıfında CWnd
önceden tanımlanmıştır. Sınıf kitaplığı, bu işleyicilerin adlarını ileti adına göre temel alır. Örneğin, WM_PAINT iletisinin işleyicisi şu CWnd
şekilde bildirilir:
afx_msg void OnPaint();
afx_msg anahtar sözcüğü, işleyicileri diğer CWnd
üye işlevlerinden ayırarak C++ virtual
anahtar sözcüğünü etkiler. Ancak, bu işlevlerin aslında sanal olmadığını unutmayın; bunun yerine ileti eşlemeleri aracılığıyla uygulanır. İleti eşlemeleri yalnızca standart önişlemci makrolarına bağlıdır, C++ dilinin herhangi bir uzantısına bağımlı değildir. afx_msg anahtar sözcüğü, ön işlemeden sonra boşluk olarak çözümleniyor.
Temel sınıfta tanımlanan bir işleyiciyi geçersiz kılmak için, türetilmiş sınıfınızda aynı prototipe sahip bir işlev tanımlamanız ve işleyici için bir ileti eşlemesi girişi yapmanız yeterlidir. İşleyiciniz, sınıfınızın temel sınıflarından herhangi birinde aynı adı taşıyan herhangi bir işleyiciyi "geçersiz kılar".
Bazı durumlarda, temel sınıf(lar) ve Windows'un ileti üzerinde çalışabilmesi için işleyicinizin temel sınıfta geçersiz kılınan işleyiciyi çağırması gerekir. Geçersiz kılmanızda temel sınıf işleyicisini çağırdığınız yer koşullara bağlıdır. Bazen önce temel sınıf işleyicisini, bazen de sonuncuyu çağırmanız gerekir. Bazen, iletiyi kendiniz işlememeyi seçerseniz temel sınıf işleyicisini koşullu olarak çağırırsınız. Bazen temel sınıf işleyicisini çağırmanız, ardından temel sınıf işleyicisi tarafından döndürülen değere veya duruma bağlı olarak kendi işleyici kodunuzu koşullu olarak yürütmeniz gerekir.
Dikkat
Bir temel sınıf işleyicisine geçirmek istiyorsanız, bir işleyiciye geçirilen bağımsız değişkenleri değiştirmek güvenli değildir. Örneğin, işleyicinin nChar bağımsız değişkenini OnChar
değiştirmek isteyebilirsiniz (örneğin, büyük harfe dönüştürmek için). Bu davranış oldukça belirsizdir, ancak bu etkiyi gerçekleştirmeniz gerekiyorsa bunun yerine üye işlevini SendMessage
kullanınCWnd
.
Sınıf Sihirbazı belirli bir iletinin işleyici işlevinin iskeletini (örneğin, WM_CREATE işleyicisi) OnCreate
yazdığında, belirli bir iletiyi geçersiz kılmanın uygun yolunu nasıl belirlersiniz? Aşağıdaki örnek, işleyicinin önce temel sınıf işleyicisini çağırmasını ve yalnızca -1 döndürmemesi koşuluyla ilerlemesini önerir.
int CMyView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFormView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
return 0;
}
Kural gereği, bu işleyicilerin adları "Açık" ön eki ile başlar. Bu işleyicilerden bazıları bağımsız değişken almazken, bazıları birkaçını alır. Bazıları da dışında void
bir dönüş türüne sahiptir. Tüm WM_ iletileri için varsayılan işleyiciler, MFC Başvurusu'nda adları "Açık" ile başlayan sınıfın CWnd
üye işlevleri olarak belgelenir. içindeki CWnd
üye işlev bildirimlerine afx_msg öneki eklenir.