Makale Özeti

VB.NET ile ilgili pek çok forumda karşılaştığımız sorulardan biri menülerde nasıl simgeler kullanılabileceği. VB 6da olduğu gibi VB.NETte de bu işi gerçekleştirmenin pek çok farklı yolu vardır. Şimdi biz lafı mümkün olduğunca kısa tutarak bu soruna kolay bir çözüm üretmeye çalışalım.

Makale

Yeni bir proje oluşturup Form1 üzerine bir adet menu (MainMenu) ve bir adet imagelist (Imagelist) yerleştirin. (Bu örnekte kullandığım grafik dosyalarını ve örneğin kaynak kodunu yazının sonnundaki linkten download edebilirsiniz). Menümüz şu şekilde olacak;
Dosya (mnuFile)
Yeni (mnuYeni)
Aç (mnuAc)
Kaydet (mnuKaydet)
- (Seperator1)
Çıkış (mnuCikis)

Menümüzü düzenledikten ve imagelistimizi hazırladıktan sonra aşağıdaki kodu yazıyoruz..

Dim MaxMenuWidth As Integer
Dim aFont As New Font("Tahoma", 8)

Aşağıdaki satırda Handles ifadesinden sonra Grafik kullanacağınız menü üyelerini belirtmeniz gerekiyor.
Private Sub mnuDosya_MeasureItem(ByVal sender As Object, ByVal e As System.Windows.Forms.MeasureItemEventArgs) Handles mnuYeni.MeasureItem, mnuAc.MeasureItem, mnuKaydet.MeasureItem, mnuCikis.MeasureItem
Dim mi As MenuItem = CType(sender, MenuItem)
Dim textSize As Size
Dim textFormat As New StringFormat()

textSize = e.Graphics.MeasureString(mi.Text, aFont).ToSize
MaxMenuWidth = Math.Max(MaxMenuWidth, textSize.Width + 20)
textSize = e.Graphics.MeasureString(mi.Text, aFont, New PointF(0, 0), textFormat).ToSize()
e.ItemHeight = Math.Max(textSize.Height + 2, SystemInformation.SmallIconSize.Height + 2)
e.ItemWidth = MaxMenuWidth
End Sub

Aşağıdaki satırda Handles ifadesinden sonra Grafik kullanacağınız menü üyelerini belirtmeniz gerekiyor.
Private Sub mnuDosya_DrawItem(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawItemEventArgs) Handles mnuYeni.DrawItem, mnuAc.DrawItem, mnuKaydet.DrawItem, mnuCikis.DrawItem
Dim mi As MenuItem = CType(sender, MenuItem)
Dim iImage As Integer
Dim textBounds As New RectangleF(e.Bounds.Left + 20, e.Bounds.Top + 2, e.Bounds.Right, e.Bounds.Bottom - 2)
Dim textFormat As New StringFormat()
Dim textColor As Color = SystemColors.MenuText
Dim selected As Boolean = False

textFormat.HotkeyPrefix = Drawing.Text.HotkeyPrefix.Show
selected = ((e.State And DrawItemState.Selected) = DrawItemState.Selected)
If selected = True Then
e.DrawBackground()
textColor = SystemColors.HighlightText
Else
e.Graphics.FillRectangle(SystemBrushes.Menu, e.Bounds)
End If

Aşağıda menu üyesinin üzerindeki texte göre imagelistten hangi grafiği kullanacağını belirliyoruz.
Select Case mi.Text
Case "&Yeni" : iImage = 0
Case "&Aç" : iImage = 1
Case "&Kaydet" : iImage = 2
Case Else
iImage = -1
End Select
If iImage <> -1 Then
e.Graphics.DrawImageUnscaled(ImageList.Images(iImage), e.Bounds.Left + 1, e.Bounds.Top + 1)
End If
e.Graphics.DrawString(mi.Text, aFont, New SolidBrush(textColor), textBounds, textFormat)
End Sub

Hepsi bu kadar. Artık menümüzün Yeni, Aç ve Kaydet seçeneklerinin yanlarında simgeler yer almakta.

İsterseniz bu örnekte anlattığım kaynak kodu buradan download edebilirsiniz.


Kadir Sümerkent
kadir@postmaster.co.uk