LoadIcon() ?SetMenuItemBitmaps работает с битмапами. К тому же LoadIcon не грузит RCDATA
SetMenuItemBitmaps работает с битмапами.Ну это как раз не проблема преобразовать HICON в HBITMAP:
К тому же LoadIcon не грузит RCDATAТочно?
Точно?Точно. Во всяком случае у меня )
RCDATA грузится только через LoadResourceНу а если дальше:
чисто ресурсная dll?Да, ресурсы RCDATA для CUIX + 1 BITMAP
Были проблемы с экранным меню, когда в resource.h прописались ID RCDATA -перестали отображаться иконки. Убрал - появились.В RCDATA dll, которая используется с CUIX, прописаны не ID_NUM (целые), а "ID_NUM" (строки). Соответственно в resource.h и писать то нечего.
С контекстным - что то другое...Покажи код, которым ты вообще пытался добавлять контекстное меню.
Дальше создаётся битмап и устанавливается на пункт меню. SetMenuItemBitmaps возвращает TRUE, что означает - иконка успешно назначенаВ какой момент это назначается??? Вполне возможно, что AutoCAD игнорирует твоё назначение.
Только нам не шашечки нужны, а ехать )
Покажи код, которым ты вообще пытался добавлять контекстное меню. Кстати вот пример, как я добавлял иконки в меню истории команд: https://adn-cis.org/dobavlenie-ikonki-k-imeni-komandyi-bez-ispolzovaniya-cuix.html
Sergey_K,
Ты так просто не отделаешься. Из какого метода вызывается ContxtMenu::Load() ?
Для меня очевидно, что ::SetMenuItemBitmaps() нужно вызвать не из метода Load, а тогда, когда меню появляется.
Я бы это делал в getMenuContext. Впрочем и это может не помочь, так как AutoCAD использует переданное ему HMENU для встраивания этого меню в своё меню и тут твои назначения для иконок не срабатывают. Боюсь, что без хука на появление меню тут не обойтись.
Нужно отобразить значки, чего Autocad упорно делать не желаетИ какой размер у тебя значков?
Автокад должен взять моё меню как субменю и вставить в своё, как есть.Он никому и ничего не должен. Ты можешь это хотеть, но это не значит, что в нём это предусмотрено.
В свои меню они иконки пихаютТолько думаю, что не таким образом. Ибо:
Только думаю, что не таким образом. Ибо:Иной способ – это работа мимо API, напрямую с оборудованием. Adsk пользует WinAPI, по этому иного способа у них нет, а его изобретение влечёт за собой приличные накладные расходы.
На всякий случай я задал вопрос в ADN DevHelp. Если будет дополнительная информация - сообщуВряд ли будет что то вразумительное, но тем не менее хотелось бы услышать начхальника механического цеха
Иной способ – это работа мимо API, напрямую с оборудованием.В ObjectARX нет классов/методов для добавления иконок в контекстное меню динамически (это можно сделать через AutoCAD .NET API в CUIX). Поэтому всё остальное - это работа через Windows API.
Данное твоё оценочное суждение ложноО чем речь? Если это наезд на Администратора, то читай Правила форума.
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
The bitmap should be 16*16 size. Otherwise the InsertMenuItem() will failНе проверял, конкретно InsertMenuItem(), но пара вызовов GetMenuItemInfo и SetMenuItemInfo позволяет в контекстное меню установить иконки как 16х16, так и 32х32
Одна неточностьЯ так понимаю, что этому коду уже порядка десятка лет и вполне возможно, что он несколько устарел. Во всяком случае сайта с базой знаний и подобных кодов, на который был доступ только у действительных членов ADN уже лет пять как нет. Часть кодов перенесли на https://adndevblog.typepad.com/autocad/ но что-то при этом забыли...
удивительно, что подобных базовых вещей нет в SDK...Ничего удивительного. Такого рода "базовых" вещей миллионы... Есть запросы от сторонних разработчиков на всякие дополнения/исправления в SDK, есть ограниченные ресурсы у команды разработчиков (AutoCAD DevTeam) и есть расставленные приоритеты.
Если руки не доходят сделать функцию в AcEdUIContext, то могли бы хоть черкнуть пару строк