Тема: AHK: Как сделать разделительную черту в Menu?
Всем привет. Никак не могу найти способ сделать серую, разделительную линию в Menu.
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Всем привет. Никак не могу найти способ сделать серую, разделительную линию в Menu.
В справке это указано.
Vsevolod, легко.
Menu, tray, add, LSPD, LSPD
Menu, tray, add, Перезагрузить, Перезагрузить
Menu, tray, add ; - Это разделительная черта!!!
Menu, tray, add, Выход, Exit
andrey.a.polyakov.b2c
Спасибо большое.
Странная штука, если в меню есть BarBreak:
То фон слева, под иконками, или без них, заполнен указанным цветом, если без BarBreak, то слева выглядит нехорошо:
А зачем его вообще красить? Я б не заморачивался. Или если уж хочется свой дизайн, тогда лучше делать на html + css.
Да зачем это надо, когда есть API?
лучше делать на html + css.
Или что, есть готовый код со всеми нюансами отображения контента, и поведения скрытия окна и тому подобного?
Да зачем это надо, когда есть API?
Если имеешь в виду winapi, то на нём делать свой дизайн UI слишком заморочно, обычно для этого всякие библиотеки используют.
Не-а, готового нет.
Если имеешь в виду winapi, то на нём делать свой дизайн UI слишком заморочно
Можно на ListView, вроде намного проще.
обычно для этого всякие библиотеки используют
Ну да.
Не-а, готового нет.
А про что разговор?
Если ListView подходит, тогда нет проблем.
А про что разговор?
На html-css и с нуля несложно что-то наваять (если, конечно, навык есть). И поведение более тонко настороить.
Странная штука, если в меню есть BarBreak:
То фон слева, под иконками, или без них, заполнен указанным цветом, если без BarBreak, то слева выглядит нехорошо:
Кому интересно решение, для первого пункта надо добавить "+Break", при этом меню становится компактнее по размерам.
О причине lexikos писал тут:
Win32 menus are usually rendered by uxtheme.dll, but not if they use +Break or +BarBreak.
При использовании иконок, размер можно указать штатно.
Если иконок нет, то WM_MEASUREITEM я не понял, как его применить, хукать показ меню, и каждый и раз пересчитывать все пункты?
Кстати старый уже вопрос, про изменить шрифт в меню...
При использовании иконок, размер можно указать штатно.
Хотя, не совсем, расстояние между строками всё равно уменьшенное, в отличии когда без Break.
Кстати старый уже вопрос, про изменить шрифт в меню...
Если оконное меню, то как-то так. С popup-меню вроде не сработает.
serzh82saratov пишет:Кстати старый уже вопрос, про изменить шрифт в меню...
Если оконное меню, то как-то так. С popup-меню вроде не сработает.
Эх, popup только нужно, и мне сложно будет переделать.
С popup пробовал, сообщение WM_DRAWITEM не приходит:
OnMessage(WM_DRAWITEM := 0x2B, "WM_DRAWITEM")
Menu, MyMenu, Add, Item1, Handler
Menu, MyMenu, Add, Item2, Handler
VarSetCapacity(MENUITEMINFO, size := 16 + A_PtrSize * 8, 0)
NumPut(size, MENUITEMINFO)
NumPut(MIIM_TYPE := 0x10, MENUITEMINFO, 4)
NumPut(MFT_OWNERDRAW := 0x100, MENUITEMINFO, 8)
DllCall("SetMenuItemInfo", "Ptr", MenuGetHandle("MyMenu"), "UInt", 0, "UInt", true, "Ptr", &MENUITEMINFO)
Menu, MyMenu, Show
Handler(item) {
MsgBox, % item
}
WM_DRAWITEM(wp, lp, msg, hwnd) {
SoundBeep
}
Через сабклассинг SetWindowLongPtr() тоже не работает.
Owner-Drawn Menus and the WM_DRAWITEM Message
Whenever the item must be drawn (for example, when it is first displayed or when the user selects it), the system sends the WM_DRAWITEM message to the window procedure of the menu's owner window.
У popup меню нет owner window, по крайней мере в процессе AHK.
На ahk есть попап библиотека:
https://www.autohotkey.com/board/topic/ … opup-menu/
Ага, интересно, посмотрел, как устроено. Там как раз создаётся owner GUI для меню.
На ahk есть попап библиотека:
https://www.autohotkey.com/board/topic/ … opup-menu/
А там ссылка на скачивание у всех рабочая? Я на гитхабе искал.
Ага, интересно, посмотрел, как устроено. Там как раз создаётся owner GUI для меню.
В код с #18 надо что то добавить?
создаётся owner GUI
Это мы с тобой кстати делали.
OnMessage(WM_DRAWITEM := 0x2B, "WM_DRAWITEM")
Menu, MyMenu, Add, Item1, Handler
Menu, MyMenu, Add, Item2, Handler
VarSetCapacity(MENUITEMINFO, size := 16 + A_PtrSize * 8, 0)
NumPut(size, MENUITEMINFO)
NumPut(MIIM_TYPE := 0x10, MENUITEMINFO, 4)
NumPut(MFT_OWNERDRAW := 0x100, MENUITEMINFO, 8)
DllCall("SetMenuItemInfo", "Ptr", MenuGetHandle("MyMenu"), "UInt", 0, "UInt", true, "Ptr", &MENUITEMINFO)
hMenu := MenuGetHandle("MyMenu")
PID := DllCall("GetCurrentProcessId")
WS_CLIPCHILDREN := 0x2000000
WS_POPUP := 0x80000000
WS_CHILD := 0x40000000
Gui, New
Gui, +%WS_CHILD% -%WS_POPUP%
Gui, +HwndhGuiMenu -Caption
TPM_NONOTIFY := 0x0080
TPM_RIGHTBUTTON := 0x0002
flags := TPM_RIGHTBUTTON|TPM_NONOTIFY|0x0004
; 1::
WinSet, Style, +%WS_CLIPCHILDREN%
DllCall("SetParent", "Ptr", hGuiMenu, "Ptr", WinExist("A"))
CoordMode, Mouse
MouseGetPos, mX, mY
DllCall("TrackPopupMenuEx", "ptr", hMenu, "uint", flags, "int", mx, "int", my, "ptr", hGuiMenu, "ptr", 0)
Return
Handler(item) {
MsgBox, % item
}
WM_DRAWITEM(wp, lp, msg, hwnd) {
ToolTip WM_DRAWITEM
}
Это мы с тобой кстати делали.
Да? У меня не сохранилось. Но тут что-то лишнее, проще:
OnMessage(WM_DRAWITEM := 0x2B, "WM_DRAWITEM")
Menu, MyMenu, Add, Item1, Handler
Menu, MyMenu, Add, Item2, Handler
VarSetCapacity(MENUITEMINFO, size := 16 + A_PtrSize * 8, 0)
NumPut(size, MENUITEMINFO)
NumPut(MIIM_TYPE := 0x10, MENUITEMINFO, 4)
NumPut(MFT_OWNERDRAW := 0x100, MENUITEMINFO, 8)
hMenu := MenuGetHandle("MyMenu")
DllCall("SetMenuItemInfo", "Ptr", hMenu, "UInt", 0, "UInt", true, "Ptr", &MENUITEMINFO)
Gui, +HwndhGuiMenu
CoordMode, Mouse
MouseGetPos, mX, mY
DllCall("TrackPopupMenuEx", "ptr", hMenu, "uint", TPM_NONOTIFY := 0x0080, "int", mX, "int", mY, "ptr", hGuiMenu, "ptr", 0)
Return
Handler(item) {
MsgBox, % item
}
WM_DRAWITEM(wp, lp, msg, hwnd) {
ToolTip WM_DRAWITEM
}
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться