Ресурсные dll – все в одном месте

Каждый раз, как мне надо собрать новую ресурсную dll, я судорожно начинаю искать нужную информацию. Надоело! Все, что посчитаю важным, закину сюда.

С любезного разрешения Андрея Бушмана почти полностью дублирую его статью. Скрины, взятые у Андрея, дополню (ну просто для себя) скринами с VS2015 CommunityEdition. Собственные комментарии и уточнения буду писать курсивом.
Статья написана для AutoCAD 2009, но прекрасно срабатывает и на других версиях AutoCAD.

Графические изображения, которые используются в CUI файлах, могут браться как из внешних BMP файлов, так и из неуправляемого DLL файла ресурсов, в который эти изображения помещены. Второй способ более удобен в использовании. Здесь рассматривается, как создавать такие DLL файлы и как их использовать в CUI файлах.

AutoCAD давно (начиная с версии 2010) использует формат CUIX в качестве частичных файлов меню, представляющий собой обычный архив, расширение которого переименовано с ZIP на CUIX. Однако в нашей компании используется AutoCAD 2009 SP3, который не умеет работать с CUIX, но использует более старый формат - CUI файлы, содержимое которых представлено в формате XML.

Кроме того, начиная с версии 2015, если не ошибаюсь, в AutoCAD введены два варианта оформления - темная тема и светлая тема. Сделать иконку, которая будет видна и там, и там, очень сложно. А имя картинки менять "на лету" не самое лучшее решение. Подробнее - ниже.

Создание DLL файла ресурсов

В MS Visual Studio 2012 создаём новый проект, на основе шаблона Empty Project и назначаем ему нужное имя:

new_project_2012 new_project2015

Первым делом сразу устанавливаем конфигурацию в Release Win32:

configuration configuration2015

Теперь в окне Solution Explorer нажимаем правой кнопкой мыши на имени проекта и в появившемся контекстном меню выбираем пункт Properties. Назначаем нужные значения свойствам Target Extension и Configuration Type:

project_type2012 project_type2015

Кроме этого, в настройках проекта нужно изменить ещё одну опцию - No Entry Point:

no_entry_point2012 no_entry_point2015

Произведя обозначенные выше изменения, жмём кнопку Применить и ОК. Теперь свойства нашего, пока ещё пустого проекта настроены должным образом. На вкладке Solution Explorer, из контекстного меню проекта, выбираем пункт Add -> New Item... и в появившемся диалоговом окне выбираем шаблон файла ресурсов:

add_resource_file2012 add_resource_file2015

Имя файлу можно назначить любое, в нашем примере оставляем Resource.rc. Жмём кнопку Add. Добавленный нами файл будет содержать в себе перечень изображений, которые будут использоваться в наших CUI(x) файлах.

Андрей рекомендует картинки, которые будут "загоняться" в dll, помещать в подкаталог \images. Вполне разумная рекомендация, хотя и не критична. Другой вопрос, что настоятельно рекомендую все же помещать ресурсы так, чтобы для них можно было "вычислить" относительный путь. Очень помогает, если разработка ведется не на одном рабочем месте.

В качестве эксперимента добавим BMP файлы разных размеров: 16x16, 24x24, 32x32, 48x48, 64x64 и 128x128. Кнопки на палитрах инструментов должны содержать изображения размером 16x16, а кнопки, размещённые на палитрах Ribbon, имеют размеры поболее. В нашем тестовом CUI файле разместим кнопки с указанными выше разрешениями и там и там, дабы посмотреть результат использования различных размеров.

Уточнение: BMP должен гарантированно подгружаться в VS. Для пользователей GIMP не самые лучшие новости: BMP приходится создавать с глубиной цвета 24 бит и сохранять без сжатия. Если сохранить без сжатия не получается, то через пакетное преобразование с помощью FastStone Image Viewer можно легко добиться нужного результата.

Можно было бы копировать и файлы в формате PNG, однако AutoCAD 2009 не умеет в CUI файлах использовать изображения такого формата.

Уточнение: можно попытаться подключать не *.bmp, а *.ico-файлы. Потребуется, конечно, некоторая дополнительная работа, но это возможно.
В старых версиях для обеспечения "прозрачности" фона следует использовать цвет RGB 192,192,192. Старые версии AutoCAD обрабатывают его как прозрачный.
И вот еще - AutoCAD2018 уже не "понимает" bmp, и требует как раз png

Теперь возвращаемся к нашей IDE: переключаемся на вкладку Resource View.

add_resource_file2012 resource_vew2015

Из контекстного меню элемента Resource.rc вызываем пункт Add Resource...

add_images2012 add_resouce2015

В диалоговом окне Add Resource в списке Resource type выбираем элемент Bitmap, жмём кнопку Import... и указываем BMP файлы из созданного нами ранее подкаталога \images. Получаем такой результат (вид абсолютно одинаков что для 2012, что для 2015)
items2012

Теперь для каждого элемента значение свойства ID нужно обособить двойными кавычками, чтобы их можно было успешно использовать в наших CUI(x) файлах:
items_2_2012

Всё, теперь компилируем наш DLL файл (клавиша F6 или через меню Build -> Build Solution).

Конец цитирования, дальнейшие действия по использованию DLL пропишу потом, если вдруг понадобится.

Теперь кое-что из собственного (и не только собственного) опыта.

