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.
Uyarı
Microsoft Foundation Sınıfları (MFC) kitaplığına destek verilmeye devam ediliyor. Ancak artık özellik eklemeyeceğiz veya belgeleri güncelleştirmeyeceğiz.
Bu not, özel ve kendi kendine çizim denetimleri için MFC Desteği'ni açıklar. Ayrıca dinamik alt sınıfları açıklar ve CWnd nesneleri ile HWNDs arasındaki ilişkiyi açıklar.
MFC örnek uygulaması CTRLTEST, birçok özel denetimin nasıl kullanılacağını gösterir. MFC Genel örneği CTRLTEST ve çevrimiçi yardım için kaynak koduna bakın.
Owner-Draw Denetimleri/Menüleri
Windows, Windows iletilerini kullanarak kullanıcı çizimli denetimler ve menüler için destek sağlar. Herhangi bir denetimin veya menünün üst penceresi bu iletileri alır ve yanıt olarak işlevleri çağırır. Sahip çizim denetiminizin veya menünüzün görsel görünümünü ve davranışını özelleştirmek için bu işlevleri geçersiz kılabilirsiniz.
MFC, aşağıdaki işlevlerle özel çizimi doğrudan destekler:
Özel çizim davranışı uygulamak için türetilmiş sınıfınızdaki CWnd bu işlevleri geçersiz kılabilirsiniz.
Bu yaklaşım yeniden kullanılabilir koda yol açmaz. İki farklı CWnd sınıfta iki benzer denetiminiz varsa, iki konumda özel denetim davranışını uygulamanız gerekir. MFC destekli kendi kendine çizim denetimi mimarisi bu sorunu çözer.
Self-Draw Denetimler ve Menüler
MFC, standart sahip-çizim iletileri için varsayılan bir uygulama sağlar; bu uygulama CWnd ve CMenu sınıflarında bulunmaktadır. Bu varsayılan uygulama kendi çizen parametrelerinin kodunu çözer ve kendi çizen iletileri denetimlere veya menüye yönlendirir. Çizim kodu, sahip pencere yerine denetimin veya menünün sınıfında olduğundan, buna kendiliğinden çizim denir.
Kendi kendine çizilen kontrolleri kullanarak, kontrolü görüntülemek için özel çizim semantiği kullanan yeniden kullanılabilir kontrol sınıfları oluşturabilirsiniz. Denetimi çizme kodu, üst öğesinde değil denetim sınıfındadır. Bu, özel denetim programlamaya yönelik nesne odaklı bir yaklaşımdır. Kendi çizim yapan sınıflarınıza aşağıdaki işlevlerin listesini ekleyin:
Kendi kendine çiz düğmeleri için:
CButton::DrawItem(LPDRAWITEMSTRUCT); // insert code to draw this buttonKendi kendini çizen menüler için:
CMenu::MeasureItem(LPMEASUREITEMSTRUCT); // insert code to measure the size of an item in this menu CMenu::DrawItem(LPDRAWITEMSTRUCT); // insert code to draw an item in this menuKullanıcı tarafından şekillendirilen liste kutuları için:
CListBox::MeasureItem(LPMEASUREITEMSTRUCT); // insert code to measure the size of an item in this list box CListBox::DrawItem(LPDRAWITEMSTRUCT); // insert code to draw an item in this list box CListBox::CompareItem(LPCOMPAREITEMSTRUCT); // insert code to compare two items in this list box if LBS_SORT CListBox::DeleteItem(LPDELETEITEMSTRUCT); // insert code to delete an item from this list boxKendinden çizen birleşik kutular için:
CComboBox::MeasureItem(LPMEASUREITEMSTRUCT); // insert code to measure the size of an item in this combo box CComboBox::DrawItem(LPDRAWITEMSTRUCT); // insert code to draw an item in this combo box CComboBox::CompareItem(LPCOMPAREITEMSTRUCT); // insert code to compare two items in this combo box if CBS_SORT CComboBox::DeleteItem(LPDELETEITEMSTRUCT); // insert code to delete an item from this combo box
Sahip-çizim yapılarına ilişkin detaylar (DRAWITEMSTRUCT, MEASUREITEMSTRUCT, COMPAREITEMSTRUCT ve DELETEITEMSTRUCT) için sırasıyla CWnd::OnDrawItem, CWnd::OnMeasureItem, CWnd::OnCompareItem ve CWnd::OnDeleteItem ile ilgili MFC belgelerine bakın.
Özel çizim kontrollerini ve menülerini kullanma
Kendi çizim menülerinizi oluşturmak için hem OnMeasureItem hem de OnDrawItem yöntemlerini geçersiz kılmanız gerekir.
Özel çizimli liste kutuları ve birleşik kutular için OnMeasureItem ve OnDrawItem öğelerini geçersiz kılmanız gerekir. Liste kutuları için LBS_OWNERDRAWVARIABLE stilini veya iletişim kutusu şablonunda birleşik giriş kutuları için CBS_OWNERDRAWVARIABLE stilini belirtmeniz gerekir. OWNERDRAWFIXED stili, kendi kendine çizim yapan öğelerle uyumlu çalışmaz çünkü sabit öğe yüksekliği, öğeler liste kutusuna eklenmeden önce belirlenir. (Bu sınırlamayı aşmak için CListBox::SetItemHeight ve CComboBox::SetItemHeight yöntemlerini kullanabilirsiniz.)
OWNERDRAWVARIABLE stiline geçmek, sistemi denetime NOINTEGRALHEIGHT stilini uygulamaya zorlar. Denetim, değişken boyutlu öğelerle integral yüksekliğini hesaplayamadığından, VARSAYıLAN INTEGRALHEIGHT stili yoksayılır ve denetim her zaman NOINTEGRALHEIGHT'tır. Öğeleriniz sabit yüksekliğe sahipse, denetim boyutunu öğe boyutunun tamsayı çarpanı olarak belirterek kısmi öğelerin çizilmesini önleyebilirsiniz.
LBS_SORT veya CBS_SORT stiline sahip kendi kendine çizim liste kutuları ve birleşik giriş kutuları için OnCompareItem yöntemini geçersiz kılmanız gerekir.
Kendi kendine çizen liste kutuları ve combo kutular için OnDeleteItem genellikle geçersiz kılınmaz. Herhangi bir özel işlem gerçekleştirmek istiyorsanız geçersiz kılabilirsiniz OnDeleteItem . Bunun uygulanabileceği durumlardan biri, her liste kutusu veya birleşik giriş kutusu öğesinde ek bellek veya diğer kaynakların depolanmasıdır.
Self-Drawing Denetimleri ve Menü örnekleri
MFC Genel örneği CTRLTEST , kendi kendine çiz menüsü ve kendi kendine çiz liste kutusu örnekleri sağlar.
Kendi kendine çizim düğmesinin en tipik örneği bit eşlem düğmesidir. Bit eşlem düğmesi, farklı durumlar için bir, iki veya üç bit eşlem görüntüsü gösteren bir düğmedir. Bunun bir örneği , CBitmapButton MFC sınıfında sağlanır.
Dinamik Alt Sınıflama
Bazen zaten var olan bir nesnenin işlevselliğini değiştirmek istersiniz. Önceki örnekler, denetimleri oluşturulmadan önce özelleştirmenizi gerektiriyordu. Dinamik alt sınıflama, önceden oluşturulmuş bir denetimi özelleştirmenizi sağlar.
Alt sınıflama, bir pencerenin WndProc'unu özelleştirilmiş bir WndProc ile değiştirmek ve varsayılan işlevsellik için eski WndProc'yi çağırmak için kullanılan Windows terimidir.
Bu, C++ sınıf türetme ile karıştırılmamalıdır. Netleştirme için, C++ terimleri temel sınıfı ve türetilmiş sınıf , Windows nesne modelindeki üst sınıf ve alt sınıfa benzer. MFC ve Windows alt sınıfları ile C++ türetmesi işlevsel olarak benzerdir, ancak C++ dinamik alt sınıflamayı desteklemez.
CWnd sınıfı, CWnd'den türetilmiş bir C++ nesnesi ile HWND olarak bilinen bir Windows pencere nesnesi arasında bağlantı sağlar.
Bunlar ile ilgili üç yaygın yol vardır:
CWndoluştururHWND. öğesindenCWndtüretilmiş bir sınıf oluşturarak türetilmiş bir sınıftaki davranışı değiştirebilirsiniz.HWND, uygulamanız CWnd::Create'i çağırdığında oluşturulur.Uygulama,
CWndbirimi mevcut birHWND'ye ekler. Varolan pencerenin davranışı değiştirilmez. Bu, bir yetki devri durumudur ve mevcut bir 'i birHWNDnesnesine diğer ad olarak atamak içinCWndçağrısı yapılmasıyla mümkün hale getirilir.CWndmevcutHWNDbir sınıfa eklenir ve türetilmiş bir sınıftaki davranışı değiştirebilirsiniz. Çalışma zamanında bir Windows nesnesinin davranışını ve dolayısıyla sınıfını değiştirdiğimiz için buna dinamik alt sınıflama adı verilir.
CWnd::SubclassWindow ve CWnd::SubclassDlgItem yöntemlerini kullanarak dinamik alt sınıflama gerçekleştirebilirsiniz.
Her iki yordam da CWnd nesnesini var olan bir HWND öğesine ekler.
SubclassWindow
HWND'i doğrudan alır.
SubclassDlgItem bir denetim kimliğini ve ana pencereyi alan bir yardımcı işlevdir.
SubclassDlgItem , bir iletişim kutusu şablonundan oluşturulan iletişim kutusu denetimlerine C++ nesneleri eklemek için tasarlanmıştır.
ve 'nin ne zaman kullanılacağına SubclassWindow ilişkin çeşitli örnekler için SubclassDlgItem örneğine bakın.
Ayrıca bakınız
Numaraya Göre Teknik Notlar
Kategorilere Göre Teknik Notlar