Aracılığıyla paylaş


Özel Çizim Hakkında

Bu bölüm, özel çizim işlevselliği hakkında genel bilgiler içerir ve bir uygulamanın özel çekmeyi nasıl destekleyebileceğinize ilişkin kavramsal bir genel bakış sağlar. Şu anda aşağıdaki denetimler özel çizim işlevselliğini destekler:

  • Başlık denetimleri
  • Liste görünümü denetimleri
  • Çubuk denetimleri
  • Araç çubuğu denetimleri
  • Araç ipucu kontrolleri
  • İzleme Çubuğu denetimleri
  • Ağaç görünümü kontrolleri

Özel Çizim Bildirim İletileri Hakkında

Özel çizimi destekleyen tüm yaygın denetimler, çizim işlemleri sırasında belirli noktalarda NM_CUSTOMDRAW bildirim kodları gönderir. Bu bildirim kodları, denetimin tamamına uygulanan çizim işlemlerini ve denetim içindeki öğelere özgü çizim işlemlerini açıklar. Birçok bildirim kodu gibi NM_CUSTOMDRAW bildirimler de WM_NOTIFY ileti olarak gönderilir.

Özel bir çizim bildiriminin lParam parametresi, NMCUSTOMDRAW yapısının adresi veya ilk üyesi olarak NMCUSTOMDRAW yapısını içeren denetime özgü bir yapı olacaktır. Aşağıdaki tabloda, denetimlerle kullandıkları yapılar arasındaki ilişki gösterilmektedir.

Yapı Tarafından kullanılır
NMCUSTOMDRAW Donatı, izleme çubuğu ve üst bilgi denetimleri
NMLVCUSTOMDRAW Liste görünümü denetimleri
NMTBCUSTOMDRAW Araç çubuğu denetimleri
NMTTCUSTOMDRAW Araç ipucu kontrolleri
NMTVCUSTOMDRAW Ağaç görünümü kontrolleri

Boya Döngüleri, Çizim Aşamaları ve Bildirim İletileri

Tüm Windows uygulamaları gibi yaygın denetimler de sistemden veya diğer uygulamalardan alınan iletilere göre düzenli aralıklarla boyanır ve silinir. Kendini kontrol eden boyama veya silme işlemine boya döngüsüdenir. Özel çizim destekleyen denetimler, her boya döngüsü boyunca düzenli aralıklarla NM_CUSTOMDRAW bildirim kodları gönderir. Bu bildirim koduna NMCUSTOMDRAW yapısı veya ilk üyesi olarak NMCUSTOMDRAW yapısı içeren başka bir yapı eşlik eder.

