1 (изменено: Vsevolod, 2022-01-10 22:14:55)

Тема: AHK: Как сделать разделительную черту в Menu?

Всем привет. Никак не могу найти способ сделать серую, разделительную линию в Menu.

Post's attachments

Снимок экрана (89).png
Снимок экрана (89).png 3.8 kb, 2 downloads since 2022-01-10 

You don't have the permssions to download the attachments of this post.

2

Re: AHK: Как сделать разделительную черту в Menu?

В справке это указано.

Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

3

Re: AHK: Как сделать разделительную черту в Menu?

Vsevolod, легко.

Menu, tray, add, LSPD, LSPD
Menu, tray, add, Перезагрузить, Перезагрузить
Menu, tray, add  ; - Это разделительная черта!!!    
Menu, tray, add, Выход, Exit

4

Re: AHK: Как сделать разделительную черту в Menu?

andrey.a.polyakov.b2c
Спасибо большое.

5

Re: AHK: Как сделать разделительную черту в Menu?

Странная штука, если в меню есть BarBreak:

https://i.imgur.com/jurA8l6.png

То фон слева, под иконками, или без них, заполнен указанным цветом, если без BarBreak, то слева выглядит нехорошо:

https://i.imgur.com/3OVWgBA.png

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

6

Re: AHK: Как сделать разделительную черту в Menu?

А зачем его вообще красить? Я б не заморачивался. Или если уж хочется свой дизайн, тогда лучше делать на html + css.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

7

Re: AHK: Как сделать разделительную черту в Menu?

Да зачем это надо, когда есть API?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

8 (изменено: serzh82saratov, 2023-06-25 21:16:40)

Re: AHK: Как сделать разделительную черту в Menu?

teadrinker пишет:

лучше делать на html + css.

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

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

9

Re: AHK: Как сделать разделительную черту в Menu?

serzh82saratov пишет:

Да зачем это надо, когда есть API?

Если имеешь в виду winapi, то на нём делать свой дизайн UI слишком заморочно, обычно для этого всякие библиотеки используют.
Не-а, готового нет.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

10

Re: AHK: Как сделать разделительную черту в Menu?

teadrinker пишет:

Если имеешь в виду winapi, то на нём делать свой дизайн UI слишком заморочно

Можно на ListView, вроде намного проще.

teadrinker пишет:

обычно для этого всякие библиотеки используют

Ну да.

teadrinker пишет:

Не-а, готового нет.

А про что разговор?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

11

Re: AHK: Как сделать разделительную черту в Menu?

Если ListView подходит, тогда нет проблем.

serzh82saratov пишет:

А про что разговор?

На html-css и с нуля несложно что-то наваять (если, конечно, навык есть). И поведение более тонко настороить.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

12

Re: AHK: Как сделать разделительную черту в Menu?

serzh82saratov пишет:

Странная штука, если в меню есть BarBreak:

https://i.imgur.com/jurA8l6.png

То фон слева, под иконками, или без них, заполнен указанным цветом, если без BarBreak, то слева выглядит нехорошо:

https://i.imgur.com/3OVWgBA.png

Кому интересно решение, для первого пункта надо добавить "+Break", при этом меню становится компактнее по размерам.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

13

Re: AHK: Как сделать разделительную черту в Menu?

О причине lexikos писал тут:

Win32 menus are usually rendered by uxtheme.dll, but not if they use +Break or +BarBreak.

https://www.autohotkey.com/boards/viewtopic.php?t=73447

14 (изменено: serzh82saratov, 2023-06-26 15:58:37)

Re: AHK: Как сделать разделительную черту в Menu?

При использовании иконок, размер можно указать штатно.
Если иконок нет, то WM_MEASUREITEM я не понял, как его применить, хукать показ меню, и каждый и раз пересчитывать все пункты?
Кстати старый уже вопрос, про изменить шрифт в меню...

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

15

Re: AHK: Как сделать разделительную черту в Menu?

serzh82saratov пишет:

При использовании иконок, размер можно указать штатно.

Хотя, не совсем, расстояние между строками всё равно уменьшенное, в отличии когда без Break.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

16

Re: AHK: Как сделать разделительную черту в Menu?

serzh82saratov пишет:

Кстати старый уже вопрос, про изменить шрифт в меню...

Если оконное меню, то как-то так. С popup-меню вроде не сработает.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

17

Re: AHK: Как сделать разделительную черту в Menu?

teadrinker пишет:
serzh82saratov пишет:

Кстати старый уже вопрос, про изменить шрифт в меню...

Если оконное меню, то как-то так. С popup-меню вроде не сработает.

Эх, popup только нужно, и мне сложно будет переделать.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

18

Re: AHK: Как сделать разделительную черту в Menu?

С 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-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

19

Re: AHK: Как сделать разделительную черту в Menu?

На ahk есть попап библиотека:
https://www.autohotkey.com/board/topic/ … opup-menu/

20

Re: AHK: Как сделать разделительную черту в Menu?

Ага, интересно, посмотрел, как устроено. Там как раз создаётся owner GUI для меню.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

21

Re: AHK: Как сделать разделительную черту в Menu?

Malcev пишет:

На ahk есть попап библиотека:
https://www.autohotkey.com/board/topic/ … opup-menu/

А там ссылка на скачивание у всех рабочая? Я на гитхабе искал.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

22

Re: AHK: Как сделать разделительную черту в Menu?

teadrinker пишет:

Ага, интересно, посмотрел, как устроено. Там как раз создаётся owner GUI для меню.

В код с #18 надо что то добавить?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

23

Re: AHK: Как сделать разделительную черту в Menu?

teadrinker пишет:

создаётся 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
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

24

Re: AHK: Как сделать разделительную черту в Menu?

serzh82saratov пишет:

Это мы с тобой кстати делали.

Да? У меня не сохранилось. Но тут что-то лишнее, проще:

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
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder