Blog. Just Blog

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

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Образ мышления: Assembler | Автор: ManHunter
Большим плюсом Flat Assembler является то, что при разработке создается минимальное количество файлов. Описания ресурсов хранятся прямо в исходнике ASM, что тоже очень удобно. Например, в официальной документации и исходниках описание главной иконки в ресурсах исполняемого файла выглядит примерно так:
  1. section '.rsrc' resource data readable
  2.  
  3.   directory RT_ICON, icons,\
  4.             RT_GROUP_ICON, group_icons
  5.  
  6.   resource icons,\
  7.            1, LANG_NEUTRAL, icon_data
  8.  
  9.   resource group_icons,\
  10.            1, LANG_NEUTRAL, main_icon
  11.  
  12.   ; Описание одиночной иконки
  13.   icon main_icon, icon_data, 'main_icon.ico'
Проблема в том, что одиночной иконки в приложениях часто бывает недостаточно. Система Windows в разных ситуациях отображает разные иконки файлов. Например, при просмотре папки Проводником в режиме "Таблица" или "Значки" иконки исполняемых файлов будут разного размера. Если в исполняемом файле только одна маленькая иконка, то она будет растянута до нужного размера. Аналогично, при компактном режиме просмотра одиночная большая иконка будет сжата. Качество изображения после масштабирования в большинстве случаев оставляет желать лучшего. После усиленных поисков было найдено такое вот простое, но неочевидное решение. Почему оно не описано в документации и не реализовано ни в одном примере, непонятно. Создаете несколько файлов иконок нужных размеров и описываете их в ресурсах следующим образом:
  1. section '.rsrc' resource data readable
  2.  
  3.   directory RT_ICON, icons,\
  4.             RT_GROUP_ICON, group_icons
  5.  
  6.   resource icons,\
  7.            1, LANG_NEUTRAL, icon_data1,\
  8.            2, LANG_NEUTRAL, icon_data2,\
  9.            3, LANG_NEUTRAL, icon_data3
  10.  
  11.   resource group_icons,\
  12.            1, LANG_NEUTRAL, main_icon
  13.  
  14.   ; Описание иконок разных размеров, объединенных в одну
  15.   icon main_icon,\
  16.            icon_data1, 'icon_16x16_32bit.ico',\
  17.            icon_data2, 'icon_32x32_32bit.ico',\
  18.            icon_data3, 'icon_48x48_32bit.ico'
Теперь наше приложение будет красиво отображаться в разных режимах просмотра. Количество иконок не ограничено, и вы можете использовать даже монохромные или 16-цветные иконки. Но лично я считаю, что для программ на Ассемблере вполне достаточно двух полноцветных иконок размерами 16х16 и 32х32 пикселов.

Система Windows поддерживает файлы иконок особого формата, которые содержат в себе изображения сразу несколько размеров. В зависимости от ситуации из такого мультифайла система извлекает иконку нужного размера и использует при отображении. Но если попытаться использовать такой мультифайл в ресурсах программ на FASM, то из него будет взята только первая по счету иконка. Это связано с особенностями реализации макросов, описывающих ресурсы. Конечно, после компиляции можно поковыряться в ресурсах чем-нибудь типа Restorator'а, но это не самый лучший вариант. На форуме Flat Assembler удалось найти красивое решение для мультифайлов в виде модифицированного штатного макроса FASM. Теперь все иконки можно собрать в один файл и при помощи макроса по индексам выбрать нужные из них.
  1. section '.rsrc' resource data readable
  2.  
  3. ; Модифицированный макрос FASM
  4. macro multi_icon group, [label, icon_file,num]
  5. {
  6.    common local count
  7.      count = 0
  8.    forward local data,size,position
  9.      label dd RVA data,size,0,0
  10.      virtual at 0
  11.        file icon_file:6+(num*16),16
  12.        load size dword from 8
  13.        load position dword from 12
  14.      end virtual
  15.      data file icon_file:position,size
  16.      count = count+1
  17.    common local header
  18.      align 4
  19.      group dd RVA header,6+count*14,0,0
  20.      header dw 0,1,count
  21.    forward
  22.      file icon_file:6+(num*16),12
  23.      dw label#.resid
  24.    common
  25.      align 4
  26. }
  27.  
  28.   directory RT_ICON, icons,\
  29.             RT_GROUP_ICON, group_icons
  30.  
  31.   resource icons,\
  32.            1, LANG_NEUTRAL, icon_data1,\
  33.            2, LANG_NEUTRAL, icon_data2,\
  34.            3, LANG_NEUTRAL, icon_data3
  35.  
  36.   resource group_icons,\
  37.            1, LANG_NEUTRAL, main_icon
  38.  
  39.   ; Описание ресурса иконок теперь будет таким. Добавился индекс иконки
  40.   ; в мультифайле, нумерация индексов начинается с нуля.
  41.   multi_icon main_icon,\
  42.            icon_data1, 'multi_icon.ico', 0,\
  43.            icon_data2, 'multi_icon.ico', 1,\
  44.            icon_data3, 'multi_icon.ico', 2
Для удобства использования макрос можно вынести в отдельный файл и по мере надобности подключать его к проектам через include.

Поделиться ссылкой ВКонтакте Поделиться ссылкой на Facebook Поделиться ссылкой на LiveJournal Поделиться ссылкой в Мой Круг Добавить в Мой мир Добавить на ЛиРу (Liveinternet) Добавить в закладки Memori Добавить в закладки Google
Просмотров: 6796 | Комментариев: 5

Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
Йцукен (04.05.2014 в 14:47):
ManHunter, спасибо!
ManHunter (04.05.2014 в 10:40):
directory RT_RCDATA, exefile
...
resource exefile,\
   1,LANG_NEUTRAL,exe_file
...
resdata exe_file
  file 'your_exe_file.exe'
endres
йцукен (04.05.2014 в 06:27):
Как добавить в ресурс exe файл?
newbie (20.01.2013 в 18:40):
Не подскажите, как средствами FASM'а добавлять ресурсы с одним res_id, но с разными lang_id? Я пробовал такой код:

  section '.rsrc' resource data readable
  directory RT_VERSION, version
  resource version,\
    1, LANG_ENGLISH + SUBLANG_DEFAULT, vinfoen,\
    1, LANG_RUSSIAN + SUBLANG_DEFAULT, vinforu
  versioninfo vinfoen, VOS__WINDOWS32, VFT_APP, VFT2_UNKNOWN,\
              LANG_ENGLISH + SUBLANG_DEFAULT, 0, …
  versioninfo vinforu, VOS__WINDOWS32, VFT_APP, VFT2_UNKNOWN,\
              LANG_RUSSIAN + SUBLANG_DEFAULT, 1251, …

но после компиляции получался битый файл.
Grey (05.04.2012 в 17:45):
+1024
Отличная статья

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2021
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.11 сек. / MySQL: 2 (0.0056 сек.) / Память: 4.75 Mb
Наверх