Создание элементов
меню плагина в интерфейсе NetView
Плагин может создавать пункты меню в
подменю Plug-ins главного меню, в контекстном
меню списка плагинов и в контекстном меню
иконки в System Tray. Так же можно создавать
пункты меню, являющиеся дочерними для уже
созданных, что позволяет делать
иерархические меню. Плагин должен при
выходе уничтожать пункты меню, в противном
случае они пропадут только при щелчке мышки
на пункте меню несуществующего плагина.
Создание, изменение и удаление пункта меню
осуществляется посредством управляющего
сообщения NMPN_MENU. Параметр wParam может
принимать значения: MENUACTION_SET - создает или
изменяет элемент меню. lParam указывает на
структуру NVMENUINFO.
Назначение полей NVMENUINFO:
 |
DWORD id:
уникальный идентификатор элемента меню
(фактически является указателем на VCL
объект TMenuItem). Для создания нового
элемента меню установите это поле в 0.
Для поседующей модификации элемента
используйте значение, которое запишет в
это поле NetView после завершения обработки
сообщения. |
 |
DWORD msg:
сообщение которое нетвью будет слать
при нажатии юзером пункта меню потоку с
ThreadID равным указанному в поле... |
 |
DWORD tid:
ThreadID потока плагина, обрабатывающего
сообщения о нажатии пункта меню от
нетвью. |
 |
HICON icon -
иконка которая будет рисоваться в меню,
либо 0. |
 |
DWORD
parentid - идентификатор уже созданной
родительской менюшки, либо 0. |
 |
char text[64]
- текст менюшки |
 |
DWORD flags -
NVMENUFLAG_MAIN для создания меню в Plug-ins,
NVMENUFLAG_CONTEXT - для создания пункта в
контекстном меню, NVMENUFLAG_TRAY - меню иконки
в трее. Насчет остальных флагов - см файл
nvplugn.h |
Плигин может динамически создавать и
менять элементы меню, даже тогда когда оно
на экране. Примерный код функций создания,
модификации и удаления созданной менюшки:
 |
Создаем
менюшки:
NVMENUINFO
mi,mic;
void
__fastcall init()
{
//создаем
пункт в главном меню
ZeroMemory(&mi,sizeof(mi));
strcpy(mi.text,"Sample");
mi.tid=GetCurrentThreadId();//поток которому нетвью
будет слать сообщение о нажатии меню
mi.msg=WM_USER+0x501;//это сообщение пошлет нетвью
указанному потоку при выборе меню
mi.flags=NVMENUFLAG_MAIN;
SendMessage(plgi->nvwnd,NMPN_MENU,NVMENUACTION_SET,(DWORD)&mi);
//создаем
подпункт в созданном элементе
ZeroMemory(&miс,sizeof(miс));
strcpy(miс.text,"Sample child menu");
miс.tid=GetCurrentThreadId();
miс.msg=WM_USER+0x502;
mic.parentid=mi.id;
SendMessage(plgi->nvwnd,NMPN_MENU,NVMENUACTION_SET,(DWORD)&mic);
}
|
 |
Обработчик
сообщений нетвью, реагирующий на
нажатие дочернего меню(выкидывающий
MessageBox и включающий-выключающий check-галочку
в менюшке: |
void
__fastcall workmessage(DWORD msg, DWORD wp, DWORD lp)
{
if(msg==WM_USER+0x502)
{
MessageBox(0,"User
clicked my menu item","Sample plug-in",0);
mic.flags^=NVMENUFLAG_CHECKED;
SendMessage(plgi->nvwnd,NMPN_MENU,NVMENUACTION_SET,(DWORD)&mic);
}
}
 |
Следующая
процедура корректно удяляет созданные
менюшки перед завершением работы
плагина: |
void
__fastcall deinit()
{
SendMessage(plgi->nvwnd,NMPN_MENU,NVMENUACTION_DEL,mic.id);
SendMessage(plgi->nvwnd,NMPN_MENU,NVMENUACTION_DEL,mi.id);
}
На верх
|