На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: maxim84_
  
> ComboBox с картинками
    Опять из разряда для маленьких.

    Как известно, ComboBox не позволяет просто так добавлять перед элементами картинки, хотя порой очень хочется. Ну чтож, зато мы может собственноручно рисовать элементы выпадающего меню, так что сейчас я покажу, как силами .NET 2.0 сделать перед элементами ComboBox картинки.
    Для примера сделаем аналог DriveListBox.
    Для начала расположите на форме ComboBox и добавьте сюда же ImageList, где мы будем хранить картинки. Добавьте в ImageList 4 изображения - обычный диск, CD-Rom, Floppy, и неизвестное устройство. Теперь нужно изменить свойства ComboBox так, чтобы можно было обрабатывать события отрисовки элементов и они при этом имели смысл: свойству DrawMode задайте значение OwnerDrawFixed.
    Теперь обратимся непосредственно к событиям формы.
    При загрузке формы заполним наш ComboBox существующими в системе дисками:
    ExpandedWrap disabled
          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.
    ExpandedWrap disabled
          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

    Вот собственно и всё.
      Реализация создания картинок в ComboBox на Visual Studio 2003, т.е. с использованием .NET Framework 1.1

      В общем-то и прошлый пример рабочий, однако, в .NET 1.1 нету класса My и ещё парочки. Так что я решил написать небольшой пример и для 1-й версии FrameWork.

      Положите на форму ComboBox и ImageList.
      У ComboBox свойству DrawMode задайте значение OwnerDrawFixed.
      В ImageList добавьте какую-нибудь картинку. У неё будет нулевой идекс, который мы собственно и используем в примере.

      При загрузке формы добавим какую-нибудь информацию в ComboBox.

      ExpandedWrap disabled
            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.

      ExpandedWrap disabled
            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
      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
      0 пользователей:


      Рейтинг@Mail.ru
      [ Script execution time: 0,0474 ]   [ 15 queries used ]   [ Generated: 23.04.24, 06:33 GMT ]