Подобная технология прекрасно работает при использовании частичных файлов адаптации. Если попробовать собрать такую dll для корпоративного файла адаптации, то заменить уже имеющуюся dll не получится: сначала все пользователи должны выключить AutoCAD.

Имя dll должно совпадать с именем cui(x) файла. Крайне желательно положить dll рядом с cui(x) файлом. Теоретически можно ее просто закинуть в пути поддержки, но лично я подобным никогда не занимался - потом замучаешься искать.

По поводу тем оформления, как было обещано, на основе информации на форуме ADN-CIS и справки Autodesk:

  1. В версиях AutoCAD без темы оформления ресурсы забирались из dll, имеющей то же имя, что и файл cui(x)
  2. В версиях AutoCAD с темами оформления необходимо создать отдельный ресурс DLL для каждой темы: светлой и темной. Соответствующий DLL ресурса используется на основе того, какая тема в настоящий момент применена к пользовательскому интерфейсу. По соглашению об именовании файлов DLL требуется использовать то же имя, что и имя файла адаптации, но также необходимо добавить суффикс "_light" для файла DLL, который будет использоваться в качестве светлой темы. Например, если загружен файл CUIx под именем mymenu.cuix, AutoCAD выполняет поиск файла библиотеки ресурсов mymenu_light.dll, если используется светлая тема, и файла mymenu.dll, если используется темная тема.

Последовательность компиляции библиотек с учетом варианта темы оформления отлично описал Дмитрий Загорулькин:

...CUIX-файл делал один на версии 2014-2016, проблем с этим не было. Также, сделал два C++ проекта с ресурсными иконочными DLL - один для темной схемы, второй - для светлой. В настройках проектов в разделе "Build Events - Post Build Events" можно настроить события таким образом, чтобы создаваемые dll файлы после сборки сразу копировались в нужные папки под нужным названием. В папку для 2014 версии - только "светлая" dll без суффикса, в папку для версий 2015-2016 - "светлая" с суффиксом "_light", "темная" - без суффикса. Я сперва так делал, а потом настроил то же самое но уже в проекте WIX-инсталлятора. В общем, каким образом ни делай, есть возможность один раз настроить и уже потом не думать откуда и какие файлы нужно скопировать и как назвать - все делается автоматически.
Как AutoCAD определяет, какой DLL подгружать:
- в версиях до 2014 включительно подгружается только та DLL с иконками, название которой совпадает с названием файла CIUX. К примеру, есть файл: "MyTools.cuix", иконки для этого файла ищутся в файле "MyTools.dll".
- в версиях 2015-2016 для темной схемы подгружается DLL, совпадающая с названием CUIX, для светлой - название с суффиксом "_light". Пример: "MyTools.cuix", иконки для темной схемы: "MyTools.dll", для светлой: "MyTools_light.dll".
Еще один неочевидный момент. Можно создавать один ICO файл для иконок 16х16 и 32х32. Для этого внутрь ICO нужно поместить два соответствующих изображения. В настройках кнопки указывается при этом одинаковый ID изображения для большой и маленькой кнопки. AutoCAD сам выберет иконку в зависимости от размера выводимого изображения. Этот прием позволяет сильно сократить количество ICO файлов в ресурсах C++ проекта.

К вопросу об использовании ico-файлов. Тут все просто - читаем статью Использование ресурсной dll для CUIx с прозрачными растрами. Скажу честно - я пока подобным не игрался, но поверю Диме.
===
Добавлено:
Цитата из статьи по поводу подключения ico-файлов:

Достаточно просто добавить новый ico-ресурс при помощи редактора Visual Studio и отредактировать свойства “ICO” ресурса в “RCDATA” как показано ниже:

1
2
3
4
5
6
7
    //////////////////////////////////////////////////////////////////
    // Иконку с наименьшим ID помещаем первой, чтобы быть уверенным что иконка
    // приложения останется доступной во всех системах.
    IDI_TRIANGLE16     RCDATA           ".\\resources\\icon1.ico"
    IDI_TRIANGLE32     RCDATA           ".\\resources\\icon2.ico"
    #endif    // English (Australia) resources
    //////////////////////////////////////////////////////////////////


Комментарии

Есть 4 коммент. к “Ресурсные dll – все в одном месте”
  1. GeoBuilder пишет:

    ICO вообще тема!
    Раньше PNG использовал, но их в dll не засунуть, пришлось на ICO переходить. Причём мощные редакторы типа Photoshop'а или Corel'а не очень удобны, купил "Студию иконок"
    Вот пример последних панелек:
    https://pp.userapi.com/c836536/v836536295/564eb/wc2SPHstMW8.jpg

  2. Кулик Алексей aka kpblc пишет:

    И сколько стоит "студия иконок"?
    P.S. Я тут подумываю о том, чтобы ico через GIMP создавать - вроде бы он умеет это делать. Но как-то руки пока не доходят...

  3. GeoBuilder пишет:

    Всего 700 р. это Российский продукт. Есть импортные аналоги бесплатно ломанные, но я недавно став сам продавать свои приложения, решил тоже поддержать разработчиков этой студии :-)
    http://www.aha-soft.com/rus/iconstudio/reg.htm
    Причём регистрация по логину\паролю, даёт возможность потом активировать эту "студию" на любом количестве своих ПК.
    Там етсь пробный период, кажись стандартно 30 дней, можно сперва попробовать.

  4. Кулик Алексей aka kpblc пишет:

    Спасибо :) Попробую, может, что-то внятное и получится ))

Поделитесь своим мнением


Я не робот.