Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bir denetim istediğiniz neredeyse her şeyi yapıyorsa ancak birkaç özelliğe daha ihtiyacınız varsa, alt sınıfa alarak özgün denetimi değiştirebilir veya özellikler ekleyebilirsiniz. Bir alt sınıf, mevcut bir sınıfın tüm özelliklerine ve vermek istediğiniz ek özelliklere sahip olabilir.
Bu belge, alt sınıfların nasıl oluşturulduğunu açıklar ve aşağıdaki konuları içerir.
- ComCtl32.dll sürüm 6'ya önce Alt Sınıflama Denetimleri
- Kullanıcı Verilerini Depolama
- Eski Alt Sınıflama Yaklaşımının Dezavantajları
-
Alt Sınıflama Denetimlerini ComCtl32.dll sürüm 6 kullanarak
- SetWindowSubclass
- GetWindowSubclass
- RemoveWindowAltSınıfı
- DefSubclassProc
ComCtl32.dll sürüm 6'dan önce alt sınıflama denetimleri
Bir alt sınıfa denetim ekleyebilir ve kullanıcı verilerini bir denetim içinde depolayabilirsiniz. 6. sürümden önceki ComCtl32.dll sürümlerini kullandığınızda bunu yaparsınız. ComCtl32.dllönceki sürümleriyle alt sınıflar oluşturmanın bazı dezavantajları vardır.
Yeni bir denetim yapmak için, Windows ortak denetimlerinden biriyle başlamak ve bunu belirli bir gereksinime uyacak şekilde genişletmek en iyisidir. Denetimi genişletmek için bir denetim oluşturun ve var olan pencere yordamını yenisiyle değiştirin. Yeni prosedür, denetimin iletilerini durdurur ve bunlar üzerinde işlem yapar veya varsayılan işleme için bunları özgün prosedüre iletir. Denetimin WNDPROC değerini değiştirmek için SetWindowLongveya SetWindowLongPtrişlevinikullanın. Aşağıdaki kod örneği, bir WNDPROC'nin nasıl değiştirileceğini göstermektedir.
OldWndProc = (WNDPROC)SetWindowLongPtr (hButton,
GWLP_WNDPROC, (LONG_PTR)NewWndProc);
Kullanıcı Verilerini Depolama
Kullanıcı verilerini tek bir pencereyle depolamak isteyebilirsiniz. Bu veriler, denetimin nasıl çizileceğini veya belirli iletilerin nereye gönderileceğini belirlemek için yeni pencere yordamı tarafından kullanılabilir. Örneğin, denetimi temsil eden sınıfın C++ sınıf işaretçisini depolamak için verileri kullanabilirsiniz. Aşağıdaki kod örneği, verileri bir pencereyle depolamak için SetProp'nin nasıl kullanılacağını gösterir.
SetProp (hwnd, TEXT("MyData"), (HANDLE)pMyData);
Eski Alt Sınıflama Yaklaşımının Dezavantajları
Aşağıdaki liste, bir denetimi alt sınıfa almak için daha önce açıklanan yaklaşımı kullanmanın bazı dezavantajlarına işaret eder.
- Pencere işlemi yalnızca bir kez değiştirilebilir.
- Bir alt sınıfı oluşturulduktan sonra kaldırmak zordur.
- Özel verileri bir pencereyle ilişkilendirmek verimsizdir.
- Bir alt sınıf zincirinde sonraki yordamı çağırmak için eski pencere yordamını dönüştüremez ve çağıramazsınız; bunun yerine CallWindowProc işlevini kullanarak çağırmalısınız.
ComCtl32.dll sürüm 6 Kullanarak Alt Sınıflama Denetimleri
Dikkat
ComCtl32.dll sürüm 6 sadece Unicode içindir. ComCtl32.dll sürüm 6 tarafından desteklenen yaygın denetimler ANSI pencere yordamlarıyla alt sınıflandırılmamalıdır (veya üst sınıflandırılmamalıdır).
ComCtl32.dll sürüm 6, alt sınıf oluşturmayı kolaylaştıran ve daha önce ele alınan dezavantajları ortadan kaldıran dört işlev içerir. Yeni işlevler, birden çok başvuru verisi kümesiyle ilgili yönetimi kapsüller, bu nedenle geliştirici alt sınıfları yönetmeye değil programlama özelliklerine odaklanabilir. Alt sınıflama işlevleri şunlardır:
SetWindowSubclass
Bu işlev başlangıçta bir pencereyi alt sınıfa almak için kullanılır. Her alt sınıf, pfnSubclass adresi ve uIdSubclassile benzersiz olarak tanımlanır. Bunların ikisi de SetWindowSubclass işlevinin parametreleridir. Birkaç alt sınıf aynı alt sınıf yordamını paylaşabilir ve ID her çağrıyı tanıyabilir. Başvuru verilerini değiştirmek için SetWindowSubclassöğesine sonraki çağrılar yapabilirsiniz. Önemli avantajı, her alt sınıf örneğinin kendi başvuru verilerine sahip olmasıdır.
Alt sınıf yordamının bildirimi, iki ek veri parçasına sahip olduğundan normal bir pencere yordamından biraz farklıdır: alt sınıf kimliği ve başvuru verileri. Aşağıdaki işlev bildiriminin son iki parametresi bunu gösterir.
LRESULT CALLBACK MyWndProc (HWND hWnd, UINT msg,
WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass,
DWORD_PTR dwRefData);
Yeni pencere yordamı tarafından her ileti alındığında alt sınıf kimliği ve başvuru verileri eklenir.
Not
Yordama geçirilen tüm dizeler, Unicode önişlemci tanımı olarak belirtilmemiş olsa bile Unicode dizeleridir.
Aşağıdaki örnek, alt sınıf oluşturulmuş bir denetim için bir pencere yordamının temel uygulamasını göstermektedir.
LRESULT CALLBACK OwnerDrawButtonProc(HWND hWnd, UINT uMsg, WPARAM wParam,
LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData)
{
switch (uMsg)
{
case WM_PAINT:
.
.
.
return TRUE;
// Other cases...
}
return DefSubclassProc(hWnd, uMsg, wParam, lParam);
}
Pencere işlevi, aşağıdaki örnekte gösterildiği gibi iletişim kutusu işleminin WM_INITDIALOG işleyicisinde denetime eklenebilir.
case WM_INITDIALOG:
{
HWND button = GetDlgItem(hDlg, IDC_OWNERDRAWBUTTON);
SetWindowSubclass(button, OwnerDrawButtonProc, 0, 0);
return TRUE;
}
GetWindowSubclass
Bu işlev bir alt sınıf hakkındaki bilgileri alır. Örneğin, başvuru verilerine erişmek için GetWindowSubclasskullanabilirsiniz.
RemoveWindowSubclass
Bu işlev alt sınıfları kaldırır. RemoveWindowSubclassSetWindowSubclass ile birlikte alt sınıfları dinamik olarak eklemenize ve kaldırmanıza olanak tanır.
DefSubclassProc
DefSubclassProc işlevi, alt sınıf zincirindeki sonraki işleyiciyi çağırır. İşlev ayrıca doğru ID ve referans verilerini alır ve bilgileri bir sonraki pencere prosedürüne geçirir.