Использование иконок разных размеров в ресурсах

Большим плюсом Flat Assembler является то, что при разработке создается минимальное количество файлов. Описания ресурсов хранятся прямо в исходнике ASM, что тоже очень удобно. Например, в официальной документации и исходниках описание главной иконки в ресурсах исполняемого файла выглядит примерно так:
section '.rsrc' resource data readable
 
  directory RT_ICON, icons,\
            RT_GROUP_ICON, group_icons
 
  resource icons,\
           1, LANG_NEUTRAL, icon_data
 
  resource group_icons,\
           1, LANG_NEUTRAL, main_icon
 
  ; Описание одиночной иконки
  icon main_icon, icon_data, 'main_icon.ico'

Проблема в том, что одиночной иконки в приложениях часто бывает недостаточно. Система Windows в разных ситуациях отображает разные иконки файлов. Например, при просмотре папки Проводником в режиме "Таблица" или "Значки" иконки исполняемых файлов будут разного размера. Если в исполняемом файле только одна маленькая иконка, то она будет растянута до нужного размера. Аналогично, при компактном режиме просмотра одиночная большая иконка будет сжата. Качество изображения после масштабирования в большинстве случаев оставляет желать лучшего. После усиленных поисков было найдено такое вот простое, но неочевидное решение. Почему оно не описано в документации и не реализовано ни в одном примере, непонятно. Создаете несколько файлов иконок нужных размеров и описываете их в ресурсах следующим образом:
section '.rsrc' resource data readable
 
  directory RT_ICON, icons,\
            RT_GROUP_ICON, group_icons
 
  resource icons,\
           1, LANG_NEUTRAL, icon_data1,\
           2, LANG_NEUTRAL, icon_data2,\
           3, LANG_NEUTRAL, icon_data3
 
  resource group_icons,\
           1, LANG_NEUTRAL, main_icon
 
  ; Описание иконок разных размеров, объединенных в одну
  icon main_icon,\
           icon_data1, 'icon_16x16_32bit.ico',\
           icon_data2, 'icon_32x32_32bit.ico',\
           icon_data3, 'icon_48x48_32bit.ico'

Теперь наше приложение будет красиво отображаться в разных режимах просмотра. Количество иконок не ограничено, и вы можете использовать даже монохромные или 16-цветные иконки. Но лично я считаю, что для программ на Ассемблере вполне достаточно двух полноцветных иконок размерами 16х16 и 32х32 пикселов.

Система Windows поддерживает файлы иконок особого формата, которые содержат в себе изображения сразу несколько размеров. В зависимости от ситуации из такого мультифайла система извлекает иконку нужного размера и использует при отображении. Но если попытаться использовать такой мультифайл в ресурсах программ на FASM, то из него будет взята только первая по счету иконка. Это связано с особенностями реализации макросов, описывающих ресурсы. Конечно, после компиляции можно поковыряться в ресурсах чем-нибудь типа Restorator'а, но это не самый лучший вариант. На форуме Flat Assembler удалось найти красивое решение для мультифайлов в виде модифицированного штатного макроса FASM. Теперь все иконки можно собрать в один файл и при помощи макроса по индексам выбрать нужные из них.
section '.rsrc' resource data readable
 
; Модифицированный макрос FASM
macro multi_icon group, [label, icon_file,num]
{
   common local count
     count = 0
   forward local data,size,position
     label dd RVA data,size,0,0
     virtual at 0
       file icon_file:6+(num*16),16
       load size dword from 8
       load position dword from 12
     end virtual
     data file icon_file:position,size
     count = count+1
   common local header
     align 4
     group dd RVA header,6+count*14,0,0
     header dw 0,1,count
   forward
     file icon_file:6+(num*16),12
     dw label#.resid
   common
     align 4
}
 
  directory RT_ICON, icons,\
            RT_GROUP_ICON, group_icons
 
  resource icons,\
           1, LANG_NEUTRAL, icon_data1,\
           2, LANG_NEUTRAL, icon_data2,\
           3, LANG_NEUTRAL, icon_data3
 
  resource group_icons,\
           1, LANG_NEUTRAL, main_icon
 
  ; Описание ресурса иконок теперь будет таким. Добавился индекс иконки
  ; в мультифайле, нумерация индексов начинается с нуля.
  multi_icon main_icon,\
           icon_data1, 'multi_icon.ico', 0,\
           icon_data2, 'multi_icon.ico', 1,\
           icon_data3, 'multi_icon.ico', 2

Для удобства использования макрос можно вынести в отдельный файл и по мере надобности подключать его к проектам через include.
Теги:
иконки
Добавлено: 10 Апреля 2018 20:31:21 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...