При написании приложений такие общие компоненты, как ComboBox и ListBox, обычно используются не только для отображения текста, но и для отображения значков, связанных с текстом. В обычных приложениях Windows отображение этих значков будет меняться по мере изменения отображаемого текста. Например, когда все файлы в текущем каталоге перечислены в поле со списком, отображение в левой части поля со списком связано с. имя файла. Связанные значки называются динамическими значками. Шаги по использованию динамических значков в Delphi следующие: 1. Получение значков.
Чтобы использовать динамические значки, первое, что нужно решить, — это как получить отображаемый текст и связанный с ним дескриптор значка. Значок определяется системным реестром посредством ассоциации файлов, а в программировании Windows один и тот же файл (или подкаталог или папка) также может иметь два результата отображения на рабочем столе: имя файла DOS и отображаемое имя (отображаемое имя). . Если наше приложение не должно иметь тот же эффект, что и браузер ресурсов Windows, мы можем использовать функции FindFirst() и FindNext() и процесс FindClose() для получения имени файла DOS. В противном случае нам следует использовать Windows API. чтобы получить отображаемое имя. Получив имя файла, вы можете получить дескриптор его значка HICON, используя функцию SHGetFileInfo() в ShellAPI.pas. Инструкции следующие:
функция SHGetFileInfo(pszPath: PAnsiChar; dwFileAttributes: DWord;var psfi: TSHFileInfo; cbFileInfo,uFlags: UINT): DWORDl;
Параметр pszPath: указанное имя файла. Если значение uFlags не содержит SHGFI_PIDL, его можно указать напрямую; в противном случае pszPath должен быть получен путем расчета и не может быть указан напрямую;
Параметр dwFileAttributes: атрибуты файла, действительны только в том случае, если значение uFlags содержит SHGFI_USEFILEATTRIBUTES, этот параметр обычно не используется;
Параметр psfi: возвращает полученную информацию о файле, который представляет собой тип записи со следующими полями:
hIcon: HICON; //дескриптор значка файла
iIcon: Integer; //Системный индекс значка
dwAttributes: DWORD; //Значения атрибутов файла
szDisplayName: массив [0..MAX_PATH-1] AnsiChar //Отображаемое имя файла;
szTypeName: массив [0..79] AnsiChar //Имя типа файла;
Параметр cbFileInfo: битовое значение psfi;
Параметр uFlags: указывает идентификатор информации о файле, который необходимо вернуть. Обычно используются следующие константы:
SHGFI_ICON; //Получить значок
SHGFI_DISPLAYNAME; //Получить отображаемое имя;
SHGFI_TYPENAME; //Получить имя типа
SHGFI_ATTRIBUTES;//Получаем атрибуты
SHGFI_LARGEICON; //Получить большую иконку
SHGFI_SMALLICON; //Получаем маленькую иконку
SHGFI_PIDL; // pszPath — идентификатор
Возвращаемое значение функции SHGetFileInfo() также зависит от значения uFlags. Вызвав SHGetFileInfo(), вы можете получить дескриптор значка файла из параметра psfi, но обратите внимание, что если SHGFI_PIDL не используется в параметре uFlags, SHGetFileInfo() не может получить информацию о виртуальных папках, таких как «Мой компьютер». 2. Загрузка иконок
Используйте компонент TImageList, предоставленный Delphi, чтобы загрузить полученную иконку, вызвав функцию ImageList_AddIcon() в CommCtrl.pas, и убедитесь, что ее индексный номер соответствует отображаемому тексту. Инструкции следующие:
function ImageList_AddIcon(ImageList: HIMAGELIST; //Загружаем дескриптор ImageList значка
Icon: Hicon //Описатель загруженного значка): Integer //Возвращаем порядковый номер значка в ImageList;
Возвращаемое значение ImageList_AddIcon() можно использовать, когда вам нужно указать порядковый номер значка. 3. Графический вывод иконок и текста
Для таких компонентов, как поля со списком и списки, которые не могут напрямую отображать значки, поскольку они должны отображать значки и текст одновременно, этого можно добиться, установив соответствующие свойства стиля. Примеры:
Поле со списком: ComboBox1.Style:=csOwnerDrawVariable Согласно реальному опыту использования, лучше не устанавливать его непосредственно в форме ObjectInspector. Вместо этого код следует добавить в соответствующее место в программе, иначе высота изменится неравномерно. области рисования может произойти.
Поле списка: ListBox1.Style:=lbOwnerDrawVariable
Строка состояния: StatusBar1.Panels[i].Style:= psOwnerDraw не может использовать простую строку состояния. i — это индексный номер определенной панели в строке состояния, где должен быть нарисован значок. Графический вывод может использовать ImageList1.Draw. () метода TImageList, а вывод текста может использовать метод TextOut() класса TCanvas, который унаследован от свойства Canvas компонента. Очевидно, что компоненты без свойств Canvas не могут использовать этот метод для отображения значков.
Для компонентов, которые могут напрямую отображать значки, напрямую укажите необходимые свойства значков, такие как Images и StateImages, в качестве соответствующих имен компонентов TimageList, и значок можно отобразить, указав индексный номер значка. Следует отметить, что при использовании больших значков необходимо сначала вызвать метод CreateSize() класса TImageList, чтобы указать размер загружаемого значка, и снова вызывать CreateSize() после каждого вызова метода Clear класса TImageList.
Используйте метод ImageList1.Clear класса TImageList для очистки загруженных значков, который часто используется, когда требуется обновление.