Модераторы: diadiavova, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ComboBox с картинками 
:(
    Опции темы
Exception
Дата 13.1.2006, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 18
Всего: 186



Как известно, 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

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума VB .NET
diadiavova
  • Прежде чем задать вопрос, воспользуйтесь поиском: возможно Ваш вопрос уже обсуждался и на него был получен ответ.
  • Если такой же вопрос не найден, не стоит задавать свой вопрос в любую тему, создайте новую.
  • Заголовок темы должен отображать ее суть.
  • Содержание поста должно описывать проблему понятно, но в то же время, по возможности, лаконично. Сначала следует описать суть вопроса, потом можно привести пример кода, не вынуждайте других участников угадывать в чем Ваша проблема - телепатов здесь нет.
  • Будьте взаимно вежливы и дружелюбны.
  • При оформлении сообщений используйте форматирование, примеры кода заключайте в теги [CODE=vbnet][/CODE].
  • Также ознакомьтесь с общими правилами, действующими на всем форуме.
  • Если вопрос решен, не забывайте помечать тему решенной(вверху темы есть ссылка). Кроме того, если Вы хотите отблагодарить участников, оказавших помощь в решении, можно повысить им репутацию, в случае, если у Вас менее 100 сообщений в форуме и функция изменения репутации Вам недоступна, можете написать сюда.
  • Общие вопросы по программированию на платформе .NET обсуждаются здесь.
  • Литература по VB .NET обсуждается здесь.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, diadiavova.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0701 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.