NMCUSTOMDRAW yapısının içerdiği bilgilerden biri, boya döngüsünün geçerli aşamasıdır. Bu, çizim aşaması olarak adlandırılır ve yapının dwDrawStage üyesindeki değerle temsil edilir. Denetim, ebeveynini dört temel çizim aşaması hakkında bilgilendirir. Bu temel veya genel çizim aşamaları, yapıda aşağıdaki bayrak değerleriyle temsil edilir (Commctrl.h'de tanımlanır).

Genel çizim aşaması değerleri Açıklama
CDDS_PREPAINT Boya döngüsü başlamadan önce.
CDDS_POSTPAINT Boya döngüsü tamamlandıktan sonra.
CDDS_PREERASE Silme döngüsü başlamadan önce.
CDDS_POSTERASE Silme döngüsü tamamlandıktan sonra.

Önceki değerlerin her biri, öğelere özgü çizim aşamalarını belirtmek için CDDS_ITEM bayrağıyla birleştirilebilir. Kolaylık sağlamak için, Commctrl.h aşağıdaki öğeye özgü değerleri içerir.

Öğeye özgü çizim aşaması değerleri Açıklama
CDDS_ITEMPREPAINT Bir öğe çizilmeden önce.
CDDS_ITEMPOSTPAINT Bir öğe çizildikten sonra.
CDDS_ITEMPREERASE Bir öğe silinmeden önce.
CDDS_ITEMPOSTERASE Bir öğe silindikten sonra.
CDDS_SUBITEM Ortak Denetim Sürümleri 4.71. Bir alt öğe çiziliyorsa, bayrak CDDS_ITEMPREPAINT veya CDDS_ITEMPOSTPAINT ile birleştirilir. Bu yalnızca CDRF_NOTIFYITEMDRAW CDDS_PREPAINT döndürülürse ayarlanır.

Uygulamanızın NM_CUSTOMDRAW bildirim kodunu işlemesi ve ardından denetime ne yapması gerektiğini bildiren belirli bir değer döndürmesi gerekir. Bu dönüş değerleri hakkında daha fazla bilgi için aşağıdaki bölümlere bakın.

Özel Çizim Hizmetlerinden Yararlanma

Özel çizim işlevselliğinden yararlanmanın anahtarı, denetimin gönderdiği NM_CUSTOMDRAW bildirim kodlarına yanıt vermektir. Uygulamanızın bu bildirimlere yanıt olarak gönderdiği dönüş değerleri, denetimin bu boya döngüsü için davranışını belirler.

Bu bölüm, uygulamanızın denetimin davranışını belirlemek için NM_CUSTOMDRAW bildirim dönüş değerlerini nasıl kullanabileceği hakkında bilgi içerir.

Ayrıntılar aşağıdaki konulara ayrılmıştır:

Ön boya bildirimine yanıt verme

Her boya döngüsünün başında, denetim NM_CUSTOMDRAW bildirim kodunu gönderir ve eşlik eden NM_CUSTOMDRAW yapısının dwDrawStage üyesindeki CDDS_PREPAINT değerini belirtir. Uygulamanızın bu ilk bildirime döndürdüğü değer, denetimin bu boya döngüsünün geri kalanı için sonraki özel çizim bildirimlerini nasıl ve ne zaman gönderdiğini belirler. Uygulamanız, ilk bildirime yanıt olarak aşağıdaki bayrakların bir bileşimini döndürebilir.

Dönüş değeri Etki
CDRF_DODEFAULT Denetim kendini çizer. Bu boya döngüsü için ek NM_CUSTOMDRAW bildirimleri göndermez. Bu bayrak başka bir bayrakla kullanılamaz.
CDRF_DOERASE Kontrol yalnızca arka plan çizecek.
CDRF_NEWFONT Uygulamanız öğe için yeni bir yazı tipi belirtti; denetimi yeni yazı tipini kullanır. Yazı tiplerini değiştirme hakkında daha fazla bilgi için bkz. Yazı tiplerini ve renkleri değiştirme. Bu, dwDrawStage CDDS_ITEMPREPAINT eşit olduğunda oluşur.
CDRF_NOTIFYITEMDRAW Denetim, herhangi bir öğeye özgü çizim işlemlerini üst öğeye bildirecektir. Öğeleri çizmeden önce ve çizdikten sonra NM_CUSTOMDRAW bildirim kodları gönderir. Bu, dwDrawStage CDDS_PREPAINT eşit olduğunda oluşur.
CDRF_NOTIFYPOSTERASE Denetim, öğeyi sildikten sonra ebeveyni bilgilendirir. dwDrawStage CDDS_PREPAINT eşit olduğunda bu durum oluşur.
CDRF_NOTIFYPOSTPAINT Boyama döngüsü denetimin tamamı için tamamlandığında, denetim bir NM_CUSTOMDRAW bildirimi gönderecektir. dwDrawStage CDDS_PREPAINT eşit olduğunda bu durum oluşur.
CDRF_NOTIFYSUBITEMDRAW Sürüm 4.71. Uygulamanız, her liste görünümü alt öğesi çizilmeden önce dwDrawStage CDDS_ITEMPREPAINT | CDDS_SUBITEM olarak ayarlanmış bir NM_CUSTOMDRAW bildirimi alır. Daha sonra her alt bölüm için ayrı olarak yazı tipi ve renk belirtebilir veya varsayılan işleme için CDRF_DODEFAULT döndürebilirsiniz. Bu, dwDrawStage CDDS_ITEMPREPAINT eşit olduğunda oluşur.
CDRF_SKIPDEFAULT Uygulamanız öğeyi el ile çizmişti. Denetim öğeyi çizmez. Bu, dwDrawStage CDDS_ITEMPREPAINT eşit olduğunda oluşur.
CDRF_SKIPPOSTPAINT Denetim odak dikdörtgenini bir öğenin çevresine çizmez.

Öğeye özgü bildirimler isteme

Uygulamanız ilk ön boya özel çizim bildirimine CDRF_NOTIFYITEMDRAW döndürürse, denetim bu boya döngüsü sırasında çizeceği her öğe için bildirim gönderir. Bu öğeye özgü bildirimler, eşlik eden NMCUSTOMDRAW yapısının dwDrawStage üyesinde CDDS_ITEMPREPAINT değerine sahip olacaktır. Bu öğeye özgü bildirimlere CDRF_NOTIFYPOSTPAINT döndürerek, öğe çizimi bittiğinde denetimin başka bir bildirim göndermesini isteyebilirsiniz. Aksi takdirde, CDRF_DODEFAULT döndürür, böylece denetim sonraki öğeyi çizmeye başlayana kadar üst pencereye bildirim göndermez.

Öğeyi kendiniz çizme

Uygulamanız öğenin tamamını çiziyorsa CDRF_SKIPDEFAULTdöndürebilirsiniz. Bu, denetimin çizmesi gerekmeyen öğeleri atlayarak sistem yükünü azaltmasını sağlar. Bu değeri döndürmenin, denetimin öğenin herhangi bir bölümünü çizmeyeceği anlamına geldiğini unutmayın.

Yazı tiplerini ve renkleri değiştirme

Uygulamanız bir öğenin yazı tipini değiştirmek için özel çizim kullanabilir. Özel çizim bildirimiyle ilişkili NMCUSTOMDRAW yapısının hdc üyesi tarafından belirtilen cihaz bağlamında istediğiniz HFONT'u seçmeniz yeterlidir. Seçtiğiniz yazı tipi varsayılan yazı tipinden farklı ölçümlere sahip olabileceğinden, bildirim iletisinin dönüş değerine CDRF_NEWFONT biti eklediğinizden emin olun. Bu işlevi kullanma hakkında daha fazla bilgi için Özel Çizim kullanmaiçindeki örnek koda bakın. Uygulamanızın belirttiği yazı tipi, seçili olmadığında bu öğeyi görüntülemek için kullanılır. Özel çizim, seçili öğelerin yazı tipi özniteliklerini değiştirmenize izin vermez.

Liste görünümü ve ağaç görünümü dışında özel çizmeyi destekleyen tüm denetimlerin metin renklerini değiştirmek için, SetTextColor ve SetBkColor işlevleriyle özel çizim bildirim yapısında sağlanan cihaz bağlamında istenen metin ve arka plan renklerini ayarlamanız yeterlidir. Liste görünümünde veya ağaç görünümünde metin renklerini değiştirmek için, istenen renk değerlerini clrText ve NMLVCUSTOMDRAW veya NMTVCUSTOMDRAW yapısının clrTextBk üyelerine yerleştirmeniz gerekir.

Not

Ortak denetimlerin Sürüm 6.0 önce, araç çubukları CDRF_NEWFONT bayrağını yoksayar. Sürüm 6.0, CDRF_NEWFONT bayrağını destekler ve araç çubuğu için farklı bir yazı tipi seçmek için bunu kullanabilirsiniz. Ancak, bir görsel stili etkin olduğunda araç çubuğunun rengini değiştiremezsiniz. Sürüm 6.0'da araç çubuğunun rengini değiştirmek için, önce SetWindowTheme'ü çağırıp görsel stil belirtmeden görsel stilleri devre dışı bırakmanız gerekir.

SetWindowTheme (hwnd, "", "");

List-View ve Tree-View Denetimleriyle Özel Çizim

En yaygın denetimler temelde aynı şekilde işlenebilir. Ancak, liste görünümü ve ağaç görünümü denetimleri, özel çizim için biraz farklı bir yaklaşım gerektiren bazı özelliklere sahiptir.

Sürüm 5.0için, yazı tipini değiştirip CDRF_NEWFONTdöndürürseniz, bu iki denetim metnin kesilmiş halini gösterebilir. Bu davranış, ortak denetimlerin önceki sürümleriyle geriye dönük uyumluluk için gereklidir. Liste görünümü veya ağaç görünümü denetiminin yazı tipini değiştirmek istiyorsanız, denetime öğe eklemeden önce wParam değeri 5 olarak ayarlanmış bir CCM_SETVERSION iletisi gönderirseniz daha iyi sonuçlar elde edersiniz.

List-View Denetimleriyle Özel Çizim

Liste görünümü denetimlerinin alt öğeleri ve birden çok görüntüleme modu olduğundan, NM_CUSTOMDRAW bildirimini diğer yaygın denetimlerden biraz farklı işlemeniz gerekir.

Rapor modu için aşağıdaki yordamı kullanın.

  1. İlk NM_CUSTOMDRAW bildiriminde, ilişkili NMCUSTOMDRAW yapısının dwDrawStage üyesi CDDS_PREPAINT olarak ayarlanır. CDRF_NOTIFYITEMDRAWdöndür.
  2. Ardından NM_CUSTOMDRAW bildirimini, dwDrawStage CDDS_ITEMPREPAINT olarak ayarlanmış şekilde alırsınız. Yeni yazı tipleri veya renkler belirtir ve CDRF_NEWFONTdöndürürseniz, öğenin tüm alt öğeleri değiştirilir. Bunun yerine her alt öğesini ayrı ayrı işlemek istiyorsanız, CDRF_NOTIFYSUBITEMDRAWdöndürün.
  3. Önceki adımda CDRF_NOTIFYSUBITEMDRAW döndürdüyseniz, dwDrawStage CDDS_SUBITEM | CDDS_ITEMPREPAINT olarak ayarlanmış her alt öğe için bir NM_CUSTOMDRAW bildirimi alırsınız. Bu alt dizinin yazı tipini veya rengini değiştirmek için yeni bir yazı tipi veya renk belirtin ve CDRF_NEWFONTdöndürün.

Büyük simge, küçük simge ve liste modları için aşağıdaki yordamı kullanın.

  1. İlk NM_CUSTOMDRAW bildiriminde, ilişkili NMCUSTOMDRAW yapısının dwDrawStage üyesi CDDS_PREPAINT olarak ayarlanır. CDRF_NOTIFYITEMDRAWdöndür.
  2. Ardından NM_CUSTOMDRAW bildirimini, dwDrawStage CDDS_ITEMPREPAINT olarak ayarlanmış şekilde alırsınız. Yeni yazı tipleri ve renkler belirtip CDRF_NEWFONTdöndürerek öğenin yazı tiplerini veya renklerini değiştirebilirsiniz. Bu modların alt öğeleri olmadığından ek NM_CUSTOMDRAW bildirimi almazsınız.

Liste görünümü NM_CUSTOMDRAW bildirim işleyicisinin bir örneği için Özel Çizim Kullanımıkısmına bakın.