Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[52.14.126.74] |
|
Сообщ.
#1
,
|
|
|
Опять из разряда для маленьких.
Как известно, 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 Вот собственно и всё. |
Сообщ.
#2
,
|
|
|
Реализация создания картинок в ComboBox на Visual Studio 2003, т.е. с использованием .NET Framework 1.1
В общем-то и прошлый пример рабочий, однако, в .NET 1.1 нету класса My и ещё парочки. Так что я решил написать небольшой пример и для 1-й версии FrameWork. Положите на форму ComboBox и ImageList. У ComboBox свойству DrawMode задайте значение OwnerDrawFixed. В ImageList добавьте какую-нибудь картинку. У неё будет нулевой идекс, который мы собственно и используем в примере. При загрузке формы добавим какую-нибудь информацию в 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 3 ComboBox1.Items.Add("Text" & i) 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(0), 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 |