Page 1 of 1

Библиотеки на С--

Posted: Wed May 20, 2020 5:34 pm
by Leency
Няшное меню /SYS/DEVELOP/MENU
lmenu.png
lmenu.png (5.05 KiB)
Viewed 107000 times
Для запуска делаем функцию:

Code: Select all

#define MENU_ALIGN_TOP_LEFT  0
#define MENU_ALIGN_TOP_RIGHT 1
#define MENU_ALIGN_BOT_LEFT  2
#define MENU_ALIGN_BOT_RIGHT 3

:dword shared_mem = NULL;
:char shared_name[] = "LMENU";
void open_lmenu(dword _x, _y, _position, _selected, _text1)
{
	if (!shared_mem) {
		shared_mem = memopen(#shared_name, 16, SHM_CREATE + SHM_WRITE);
		if (EDX) shared_mem = memopen(#shared_name, 16, SHM_WRITE);
	}
	ESDWORD[shared_mem     ] = _selected;
	ESDWORD[shared_mem +  4] = _x;
	ESDWORD[shared_mem +  8] = _y;
	ESDWORD[shared_mem + 12] = _position;
	menu_process_id = RunProgram("/sys/develop/menu", _text1);
}
Вызываем так

Code: Select all

open_lmenu(Form.left+mouse.x+5, Form.top+mouse.y+skin_height, MENU_ALIGN_TOP_RIGHT, 1, "Пункт1\nПункт2");
либо так

Code: Select all

open_lmenu(Form.left + mouse.x+4, Form.top + skin_height + mouse.y,MENU_ALIGN_TOP_LEFT, NULL, #folder_actions);

char folder_actions[]=
"Open        |Enter 
-
Copy         |Crl+C
Cut          |Crl+X
Paste        |Crl+V
-
Delete       |Del
Properties   |F8";
Получаем нажатый пункт меню

Code: Select all

:dword get_menu_click()
{
	if (menu_process_id) && (GetProcessSlot(menu_process_id)) {
		return NULL;
	} else {
		menu_process_id = NULL;
		EAX = ESDWORD[shared_mem];
		ESDWORD[shared_mem] = 0;
		return EAX;		
	}
}
Если есть идеи по улучшению кода/подхода - пишите.