Page 1 of 3

libkmenu

Posted: Fri Jul 31, 2015 1:08 pm
by Veliant
Библиотека для отображения главного и контекстных меню.

FAQ:
В первую очередь вызываем kmenu_init для задания палитры отображаемого меню.

Далее создаем объект меню используя функцию ksubmenu_new.
При помощи функций kmenuitem_new и ksubmenu_add добавляем пункты меню.
Функция kmenuitem_new понимает три типа элементов:
KMENUITEM_NORMAL - обычный пункт меню, третьим параметром kmenuitem_new примет ID кнопки, который потом пришлет библиотека по клику на этот пункт меню
KMENUITEM_SEPARATOR - рисуется разделитель
KMENUITEM_SUBMENU - пункт меню указывающий на вложенное меню, третьим параметром kmenuitem_new примет указатель на ksubmenu_t*

Для отображения главного меню окна вызываем при отрисовке окна функцию kmainmenu_draw, а также при обработке событий вызываем kmainmenu_dispatch_cursorevent.
Важно: устанавливает фильтрацию позиции курсора

Для отрисовки всплывающих контекстных меню вызываем функцию ksubmenu_draw. Обработка событий производится автономно.

Для изменения состояния пунктов меню можно изменять параметры is_enabled и is_visible объекта kmenuitem_t.
Также можно назначить свою функцию отрисовки элементов меню, изменив указатель paint объекта kmenuitem_t

Re: libkmenu

Posted: Sun Aug 02, 2015 2:48 am
by Leency
Кто может добавить меню в TextEdit?

Re: libkmenu

Posted: Sun Aug 02, 2015 3:26 am
by Pathoswithin
В принципе, я могу, но библиотеки довольно сложно подключаются, пока целостной картины не имею.

Re: libkmenu

Posted: Sun Aug 02, 2015 12:42 pm
by Veliant
Небольшое косметическое изменение - добавлены стрелки для выпадающих подменю.
Исправлено пару багов
menu2.png
menu2.png (2.58 KiB)
Viewed 11708 times

Re: libkmenu

Posted: Sun Aug 02, 2015 1:10 pm
by Leency
Я ждал этого :)

Костя, может ты добавишь строку меню в TextEdit?
По крайней мере базовый вариант, дальше я или Pathoswithin.

Re: libkmenu

Posted: Sun Aug 02, 2015 2:09 pm
by Veliant
Вот первичный задел
Правились t_edit, t_data, t_draw (draw_but_toolbar)
Для выхода из программы по пункту меню, в текущей реализации меню нельзя использовать id=1 (используетсяв внутренних целях для закрытия родительских выпадающих меню), придется назначать новый.
textedit.png
textedit.png (6.51 KiB)
Viewed 11690 times

Re: libkmenu

Posted: Sun Aug 02, 2015 2:52 pm
by Leency
Спасибо! Я продолжу.

Re: libkmenu

Posted: Sun Aug 02, 2015 3:09 pm
by Leency
Есть бага.

Вырираешь: Файл -> Открыть -> Открывается OpenDialog.
При этом пункт меню "Файл" исчезает http://prntscr.com/7zxaaq

Re: libkmenu

Posted: Sun Aug 02, 2015 3:16 pm
by Veliant
Leency wrote:Есть бага.

Вырираешь: Файл -> Открыть -> Открывается OpenDialog.
При этом пункт меню "Файл" исчезает http://prntscr.com/7zxaaq
Мой косяк. На скорую руку делал.

Code: Select all

stdcall [kmainmenu_draw], [main_menu]
надо перенести внутрь draw_window: между mcall 12,1 и mcall 12,2

Да и весь код

Code: Select all

	stdcall [kmenu_init], sc
	
	stdcall [ksubmenu_new]
	mov [main_menu], eax
	
	stdcall [ksubmenu_new]
	mov [main_menu_file], eax
	
	stdcall [kmenuitem_new], KMENUITEM_NORMAL, sz_main_menu_File_New, 3
	stdcall [ksubmenu_add], [main_menu_file], eax
	stdcall [kmenuitem_new], KMENUITEM_NORMAL, sz_main_menu_File_Open, 4
	stdcall [ksubmenu_add], [main_menu_file], eax
	stdcall [kmenuitem_new], KMENUITEM_NORMAL, sz_main_menu_File_Save, 5
	stdcall [ksubmenu_add], [main_menu_file], eax
	stdcall [kmenuitem_new], KMENUITEM_SEPARATOR, 0, 0
	stdcall [ksubmenu_add], [main_menu_file], eax
	stdcall [kmenuitem_new], KMENUITEM_NORMAL, sz_main_menu_File_Exit, 1
	stdcall [ksubmenu_add], [main_menu_file], eax
	
	stdcall [kmenuitem_new], KMENUITEM_SUBMENU, sz_main_menu_File, [main_menu_file]
	stdcall [ksubmenu_add], [main_menu], eax
перенести за комментарий

Code: Select all

;проверка на сколько удачно загузились библиотеки

Posted: Sun Aug 02, 2015 5:16 pm
by punk_joker
Исходники будут?

Re: libkmenu

Posted: Sun Aug 02, 2015 5:43 pm
by Veliant
Сорцы + используемый самописный фреймворк

Re: libkmenu

Posted: Sun Aug 02, 2015 7:14 pm
by Veliant
Исправил утечку памяти при отрисовке

Re: libkmenu

Posted: Mon Aug 03, 2015 8:36 pm
by GerdtR
Вопрос.
Перевожу icon на библиотеку kmenu. Всё отлично, меню появляется. Но одно но. Никак не получается принять инфу о нажатии пункта меню. Не приходит сообщение о нажатии кнопки.
Вот так создал меню:
Spoiler:

Code: Select all

;это в инициализации icon
	mcall	48,3,sc,40
	invoke	kmenu_init,sc
	invoke	ksubmenu_new
	mov	[hMenu],eax
...
	invoke	kmenuitem_new, KMI_NORMAL,RMenuAlign,MII_ALIGN
	invoke	ksubmenu_add,[hMenu],eax

... ; это вызываю при клике правой кнопкой
	invoke	ksubmenu_draw,[hMenu],posRMenu
Приём сообщений 3 разблокирован. Всё как надо, все сообщения приходят. Но не кнопки.
Spoiler:

Code: Select all

	mcall	40,01100100b		 ;нужны только события мыши и IPC и кнопок(меню п.к.м.),
					 ;перерисовка иконок будет в другом потоке
messages:
	mcall	10
	cmp	eax,3
	je	MSGBtn
	cmp	eax,6
	jz	MSGMouse
	cmp	eax,7
	jz	MSGIPC
	jmp	messages
MSGBtn:
	mcall	17
	call	rb_onBtn
	jmp	messages

Re: libkmenu

Posted: Mon Aug 03, 2015 10:26 pm
by Leency
Посмотри реализацию в textEdit, может поможет.
rev 5649

Re: libkmenu

Posted: Tue Aug 04, 2015 12:39 am
by GerdtR
Хм. У меня главное окно - рабочий стол: PID 1, слот 1, размеры окна 0,0. Оно точно будет активизироваться, чтобы получить сообщение? Или может ещё что-то.
И ещё. Нашёл баг. Если кликнуть близко к нижней границе экрана, то пункт выделяется не тот, что под мышью(даже если поводить мышью):
Spoiler:
12344.png
12344.png (64.34 KiB)
Viewed 11531 times