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 (2.58 KiB)
Viewed 11960 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 (6.51 KiB)
Viewed 11942 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 (64.34 KiB)
Viewed 11783 times