Resimli ComboBox

By_OnEseLF

Katılımcı Üye
12 Eyl 2010
655
0
Resimli ComboBox




Bu yazıda adım adım combobox, listbox gibi liste kontrollerindeki elemanların görüntülerinin nasıl değiştirilebileceğinizden bahsedeceğim.

Örnekteki combobox kontrolünde 3 tane elemana sahip ve her elemanın kendine ait normal resmi, hover (mouse ile üstüne geldiğinizde görünen resim) resmi ve yazısı var. eğer bir nesnenin üstünde fare ile gezerseniz hem hover resimli hali gözüküyor hemde yazının arka plan rengi yazının kendi rengi değişiyor.


  • Yeni bir Visual Basic Windows Forms projesi açın.
  • Formun üzerine bir tane combobox ekleyin.


  • Combobox kontolünü seçip properties penceresinden DrawMode özelliğini OwnerDrawFixed olarak değiştirin.

Bu özellik kontrolün çizimine müdahele etmenizi sağlar. 3 seçeneği vardır :

1) Normal : Bu seçenekte çizim işletim sistemine bırakılır ve bütün elemanların boyutları aynıdır. Siz müdahalede bulunamazsınız.

2) OwnerDrawFixed : Bu seçenekte çizime müdahele edebilirsiniz ancak bütün elemanların boyutları aynıdır.

3) OwnerDrawVariable : Bu seçenekte çizime müdahele edebilirsiniz ve elemanların boyutları farklı olabilir.
6.gif


İlk olarak değişkenlerimizi tanımlayalım. Bu değişkenlerin global (kodunuzda her yerde geçerli) olmasına dikkat edin. Bunun için bu değişkenleri herhangi bir metot (Private Sub ile başlayanlar metotdur) içine yazmayın. Mümkünse Windows Form Designer generated code Bölümünün hemen altına yazın.

Private images(3) As Bitmap ‘ Normal resim
Private images_hover(3) As Bitmap ‘ Hover resim
Private texts(3) As String ‘ Yazı

Değişkenleri dizi değişkeni tanımladığıma dikkat edin. Böylece ileride bir projede kullanmaya çalıştığınızda çok daha rahat düzenleyebilirsiniz.

Fontu değiştirmek için System.Drawing.Font sınıfından bir nesne yaratın. Böylece ComboBox daki yazılarınız bu fontta görüntülenecek.

Private fnt As New Font("Tahoma", 8)

Formun load olayında dizilerinizi hazırlayın ve combobox kontrolüne elemanları ekleyin.

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
images(0) = New Bitmap("img/CPlusPlus.gif")
images(1) = New Bitmap("img/CSharp.gif")
images(2) = New Bitmap("img/VisualBasic.gif")

images_hover(0) = New Bitmap("img/CPlusPlus_hover.gif")
images_hover(1) = New Bitmap("img/CSharp_hover.gif")
images_hover(2) = New Bitmap("img/VisualBasic_hover.gif")

texts(0) = "C ++"
texts(1) = "C Sharp"
texts(2) = "Visual Basic"

ComboBox1.Items.Add(texts(0))
ComboBox1.Items.Add(texts(1))
ComboBox1.Items.Add(texts(2))
End Sub

Ben resimleri exe nin bulunduğu klasörün içinde img klasörünü oluşturup, oraya koydum. Bu arada resimler ikiye ayrılıyor. Hover durumları için ayrı, normal durumları için ayrı.

Son olarak combobox kontrolündeki elemanların çizimine müdahele edilen combobox ın DrawItem olayına aşağıdaki kodları ekleyerek çiziminizi yapın.

Private Sub ComboBox1_DrawItem(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawItemEventArgs) Handles ComboBox1.DrawItem
If e.Index <> -1 Then
If e.State And DrawItemState.Focus Then
e.Graphics.FillRectangle(Brushes.DarkGray, e.Bounds)
e.Graphics.DrawImage(images_hover(e.Index), e.Bounds.X, e.Bounds.Y)
e.Graphics.DrawString(texts(e.Index), fnt, Brushes.LightBlue, images(e.Index).Width + 10, e.Bounds.Y)
Else
e.Graphics.FillRectangle(Brushes.White, e.Bounds)
e.Graphics.DrawImage(images(e.Index), e.Bounds.X, e.Bounds.Y) e.Graphics.DrawString(texts(e.Index), fnt, Brushes.Black, images(e.Index).Width + 10, e.Bounds.Y)
End If
End If
End Sub

Burada ilk önce DropDownStyle özelliğini DropDownList olarak ayarlamanız gerekiyor. Bu özellik size combobox da varsayılan olarak hiçbir elemanın seçili olmadan gelmesini sağlar. Eğer combobox da hiçbir eleman seçili değilse e.Index property si -1 e eşit olur.

e.State ve DrawItemState.Focus size hangi elemanın üstünde gezilip gezilmediğini anlatır. Eğer elemanın üstünde ise olumlu sonuç (True) çıkartır.
Eğer bir elemanın üstünde ise o elemanın arka planı e.Graphics.FillRectangle ile boyanır eğer seçili ise ben o elemanın içeriğini koyu gri ile boyuyorum. E.Graphics.DrawImage ise seçili elemandaki benim istediğim resmi gösterir, burada ben images_hover dizisinden (array) seçili elemanın index ini getirtiyorum. Son olarakta E.Graphics.DrawString ile de resimlerin yanında görüntülenmesini istediğim yazıyı seçiyorum. Yazının rengini açık mavi olarak seçiyorum ve nereden başlamasın gerektiğini anlatıyorum.
Else bölümünde ise seçili olmayan elemanlarla ilgili aynı işlemleri yapıyorum. Bu bölümü anlatmayacağım çünkü seçili olma ihtimali ile aynı metotlar kullanılıyor.

Son olarakta seçili olan elemanın hangisi olduğunu anlamak kalıyor.
Bunun için ise seçili olan elemanın index ini bulup bunu ComboBox ın arrayinde hangisine karşılık geldiğine göre bulabilirsiniz. Aşağıdaki örnek kodda ben formuma bir label ekledim ve labelde gösteriyorum.

Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
Label1.Text = ComboBox1.Items(ComboBox1.SelectedIndex)
End Sub
Bu makalede ComboBox kontrolünün ekrana çizilmesi durumunda açılan listesinde resimler gösterilmesini sağladık. Bu yazının kodlarını isterseniz buradan indirebilirsiniz. Bir başka yazıda görüşmek üzere. Bu makale ile ilgili sorularınızı bana maille gönderebilirsiniz.
1.gif
2.gif
3.gif
4.gif
5.gif
 
Son düzenleme:
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.