Aracılığıyla paylaş


TN014: Özel Denetimler

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.

Sahip-Çizim Denetimleri/Menüler

Windows, Windows iletilerini kullanarak sahip çizim denetimleri ve menüleri 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 sahip çizimini 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.

Kendi Kendine Çizen Denetimler ve Menüler

MFC, standart sahip-çizim iletileri için varsayılan bir uygulama (ve CMenu sınıflarındaCWnd) sağlar. Bu varsayılan uygulama sahip-çizim parametrelerinin kodunu çözer ve sahip çizim iletilerini denetimlere veya menüye temsilci olarak verir. Çizim kodu sahip penceresinde değil denetimin veya menünün sınıfında olduğundan, buna kendi kendine çizim denir.

Kendi kendine çizim denetimlerini kullanarak, denetimi görüntülemek için sahip-çizim semantiği kullanan yeniden kullanılabilir denetim 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 kendine çizen 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 button
    
  • Kendi kendine ç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 menu
    
  • Kendi kendine çizen 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 box
    
  • Kendi kendine çizen birleşik giriş 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ı (DRAWITEMSTRUCT, MEASUREITEMSTRUCT, COMPAREITEMSTRUCT ve DELETEITEMSTRUCT) hakkında ayrıntılı bilgi için sırasıyla , , CWnd::OnMeasureItemCWnd::OnCompareItemve CWnd::OnDeleteItem için CWnd::OnDrawItemMFC belgelerine bakın.

Kendi kendine çizim denetimlerini ve menülerini kullanma

Kendi kendine çizim menüleri için hem ve OnMeasureItem OnDrawItem yöntemlerini geçersiz kılmanız gerekir.

Kendi kendine çizen liste kutuları ve birleşik giriş kutuları için ve OnDrawItemöğesini geçersiz kılmanız OnMeasureItem 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 çizilen öğelerle çalışmaz çünkü sabit öğe yüksekliği, kendi kendine çizilen denetimler liste kutusuna eklenmeden önce belirlenir. (Yöntemleri kullanabilirsinizBu sınırlamayı aşmak için CListBox::SetItemHeight ve CComboBox::SetItemHeight .)

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 yöntemini geçersiz kılmanız OnCompareItem gerekir.

Kendi kendine çizen liste kutuları ve birleşik giriş kutuları OnDeleteItem için 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.

Kendi Kendine Çizim 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 yerine özelleştirilmiş WndProc bir pencere eklemek WndProc ve varsayılan işlevsellik için eskisini WndProc ç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.

sınıfı, CWnd bir C++ nesnesi ('den CWndtüretilen) ile bir Windows pencere nesnesi (olarak HWNDbilinir) arasında bağlantı sağlar.

Bunlar ile ilgili üç yaygın yol vardır:

  • CWnd oluşturur HWND. öğesinden CWndtü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 var olan HWNDbir öğesine eklerCWnd. Varolan pencerenin davranışı değiştirilmez. Bu bir temsilci seçme durumudur ve bir nesneye var olan HWND diğer adlara CWnd::Attach çağrılarak CWnd mümkün hale getirilir.

  • CWnd mevcut HWND bir 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 veCWnd::SubclassDlgItem yöntemlerini kullanarak dinamik alt sınıflama gerçekleştirebilirsiniz.

Her iki yordam da var olan HWNDbir öğesine nesnesi CWnd ekler. SubclassWindow doğrudan alır HWND . SubclassDlgItem , denetim kimliğini ve üst 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 CTRLTEST örneğine SubclassDlgItembakın.

Ayrıca bkz.

Sayıya Göre Teknik Notlar
Kategoriye Göre Teknik Notlar