Board.KolibriOS.org
http://board.kolibrios.org/

libkmenu
http://board.kolibrios.org/viewtopic.php?f=24&t=3097
Page 1 of 3

Author:  Veliant [ Fri Jul 31, 2015 1:08 pm ]
Post subject:  libkmenu

Библиотека для отображения главного и контекстных меню.

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

Attachments:
menu.png
menu.png [ 5.13 KiB | Viewed 4300 times ]
libkmenu.zip [10.11 KiB]
Downloaded 165 times

Author:  Leency [ Sun Aug 02, 2015 2:48 am ]
Post subject:  Re: libkmenu

Кто может добавить меню в TextEdit?

Author:  Pathoswithin [ Sun Aug 02, 2015 3:26 am ]
Post subject:  Re: libkmenu

В принципе, я могу, но библиотеки довольно сложно подключаются, пока целостной картины не имею.

Author:  Veliant [ Sun Aug 02, 2015 12:42 pm ]
Post subject:  Re: libkmenu

Небольшое косметическое изменение - добавлены стрелки для выпадающих подменю.
Исправлено пару багов
Attachment:
menu2.png
menu2.png [ 2.58 KiB | Viewed 4204 times ]


Attachments:
libkmenu.zip [11.18 KiB]
Downloaded 163 times

Author:  Leency [ Sun Aug 02, 2015 1:10 pm ]
Post subject:  Re: libkmenu

Я ждал этого :)

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

Author:  Veliant [ Sun Aug 02, 2015 2:09 pm ]
Post subject:  Re: libkmenu

Вот первичный задел
Правились t_edit, t_data, t_draw (draw_but_toolbar)
Для выхода из программы по пункту меню, в текущей реализации меню нельзя использовать id=1 (используетсяв внутренних целях для закрытия родительских выпадающих меню), придется назначать новый.
Attachment:
textedit.png
textedit.png [ 6.51 KiB | Viewed 4186 times ]


Attachments:
t_edit.zip [290.66 KiB]
Downloaded 128 times

Author:  Leency [ Sun Aug 02, 2015 2:52 pm ]
Post subject:  Re: libkmenu

Спасибо! Я продолжу.

Author:  Leency [ Sun Aug 02, 2015 3:09 pm ]
Post subject:  Re: libkmenu

Есть бага.

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

Author:  Veliant [ Sun Aug 02, 2015 3:16 pm ]
Post subject:  Re: libkmenu

Leency wrote:
Есть бага.

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


Мой косяк. На скорую руку делал.
Code:
stdcall [kmainmenu_draw], [main_menu]

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

Да и весь код
Code:
   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:
;проверка на сколько удачно загузились библиотеки

Author:  punk_joker [ Sun Aug 02, 2015 5:16 pm ]
Post subject: 

Исходники будут?

Author:  Veliant [ Sun Aug 02, 2015 5:43 pm ]
Post subject:  Re: libkmenu

Сорцы + используемый самописный фреймворк

Attachments:
menu_src.zip [71.36 KiB]
Downloaded 205 times

Author:  Veliant [ Sun Aug 02, 2015 7:14 pm ]
Post subject:  Re: libkmenu

Исправил утечку памяти при отрисовке

Attachments:
kmenu.obj [23.97 KiB]
Downloaded 138 times

Author:  GerdtR [ Mon Aug 03, 2015 8:36 pm ]
Post subject:  Re: libkmenu

Вопрос.
Перевожу icon на библиотеку kmenu. Всё отлично, меню появляется. Но одно но. Никак не получается принять инфу о нажатии пункта меню. Не приходит сообщение о нажатии кнопки.
Вот так создал меню:
Spoiler: Show
Code:
;это в инициализации 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: Show
Code:
   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

Author:  Leency [ Mon Aug 03, 2015 10:26 pm ]
Post subject:  Re: libkmenu

Посмотри реализацию в textEdit, может поможет.
rev 5649

Author:  GerdtR [ Tue Aug 04, 2015 12:39 am ]
Post subject:  Re: libkmenu

Хм. У меня главное окно - рабочий стол: PID 1, слот 1, размеры окна 0,0. Оно точно будет активизироваться, чтобы получить сообщение? Или может ещё что-то.
И ещё. Нашёл баг. Если кликнуть близко к нижней границе экрана, то пункт выделяется не тот, что под мышью(даже если поводить мышью):
Spoiler: Show
Attachment:
12344.png
12344.png [ 64.34 KiB | Viewed 4027 times ]

Page 1 of 3 All times are UTC+03:00
Powered by phpBB® Forum Software © phpBB Limited
https://www.phpbb.com/