ADN Open CIS
Сообщество программистов Autodesk в СНГ

30/04/2016

Добавление иконки к имени команды без использования CUIX

Вопрос: как программно добавить иконку для своей команды в контекстное меню, возникающее при наборе команды вручную? Один из способов мне известен – это регистрация команды в cuix-файле, как описано здесь: Adding Icon Next To Custom Command. Хотелось бы добиться такого же результата, но без создания cuix-файла.

Ответ: средствами ObjectARX это возможно. Думаю, что можно и при помощи AutoCAD .NET API, но понадобится активно использовать P/Invoke для большого числа функций из Win32 и ObjectARX. Я покажу здесь как это можно сделать при помощи ObjectARX:

Код - C#: [Выделить]
  1. //-----------------------------------------------------------------------------
  2. //----- acrxEntryPoint.cpp
  3. //-----------------------------------------------------------------------------
  4. #include "StdAfx.h"
  5. #include "resource.h"
  6.  
  7. //-----------------------------------------------------------------------------
  8. #define szRDS _RXST("")
  9.  
  10. //-----------------------------------------------------------------------------
  11. //----- ObjectARX EntryPoint
  12. class CCommandIconApp : public AcRxArxApp {
  13.  
  14. public:
  15.   CCommandIconApp () : AcRxArxApp () { isCmdBitmapQueryReg = FALSE; }
  16.  
  17.   virtual AcRx::AppRetCode On_kInitAppMsg (void *pkt) {
  18.     AcRx::AppRetCode retCode = AcRxArxApp::On_kInitAppMsg (pkt) ;
  19.     // Регистрируем обработчик, возвращающий по имени команды её HBITMAP
  20.     isCmdBitmapQueryReg =
  21.       acedRegisterCommandBitmapQuery(CommandBitmapQueryFn);
  22.     return (retCode) ;
  23.   }
  24.  
  25.   virtual AcRx::AppRetCode On_kUnloadAppMsg (void *pkt) {
  26.     // Удаляем обработчик, возвращающий по имени команды её HBITMAP
  27.     if (isCmdBitmapQueryReg)
  28.       acedRemoveCommandBitmapQuery(CommandBitmapQueryFn);
  29.  
  30.     AcRx::AppRetCode retCode = AcRxArxApp::On_kUnloadAppMsg (pkt) ;
  31.  
  32.     return (retCode) ;
  33.   }
  34.   virtual void RegisterServerComponents () {     }
  35.  
  36.   static void RivilisCommandIcon () {
  37.     acutPrintf(_T("\nКоманда CommandIcon"));
  38.   } 
  39.   /// <summary>
  40.   /// Функция возвращает по имени команды HBITMAP для неё
  41.   /// </summary>
  42.   /// <param name="cmdName">имя команды</param>
  43.   /// <param name="backgroundColor">цвет фона</param>
  44.   /// <returns></returns>
  45.   static HBITMAP CommandBitmapQueryFn(const TCHAR* cmdName, const COLORREF& backgroundColor)
  46.   {
  47.     // Обрабатываем только имя своей команды. Остальные пропускаем.
  48.     if (AcString(cmdName).compareNoCase(_T("CommandIcon")) == 0) {
  49.       if (!hBitmap) InitializeBitmap(); // Однократно инициализируем
  50.       return hBitmap;
  51.     }
  52.     return NULL;
  53.   }
  54.  
  55. private: 
  56.   /// <summary>
  57.   /// Инициализируем HBITMAP из иконки
  58.   /// </summary>
  59.   static void InitializeBitmap()
  60.   {
  61.     HICON hIcon = LoadIcon(_hdllInstance, MAKEINTRESOURCE(IDI_COMMANDICON));
  62.     ICONINFO info; GetIconInfo(hIcon, &info);
  63.     BITMAP bmp;  GetObject(info.hbmColor, sizeof(bmp), &bmp);
  64.     hBitmap = (HBITMAP)CopyImage(info.hbmColor, IMAGE_BITMAP, 0, 0, 0);
  65.   }
  66.   BOOL isCmdBitmapQueryReg;
  67.   static HBITMAP hBitmap;         
  68. } ;
  69.  
  70. HBITMAP CCommandIconApp::hBitmap = NULL;           
  71.  
  72. //-----------------------------------------------------------------------------
  73. IMPLEMENT_ARX_ENTRYPOINT(CCommandIconApp)
  74.  
  75. 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