Иконки в контекстном меню

Автор Тема: Иконки в контекстном меню  (Прочитано 17716 раз)

0 Пользователей и 3 Гостей просматривают эту тему.

Оффлайн Sergey_KАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 114
  • Карма: 2
Re: Иконки в контекстном меню
« Ответ #15 : 21-02-2020, 21:59:11 »
Покажи код, которым ты вообще пытался добавлять контекстное меню. Кстати вот пример, как я добавлял иконки в меню истории команд: https://adn-cis.org/dobavlenie-ikonki-k-imeni-komandyi-bez-ispolzovaniya-cuix.html

Этот пример НИКАКОГО отношения к контекстному меню не имеет.
Извините, вам запрещён просмотр содержимого спойлеров.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Иконки в контекстном меню
« Ответ #16 : 21-02-2020, 22:04:50 »
Sergey_K,
Ты так просто не отделаешься. Из какого метода вызывается ContxtMenu::Load() ?
Для меня очевидно, что ::SetMenuItemBitmaps() нужно вызвать не из метода Load, а тогда, когда меню появляется.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Sergey_KАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 114
  • Карма: 2
Re: Иконки в контекстном меню
« Ответ #17 : 21-02-2020, 22:18:25 »
Sergey_K,
Ты так просто не отделаешься. Из какого метода вызывается ContxtMenu::Load() ?
Для меня очевидно, что ::SetMenuItemBitmaps() нужно вызвать не из метода Load, а тогда, когда меню появляется.

Код приведен для примера. Загрузка происходит после инициализации контекстного меню.
::SetMenuItemBitmaps() может вызываться из ЛЮБОГО метода, после создания CMenu и загрузки его ресурса.Собственно ТОГДА меню и появляется )

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Иконки в контекстном меню
« Ответ #18 : 21-02-2020, 22:31:25 »
Sergey_K,
Думаю что ты не прав. Я бы это делал в getMenuContext. Впрочем и это может не помочь, так как AutoCAD использует переданное ему HMENU для встраивания этого меню в своё меню и тут твои назначения для иконок не срабатывают. Боюсь, что без хука на появление меню тут не обойтись.
P.S.: Ну и на всякий случай глянь этот пример: https://www.codeproject.com/Articles/408251/Bitmap-Menu
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Sergey_KАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 114
  • Карма: 2
Re: Иконки в контекстном меню
« Ответ #19 : 21-02-2020, 22:43:44 »
Я бы это делал в getMenuContext. Впрочем и это может не помочь, так как AutoCAD использует переданное ему HMENU для встраивания этого меню в своё меню и тут твои назначения для иконок не срабатывают. Боюсь, что без хука на появление меню тут не обойтись.

Автокад должен взять моё меню как субменю и вставить в своё, как есть. А что они там намудрили - неведомо.
Насчёт хуков - ни бельмес. Опять гланды через задний проход лечить )

Оффлайн Sergey_KАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 114
  • Карма: 2
Re: Иконки в контекстном меню
« Ответ #20 : 21-02-2020, 22:51:14 »
пример https://www.codeproject.com/Articles/408251/Bitmap-Menu занимается преобразованием icon в bitmap.
Мне всё равно в каком формате вставлять иконки, и  сделать это можно ДО компиляции.
Нужно отобразить значки, чего Autocad упорно делать не желает

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Иконки в контекстном меню
« Ответ #21 : 21-02-2020, 22:52:31 »
Нужно отобразить значки, чего Autocad упорно делать не желает
И какой размер у тебя значков?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Иконки в контекстном меню
« Ответ #22 : 21-02-2020, 22:58:18 »
Автокад должен взять моё меню как субменю и вставить в своё, как есть.
Он никому и ничего не должен. Ты можешь это хотеть, но это не значит, что в нём это предусмотрено.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Sergey_KАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 114
  • Карма: 2
Re: Иконки в контекстном меню
« Ответ #23 : 21-02-2020, 23:06:43 »
значки стандартные 16x16 и 32х32. Он конечно ничего не должен.
Элементарная логика должна присутствовать.
Off-Topic: показать
 А с этим у ваятелей от Автодеска далеко не всегда порядок.
Предусмотрено.
В свои меню они иконки пихают
/* Настоятельно прошу оставить свои оценочные суждения при себе. Александр Ривилис. */
« Последнее редактирование: 22-02-2020, 00:52:22 от Александр Ривилис »

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Иконки в контекстном меню
« Ответ #24 : 22-02-2020, 00:49:51 »
В свои меню они иконки пихают
Только думаю, что не таким образом. Ибо:


Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Иконки в контекстном меню
« Ответ #25 : 22-02-2020, 22:10:03 »
На всякий случай я задал вопрос в ADN DevHelp. Если будет дополнительная информация - сообщу.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Sergey_KАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 114
  • Карма: 2
Re: Иконки в контекстном меню
« Ответ #26 : 23-02-2020, 18:29:03 »
Функционал Windows API искусственно ограничен, по ведомым только adsk обстоятельствам. В основном меню иконки можно назначать, а в контекстном нет. Решения НЕТ. Возможно в этом заложен неведомый нам, глубокий сакральный смысл или просто гранаты не той системы?
Цитата:  
Только думаю, что не таким образом. Ибо:
Иной способ – это работа мимо API, напрямую с оборудованием. Adsk пользует WinAPI, по этому иного способа у них нет, а его изобретение влечёт за собой приличные накладные расходы.
Данное твоё оценочное суждение ложно
Цитата:  
На всякий случай я задал вопрос в ADN DevHelp. Если будет дополнительная информация - сообщу
Вряд ли будет что то вразумительное, но тем не менее хотелось бы услышать начхальника механического цеха

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Иконки в контекстном меню
« Ответ #27 : 23-02-2020, 23:11:21 »
Иной способ – это работа мимо API, напрямую с оборудованием.
В ObjectARX нет классов/методов для добавления иконок в контекстное меню динамически (это можно сделать через AutoCAD .NET API в CUIX). Поэтому всё остальное - это работа через Windows API.
Данное твоё оценочное суждение ложно
О чем речь? Если это наезд на Администратора, то читай Правила форума.

