Как известно, ComboBox не позволяет просто так добавлять перед элементами картинки, хотя порой очень хочется. Ну что ж, зато мы можем собственноручно рисовать элементы выпадающего меню, так что сейчас я покажу, как силами .NET 2.0 сделать перед элементами ComboBox картинки. Для примера сделаем аналог DriveListBox. Для начала расположите на форме ComboBox и добавьте сюда же ImageList, где мы будем хранить картинки. Добавьте в ImageList 4 изображения - обычный диск, CD-Rom, Floppy, и неизвестное устройство. Теперь нужно изменить свойства ComboBox так, чтобы можно было обрабатывать события отрисовки элементов и они при этом имели смысл: свойству DrawMode задайте значение OwnerDrawFixed. Теперь обратимся непосредственно к событиям формы. При загрузке формы заполним наш ComboBox существующими в системе дисками: Код | Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim i As Integer 'Заполняем ComboBox именами дисков For i = 0 To My.Computer.FileSystem.Drives.Count - 1 ComboBox1.Items.Add(My.Computer.FileSystem.Drives(i).Name.ToString) Next 'Добавляем к имени метку диска For i = 0 To My.Computer.FileSystem.Drives.Count - 1 'Try приходится использовать, так как Floppy дисковод вызовет исключение, сли в нём ету дискеты. Try If My.Computer.FileSystem.Drives(i).VolumeLabel = "" Then Else ComboBox1.Items.Item(i) += " (" & My.Computer.FileSystem.Drives(i).VolumeLabel.ToString & ")" End If Catch ex As Exception End Try Next End Sub
|
Затем обработаем событие отрисовки элементов ComboBox. Код | Private Sub ComboBox1_DrawItem(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawItemEventArgs) Handles ComboBox1.DrawItem Dim fnt As New Font(FontFamily.GenericSerif, 10, FontStyle.Regular) 'Шрифт для текста 'Рисуем серый прямоугльничек... e.Graphics.DrawRectangle(New Pen(Color.White, 1), New Rectangle(e.Bounds.X, e.Bounds.Y, 209, 15)) If e.Index <> -1 Then 'Рисуем иконку диска. e.Graphics.DrawImage(ImageList1.Images(GetIndex(Mid(ComboBox1.Items.Item(e.Index).ToString, 1, 3))), e.Bounds.X, e.Bounds.Y) 'Отрисовка в зависимости от состояния If e.State And DrawItemState.Selected Then e.Graphics.DrawString(" " & ComboBox1.Items.Item(e.Index).ToString, fnt, Brushes.Crimson, e.Bounds.X, e.Bounds.Y) Else e.Graphics.DrawString(" " & ComboBox1.Items.Item(e.Index).ToString, fnt, Brushes.Black, e.Bounds.X, e.Bounds.Y) End If End If End Sub 'Функция на основе полученого имени диска вычисляет, какому индексу картинки в ImageList соответствует тип диска. Private Function GetIndex(ByVal d As String) As Integer Dim i, value As Integer For i = 0 To My.Computer.FileSystem.Drives.Count - 1 With My.Computer.FileSystem.Drives.Item(i) If (.Name.ToString = d) Then 'Если имя перчисляемого диска соответствует переданному в функцию, то тогда вычисляем индекс. Select Case .DriveType Case IO.DriveType.Fixed value = 0 Case IO.DriveType.CDRom value = 1 Case IO.DriveType.Removable value = 2 Case Else value = 3 End Select End If End With Next GetIndex = value End Function
|
|