Использование иконок разных размеров в ресурсах
Большим плюсом Flat Assembler является то, что при разработке создается минимальное количество файлов. Описания ресурсов хранятся прямо в исходнике ASM, что тоже очень удобно. Например, в официальной документации и исходниках описание главной иконки в ресурсах исполняемого файла выглядит примерно так:Code (Assembler) : Убрать нумерацию
- 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'
Code (Assembler) : Убрать нумерацию
- 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'
Система Windows поддерживает файлы иконок особого формата, которые содержат в себе изображения сразу несколько размеров. В зависимости от ситуации из такого мультифайла система извлекает иконку нужного размера и использует при отображении. Но если попытаться использовать такой мультифайл в ресурсах программ на FASM, то из него будет взята только первая по счету иконка. Это связано с особенностями реализации макросов, описывающих ресурсы. Конечно, после компиляции можно поковыряться в ресурсах чем-нибудь типа Restorator'а, но это не самый лучший вариант. На форуме Flat Assembler удалось найти красивое решение для мультифайлов в виде модифицированного штатного макроса FASM. Теперь все иконки можно собрать в один файл и при помощи макроса по индексам выбрать нужные из них.
Code (Assembler) : Убрать нумерацию
- 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
Просмотров: 7789 | Комментариев: 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
...
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, …
но после компиляции получался битый файл.
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
Отличная статья
Отличная статья
Добавить комментарий
Заполните форму для добавления комментария