30/04/2016
Добавление иконки к имени команды без использования CUIX
Вопрос: как программно добавить иконку для своей команды в контекстное меню, возникающее при наборе команды вручную? Один из способов мне известен – это регистрация команды в cuix-файле, как описано здесь: Adding Icon Next To Custom Command. Хотелось бы добиться такого же результата, но без создания cuix-файла.
Ответ: средствами ObjectARX это возможно. Думаю, что можно и при помощи AutoCAD .NET API, но понадобится активно использовать P/Invoke для большого числа функций из Win32 и ObjectARX. Я покажу здесь как это можно сделать при помощи ObjectARX:
Код - C#: [Выделить]
- //-----------------------------------------------------------------------------
- //----- acrxEntryPoint.cpp
- //-----------------------------------------------------------------------------
- #include "StdAfx.h"
- #include "resource.h"
- //-----------------------------------------------------------------------------
- #define szRDS _RXST("")
- //-----------------------------------------------------------------------------
- //----- ObjectARX EntryPoint
- class CCommandIconApp : public AcRxArxApp {
- public:
- CCommandIconApp () : AcRxArxApp () { isCmdBitmapQueryReg = FALSE; }
- virtual AcRx::AppRetCode On_kInitAppMsg (void *pkt) {
- AcRx::AppRetCode retCode = AcRxArxApp::On_kInitAppMsg (pkt) ;
- // Регистрируем обработчик, возвращающий по имени команды её HBITMAP
- isCmdBitmapQueryReg =
- acedRegisterCommandBitmapQuery(CommandBitmapQueryFn);
- return (retCode) ;
- }
- virtual AcRx::AppRetCode On_kUnloadAppMsg (void *pkt) {
- // Удаляем обработчик, возвращающий по имени команды её HBITMAP
- if (isCmdBitmapQueryReg)
- acedRemoveCommandBitmapQuery(CommandBitmapQueryFn);
- AcRx::AppRetCode retCode = AcRxArxApp::On_kUnloadAppMsg (pkt) ;
- return (retCode) ;
- }
- virtual void RegisterServerComponents () { }
- static void RivilisCommandIcon () {
- acutPrintf(_T("\nКоманда CommandIcon"));
- }
- /// <summary>
- /// Функция возвращает по имени команды HBITMAP для неё
- /// </summary>
- /// <param name="cmdName">имя команды</param>
- /// <param name="backgroundColor">цвет фона</param>
- /// <returns></returns>
- static HBITMAP CommandBitmapQueryFn(const TCHAR* cmdName, const COLORREF& backgroundColor)
- {
- // Обрабатываем только имя своей команды. Остальные пропускаем.
- if (AcString(cmdName).compareNoCase(_T("CommandIcon")) == 0) {
- if (!hBitmap) InitializeBitmap(); // Однократно инициализируем
- return hBitmap;
- }
- return NULL;
- }
- private:
- /// <summary>
- /// Инициализируем HBITMAP из иконки
- /// </summary>
- static void InitializeBitmap()
- {
- HICON hIcon = LoadIcon(_hdllInstance, MAKEINTRESOURCE(IDI_COMMANDICON));
- ICONINFO info; GetIconInfo(hIcon, &info);
- BITMAP bmp; GetObject(info.hbmColor, sizeof(bmp), &bmp);
- hBitmap = (HBITMAP)CopyImage(info.hbmColor, IMAGE_BITMAP, 0, 0, 0);
- }
- BOOL isCmdBitmapQueryReg;
- static HBITMAP hBitmap;
- } ;
- HBITMAP CCommandIconApp::hBitmap = NULL;
- //-----------------------------------------------------------------------------
- IMPLEMENT_ARX_ENTRYPOINT(CCommandIconApp)
- ACED_ARXCOMMAND_ENTRY_AUTO(CCommandIconApp, Rivilis, CommandIcon, CommandIcon, ACRX_CMD_MODAL, NULL)
Полный архив с проектом можно скачать здесь: CommandIcon.zip
Вот так выглядит результат её работы:
Автор: Александр Ривилис
Обсуждение: http://adn-cis.org/forum/index.php?topic=7070
Опубликовано 30.04.2016