Программирование на Visual Basic

Visual Basic иконки

    Средствами Visual Basic можно загрузить одну единственную иконку из одного файла. Но что делать если необходимо загрузить из файла несколько иконок. Или, например, получить иконку соответствующую типу файла. Для этого нам нужно будет использовать Windows API.
    Для загрузки иконок из файлов, используются функции:

Declare Function ExtractIcon Lib "shell32.dll" Alias "ExtractIconA" ( _
ByVal hInst As Long, ByVal lpszExeFileName As String, _
ByVal nIconIndex As Long) As Long

Declare Function ExtractAssociatedIcon Lib "shell32.dll" Alias "ExtractAssociatedIconA" ( _
ByVal hInst As Long, ByVal lpIconPath As String, lpiIcon As Long) As Long

   Первый параметр одинаков для обеих функций - это манипулятор приложения извлекающего иконки.
В VB для этого используется App.hInstance. 
  lpszExeFileName   - имя файла из которого извлекаются иконки. Это может быть как исполнимый файл, так и библиотека, или отдельный ICO-файл.
  lpIconPath - имя файла, для которого отыскивается иконка. По этому имени Windows находит ассоциированную иконку.
  Оба эти параметра должны быть длиной не более  MAX_PATH (260) символов.
  nIconIndex - номер извлекаемой иконки, или -1, для получени числа иконок в файле.
  lpiIcon - переменная, в которую будет записан идентификатор ресурса полученной иконки.
  Эти функции не могут вернуть объект типа IStdPicture, который используется в Visual Basic. Они возвращают манипулятор загруженной иконки. Кстати эти функции загружают не только иконки, но и курсоры (для Windows они равнозначны). Для прорисовки таких иконок используются следующие функции:

Declare Function DrawIcon Lib "user32" Alias "DrawIcon" ( _
ByVal hdc As Long, ByVal xLeft As Long, ByVal yTop As Long, _
ByVal hIcon As Long) As Long

Declare Function DrawIconEx Lib "user32" Alias "DrawIconEx" ( _
ByVal hdc As Long, ByVal xLeft As Long, ByVal yTop As Long, _
ByVal hIcon As Long, ByVal cxWidth As Long, ByVal cyHeight As Long, _
ByVal istepIfAniCur As Long, ByVal hbrFlickerFreeDraw As Long, _
ByVal diFlags As Long) As Long

  hDC - манипулятор контекста устройства, на котором будет выведена иконка. У VB объектов это свойство hDC. В этом случае у объекта свойство AutoRedraw должно быть установлено в True, и после вывода иконки нужно перерисовать объект методом Refresh.
  xLeft/yTop  - Координаты, в которые будет выведена иконка.
  hIcon - Манипулятор прорисовываемой иконки.
  cxWidth/cyHeight - размеры прорисовываемой иконки.
  istepIfAniCur - Если Вы загрузили анимированный курсор, то этот параметер указывает на номер кадра.
  hbrFlickerFreeDraw - манипулятор кисти используемой для перерисовки значка. По документации, если этот параметер не опущен, то он должен снизить мерцание при прорисовке.
  diFlags - Флаги прорисовки:

  • DI_NORMAL = 3 - Прорисовка иконки полностью.
  • DI_IMAGE = 2  - Прорисовка XOR маски (изображение на черном фоне).
  • DI_MASK = 1 - Прорисовка AND маски(ч/б негатив).

  Мы можем открывать и прорисовывать иконки, теперь мы должны научиться удалять их. Все объекты Visual Basic удаляются сами, когда завершается блок, в котором они используются, но   иконки созданы вручную и VB о них ничего не знает, а значит нам придётся "убрать за собой". Для этого используется следующая функция.

Declare Function DestroyIcon Lib "user32" Alias "DestroyIcon" ( _
ByVal hIcon As Long) As Long

Теперь посмотрим, как всё это выглядит в оболочке Visual Basic:

Public Function GetIconCount(ByVal FileName As String) As Long
If Len(FileName) = 0 Then Exit Function
GetIconCount = ExtractIcon(0, FileName, -1)
End Function

Public Sub VBDrawIcon(ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, ByVal FileName As String, ByVal IconNum As Long, Optional Width As Long, Optional Height As Long)
If Len(FileName) = 0 Then Exit Sub
Dim hIcon As Long
" Получаем иконку из файла.
hIcon = ExtractIcon(App.hInstance, FileName, IconNum)
If hIcon = 0 Then Exit Sub
" Если ширина не указана используется стандартная функция
If Width = 0 Then
    DrawIcon hdc, X, Y, hIcon
Else
    " Иначе иконка рисуется с заданными размерами.
    If Height = 0 Then Height = Width
    DrawIconEx hdc, X, Y, hIcon, Width, Height, 0, 0, 3
End If
" В завершение икнока уничтожается
DestroyIcon hIcon
End Sub

Public Sub VBDrawAssociatedIcon(ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, ByVal FileName As String, Optional Width As Long, Optional Height As Long)
If Len(FileName) = 0 Then Exit Sub
Dim IconNum As Long, hIcon As Long
" Получаем манипулятор связанной с файлом иконки
hIcon = ExtractAssociatedIcon(App.hInstance, FileName, IconNum)
If hIcon = 0 Then Exit Sub
" Если ширина не указана используется стандартная функция
If Width = 0 Then
    DrawIcon hdc, X, Y, hIcon
Else
    " Иначе иконка рисуется с заданными размерами.
    If Height = 0 Then Height = Width
    DrawIconEx hdc, X, Y, hIcon, Width, Height, 0, 0, 3
End If
" В завершение икнока уничтожается
DestroyIcon hIcon
End Sub

Вот, в обшем и всё, что я хотел изложить в этой статье. Конечно возможности Windows в работе с иконками на этом не исчерпываются, но это немного другая тема.

Hosted by uCoz