« Последнее редактирование: 24-02-2020, 10:00:14 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Иконки в контекстном меню
« Ответ #28 : 25-02-2020, 16:36:02 »
Ответ от ADN DevHelp:

Цитировать
Dear Alexander Rivilis,

 

I have found the below reply for a similar query to add bitmap to the custom context menu(created with acedAddDefaultContextMenu)

of the ArxDbg tool , from our databases. Below code works for me without any issues.


>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

Please check the following code which adds a new menu item having both an icon and a string to the ArxDbg popup sub menu.

// Please include the GDI+ header and use its namespace.


#include

using namespace Gdiplus;

// Don't forget to like GdiPlus.lib into your project. ArxDbgEdUiContextApp::ArxDbgEdUiContextApp()


ArxDbgEdUiContextApp::ArxDbgEdUiContextApp()

{     

       CAcModuleResourceOverride(ArxDbgApp::getApp()->dllInstance());

 

    m_cMenu = new CMenu;

    BOOL res = m_cMenu->LoadMenu(ARXDBG_MNU_APP);

    VERIFY(res);

    if (!res) {

        delete m_cMenu;

        m_cMenu = NULL;

    }

     

       HBITMAP hbmp = ::LoadBitmap(ArxDbgApp::getApp()->dllInstance(), L"ARXDBG_BMP_REMOVE");

       ASSERT(hbmp != NULL);

       Gdiplus::Bitmap* pBmp = Gdiplus::Bitmap::FromHBITMAP(hbmp, NULL);

       ASSERT(pBmp->GetLastStatus() == Ok);

 

       // Add a "Test" menu item.

       MENUITEMINFO mii = { 0 };

       mii.cbSize = sizeof(mii);

       //MIIM_DATA must be used for bitmaps.

       mii.fMask = MIIM_ID | MIIM_DATA | MIIM_STRING | MIIM_FTYPE;

       mii.wID = 5555;

       //We need to set the type as MFT_OWNERDRAW;

       mii.fType = MFT_OWNERDRAW;

       mii.dwTypeData = TEXT("&Test from Bill Zhang");

       mii.cch = _tcslen(mii.dwTypeData) + 1;

       mii.dwItemData = (ULONG_PTR)pBmp;

       BOOL ret = InsertMenuItem(m_cMenu->GetSubMenu(0)->GetSafeHmenu(),

             5,

             TRUE,

             &mii);

       ASSERT(ret);

     

}


Please note a few points:

We need to use GDI+ bitmap object (Bitmap) instead of GDI or MFC one (CBitmap).

Because of the above, we need to include the GdiPlus header, use its namespace and link with its library.

MIIM_DATA must be combined with other masks in order to use bitmaps.

The fType should be set as MFT_OWNERDRAW.

The cch member of the MENUITEMINFO struct should be the string length.

The dwItemData member of the struct contains the pointer to the GDI+ bitmap.

The bitmap should be 16*16 size. Otherwise the InsertMenuItem() will fail.

Please don't forget to delete the bitmap object (HBITMAP ) when your application exits. You can use DeleteObject() function to do the job.

GdiPlus initialization and uninitialization may be needed if you use GdiPlus functions. The following code can be used for this purpose:


//GdiplusStartupInput gdiplusStartupInput;

//ULONG_PTR gdiplusToken;

//GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

// GDI+ functions call

//......

//

//GdiplusShutdown(gdiplusToken);

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>


 


Hope this helps.

 

Best Regards,

Deepak A S Nadig

Если интересно - тестируй.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Sergey_KАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 114
  • Карма: 2
Re: Иконки в контекстном меню
« Ответ #29 : 27-02-2020, 12:30:23 »
Уже теплее.

Одна неточность
The bitmap should be 16*16 size. Otherwise the InsertMenuItem() will fail
Не проверял, конкретно InsertMenuItem(), но пара вызовов GetMenuItemInfo и SetMenuItemInfo позволяет в контекстное меню установить иконки как 16х16, так и 32х32
Код - C++ [Выбрать]
  1. MENUITEMINFO mii = { 0 };
  2. mii.cbSize = sizeof(mii);
  3. mii.fMask = MIIM_ID | MIIM_DATA | MIIM_STRING | MIIM_FTYPE;
  4. TCHAR buf[MAX_PATH];
  5. mii.dwTypeData = buf;
  6. mii.cch = MAX_PATH;
  7.    
  8. menu->GetSubMenu(0)->GetMenuItemInfo(MENU_ITEM_ID, &mii);
  9. mii.fType |= MFT_OWNERDRAW;
  10.    
  11. GdiPlusBitmapPtr = GetSystemMetrics(SM_CXICON) >= 32 ? gdiPlusBitmapPtr32 : gdiPlusBitmapPtr16;
  12. mii.dwItemData = reinterpret_cast<ULONG_PTR> (GdiPlusBitmapPtr);
  13. menu->SetMenuItemInfo(MENU_ITEM_ID, &mii);
  14.