Тема: Как заменить картинку на кнопке?

Пожалуйста помогите!
Создаю toolbar динамически по команде - функцией из ARX,
(в хелпе - нашел пример), но в хелпе абсолютно нет информации о том как на кнопки теперь разместить картинки.
В принципе у ToolbarItem есть метод SetBitmaps который хочет два параметра BSTR (для маленькой и большой иконки), но вот что конкретно он хочет не понятно :(
P.S. Сейчас toolbar создается из mnu/mns, но очень хочется напрямую из ARX

Re: Как заменить картинку на кнопке?

> Viktr
Всё что я скажу, ИМХО...
Зря хочется из ARX. Подобные проблемы необходимо решать на уровне данных, а не на уровне кода. И вот почему:
1. Отладка С++ кода процесс не быстрый и не лёгкий, а написать mnu легко.
2. Чем больше размер написанного кода, тем больший объём кода надо сопровождать (такой же).
3. Идеи надо стараться выражать явно и просто, а в данном случае С++ для этого не очень подходит.

Re: Как заменить картинку на кнопке?

> archimag
Объяню почему хочется на ARX - при установке программы (библиотеки arx) замарачиваться на установку менюшек не интересно, тут же есть один самодостаточный файл *.arx и всё - запустил его, менюшки подгрузились, выгрузил - исчезли.
А про отладку Си кода - волков (отладки) боятся, в лес (в кодеры) не ходить :)

Re: Как заменить картинку на кнопке?

> Viktr
1) Как только используешь ActiveX в C++, так сразу нужно лезть в ActiveX and VBA Developer's Guide и ActiveX and VBA Reference (это Help'ы которые не в ObjectARX, а в самом AutoCAD). Набираешь заветное SetBitmaps в строке поиска и сразу находишь пример SetBitmaps Example. Откуда становится очевидно, что оба параметра это пути доступа к двум bmp-файлам:

SmallBitmapName = "c:\images\16x16.bmp"     ' Use a 16x16 pixel .BMP image
LargeBitmapName = "c:\images\32x32.bmp"     ' Use a 32x32 pixel .BMP image
newToolBarButton.SetBitmaps SmallBitmapName, LargeBitmapName

Сразу предупреждаю, что работоспособность не проверял.
2) Совершенно согласен с ArchiMag. Все равно битмапы придется устанавливать или заморачиваться с тем, что хранить их в ресурсах arx-файла, а оттуда записывать их в bmp-файлы.

Re: Как заменить картинку на кнопке?

Проблема установки ресурсов вместе модулем ARX вполне просто решается использованием Wise интсаллятора (ну и других наверно тоже). Нужно просто знать - что и как запихивать в реестр по пути
Software\Autodesk\AutoCAD\R...\ACAD-...\Profiles\MyProfile\Menus. А это можно посмотреть по аналогии с другими панелями.
Я эту проблему именно так решил :)

Re: Как заменить картинку на кнопке?

> Александр Ривилис
Большое спасибо! Все получилось.
p.s.
А по поводу как лучше создавать меню - вот сейчас сделаю через си-код и сравню (сейчас у меня всё в mnu/mns) где мороки больше при установке-удалении.
Ещё раз спасибо!

Re: Как заменить картинку на кнопке?

> Леонид
Согласен только отчасти. Есть нюансы с инсталляцией одного arx-файла под разные версии AutoCAD (2004-2006), ADT, LDDT и т.д. и разные их локализации...

Re: Как заменить картинку на кнопке?

> Леонид
В том то и дело, что установка mns/mnu меню требует знания "профайла" пользователя, т.е. путь куда писать до установки не известен и требуется дополнительно напрягать пользователя выбором нужного профайла.
При удалении же нужно уже искать по всем профайлам своё меню, что есть скушно. Можно правда не думать об этом, т.к. Автокад ругнувшись однажды сам удалит отсутствующие меню, но я считаю что это непраильно, записал-сотри.

Re: Как заменить картинку на кнопке?

> Александр Ривилис
Всё таки версий Автокада меньше чем может быть профайлов пользователя и их можно предусмотреть.

Re: Как заменить картинку на кнопке?

> Viktr
Я этот вопрос решаю несколько иначе - заставляю пользователя указать с каким AutoCAD он будет работать и создаю свой Profile именно в этой версии AutoCAD (ADT...). Но это особенность работы МАЭСТРО...

Re: Как заменить картинку на кнопке?

