Orion9

|
Posted: Fri Jul 17, 2026 13:15 Post subject: |
|
|
| sa wrote: | | начать с большего индекса, а закончить меньшим |
Это можно сделать через функции Min и Max. Вроде работает.
| sa wrote: | | Если оба раза указана одна кнопка, то её и удалять |
А зачем? Одну кнопку можно удалить и так.
Вообще, функция HBarBreakErase задумывалась для удаления между разделителями, одну кнопку она удалить не может, поэтому пришлось ввести это ограничение при выборе диапазона, т.к. если указать один и тот же индекс, то удалятся все кнопки за этим индексом, как при
| Code: | text &= 'MENUITEM "Индекс удаления 1", em_aucmd -1 HBarBreakErase ' & 2 & ' ' & 2 & auCRLF |
где передается диапазон 2-2. Поэтому для удаления одной кнопки придется делать дополнительную функцию.
Но можно ведь и не делать. Одну кнопку можно удалить простым дропом за панель, поэтому пока оставил как было, т.е. нельзя задать диапазон равный одной кнопке.
| sa wrote: | | Сейчас, например, при указании диапазона 67-68, удаляется только 67. |
Исправил. Там просто +1 нужно было добавить к параметру.
| sa wrote: | | Ну и сам интерфейс удаления сейчас такой, как будто пользователь сам помогает скрипту удалять кнопки (почти как с установкой разрывов), а не наоборот. |
Да нормальный интерфейс, мне даже нравится Конечно, было бы лучше, если бы первая кнопка как-то отмечалась, чтобы не держать ее в уме, но и так, вроде бы, удобно: навёл на кнопку, получил подсказку, убедился, что это нужный индекс, нажал следом Alt+ПКЛ для выбора диапазона, и всё.
В справке к Autohotkey есть пример на DllCall для закрашивания области экрана.
 Hidden text | Code: | Rect := Buffer(16) ; Set capacity to hold four 4-byte integers.
NumPut( "Int", 0 ; left
, "Int", 0 ; top
, "Int", A_ScreenWidth//2 ; right
, "Int", A_ScreenHeight//2 ; bottom
, Rect)
hDC := DllCall("GetDC", "Ptr", 0, "Ptr") ; Pass zero to get the desktop's device context.
hBrush := DllCall("CreateSolidBrush", "UInt", 0x0000FF, "Ptr") ; Create a red brush (0x0000FF is in BGR format).
DllCall("FillRect", "Ptr", hDC, "Ptr", Rect, "Ptr", hBrush) ; Fill the specified rectangle using the brush above.
DllCall("ReleaseDC", "Ptr", 0, "Ptr", hDC) ; Clean-up.
DllCall("DeleteObject", "Ptr", hBrush) ; Clean-up. |
Я перевел его в Autorun с небольшой особенностью и добавил к функции.
 Hidden text | Code: | Global gHBarMark1 = 0, gHBarMark2 = 0
Func HBarMarkToDelete()
Local InfoMsg, sMenu
If gHBarLoadError Or gHBarList.Count = 0 Then
InfoMsg = "Панель не загружена"
ElseIf FileGetTime(gHBarFile) <> gHBarFileTs Then
InfoMsg = "Файл панели изменился"
Endif
If InfoMsg <> "" Then
ShowDragHint(InfoMsg)
Return
Endif
HBarCreateColor()
If Not gHBarMark1 Then
gHBarMark1 = HBarGetIdx()
If gHBarMark1 < 1 Then
gHBarMark1 = 0
Return
EndIf
IniRead sMenu %gHBarFile% "Buttonbar" %'"menu" & gHBarMark1' "<>"
MsgBox("Индекс: " & gHBarMark1 & auCRLF & sMenu & auCRLF & auCRLF & _
"Задать начало диапазона?", "Autorun", 3+64+0)
If EXTENDED <> 6 Then gHBarMark1 = 0
Return
Endif
If Not gHBarMark2 Then
gHBarMark2 = HBarGetIdx()
If gHBarMark2 = gHBarMark1 Then
gHBarMark2 = 0
Return
EndIf
IniRead sMenu %gHBarFile% "Buttonbar" %'"menu" & gHBarMark2' "<>"
MsgBox("Индекс: " & gHBarMark2 & auCRLF & sMenu & auCRLF & auCRLF & _
"Задать конец диапазона?", "Autorun", 3+64+0)
If EXTENDED <> 6 Then
gHBarMark2 = 0
Return
EndIf
Endif
Local nHBarMark1 = Min(gHBarMark1, gHBarMark2)
Local nHBarMark2 = Max(gHBarMark1, gHBarMark2)
MsgBox("Диапазон: " & nHBarMark1 & "-"& nHBarMark2 & auCRLF & auCRLF & _
"Удалить группу кнопок?", "Autorun", 3+64+0)
If EXTENDED <> 6 Then
ShowDragHint("Диапазон сброшен")
Else
# удаление
HBarBreakErase(nHBarMark1, nHBarMark2+1)
EndIf
gHBarMark1 = 0
gHBarMark2 = 0
EndFunc
Func HBarCreateColor()
MouseGetPos("x","y")
Local buf = Buffer(16) # RECT
buf.Zero()
buf.SetNum(0, "Int", x-5, _
"Int", y-5, _
"Int", x+5, _
"Int", y+5)
Local hDC = DllCall("GetDC", "ptr", 0, "ptr")
#Local hDC = DllCall("GetWindowDC", "ptr", hBarWnd, "ptr")
Local hBrush = DllCall("CreateSolidBrush", "UInt", 0x0000FF, "Ptr")
DllCall("FillRect", "Ptr", hDC, "Ptr", buf.ptr, "Ptr", hBrush)
DllCall("DeleteObject", "Ptr", hBrush)
DllCall("ReleaseDC", "Ptr", 0, "Ptr", hDC)
Free(buf)
Sleep(100)
EndFunc |
Сейчас намного лучше стало. Если бы маркер держался на экране, то было бы еще лучше, но заморачиваться не хочется. Ведь размер панели может измениться в любой момент, а это значит, что придется пересчитывать координаты маркера. Как по мне, оно не стоит того. И сейчас вполне удобно
| sa wrote: | | В идеале хотелось, чтобы была одна операция, а не две, не связанные друг с другом. |
Надо подумать над этим. Но вы попробуйте обновленный вариант: он удобен по-своему, к нему просто привыкнуть надо. |
|