Плагины NetView


Создание элементов меню плагина в интерфейсе 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);
}

 

На верх


© 2001-2004 Killer{R}   © 2003 VoVaN