> Александр Ривилис
Спасибо за идею!
Попробую.

Re: Как заменить картинку на кнопке?

Альтернативный вариант.
Использовать mns файл, но загрузку его выполнять из ARX, c++ кодом.
Метод как мне кажется сочетает преимущества обоих высказанных:
1. Меню создается просто и естественно
2. Код c++ минимальный
3. Никаких заморочек с профайлами

Re: Как заменить картинку на кнопке?

> Roman
В итоге я так и сделал.

Re: Как заменить картинку на кнопке?

> Viktr
А иконки где хранишь?

Re: Как заменить картинку на кнопке?

> Александр Ривилис
Создаю dll файл с названием таким же как и в mns и набором иконок.
Иконки в ресурсах обозваны так же как и в mns.
Подобный фокус нашел в inet. Где уже не помню, но если очень надо - могу найти еще раз.
Главное в этом приеме - это знать в ARX где лежит mns (откуда его грузить). Но это дело техники.

Re: Как заменить картинку на кнопке?

Здесь также важно чтобы dll лежал вместе с mns и имел такое же название!!!
Проблема в этом подходе одна - определить когда выгружать mns. Это не всегда получается сделать корректно.
А создавать прорамно toolbar и меню - можно конечно. Это решение даже работало около пол года. Но потом оно всех достало.
Если ARX знает где лежат значки то при создании toolbar можно прописывать полный путь к ним и все будет работаь корректно.

Re: Как заменить картинку на кнопке?

> Roman
Я конечно в курсе возможности использования иконок для меню из DLL - это используется в МАЭСТРО начиная с версии под AutoCAD R14. smile Но дело не в этом, а в том, что Viktr хочет минимизировать количество файлов. А при таком подходе файлов уже три: arx, mnu (или mns) и dll. Поэтому я и подумал, что возможны варианты хранения mnu и иконок в arx-файле и при первом его запуске создавать mnu и иконки (или dll). Это конечно если не использовать инсталлятор. Просто любопытно...

Re: Как заменить картинку на кнопке?

> Александр Ривилис
Сначала

Viktr хочет минимизировать количество

Потом

хранения mnu и иконок в arx-файле и при первом его запуске создавать mnu и иконки (или dll)

Какая же здесь минимизация файлов?
Скорее упаковка? Файлов все равно после распаковки станет 3 (как минимум).
А зачем на ARX накладывать ф-и инсталятора?
По моему не стоит заморачиваться на авто-создании файлов(хотя это и не сложно, в принципе).

Re: Как заменить картинку на кнопке?

Roman пишет:

Какая же здесь минимизация файлов?

Минимизация того количества файлов, которое передается пользователю на его машину.

А зачем на ARX накладывать ф-и инсталятора

Не зачем если это какая-то комплексная система, где без инсталлятора не обойтись. А если это один arx-файл, который работает автономно и ему требуется минимальное меню с кнопками и иконки, и пользователю не позволительно курочить это меню(!) - то почему бы и нет? Это скорее дело вкуса...

Re: Как заменить картинку на кнопке?

Извините, а можно дубовый вопрос?
Я очень зол на Autodesk за то, что мои знания стуктуры mnu и mns файлов оказались бесполезными, начиная с 2006-го автокада. А тут вижу с этими файлами еще работают. Может быть я напрасно злюсь и существуют варианты использования mnu и mns файлов в дальнейшем?

Re: Как заменить картинку на кнопке?

> ttt
AutoCAD 2006 позволяет использовать mns/mnu файлы в качестве меню (т.е. выполняет конвертацию mnu/mns->cui). Другое дело, что без SP1 он делает это с грубыми ошибками...

Re: Как заменить картинку на кнопке?

Кстати, и иконки уже в 2006 не совсем BMP

Re: Как заменить картинку на кнопке?

> zhuravsky
Не путай стандартные иконки AutoCAD и bmp-ки для своих toolbar'ов.

Re: Как заменить картинку на кнопке?

Просто раньше это было не так - зачем изменили непонятно

Re: Как заменить картинку на кнопке?

> Александр Ривилис
Система у меня действительно комплексная, причем изначально написанная на Lisp и VB, теперь хочется полностью её перевести на Arx, первым шагом заменил VB, отсюда вопрос насколько логична замена LISP на ARX или есть какие то подводные камни и лучше всё равно не получиться?
P.S. от создания меню программно отказался в виду того, что обеспечить настройку расположения меню пользователем - мороки будет целая куча