1 (изменено: bubblegum, 2025-07-14 17:09:54)

Тема: AHK v2: Gui- навигация по Up::/Down:: и динамическое изменение шрифта

Здравствуйте всем.
Пытаюсь сделать простой gui на ahk v2, где по клику на текст (назовем его "пункт меню") будет выполняться какое-нибудь действие. Также нужно сделать навигацию по этим пунктам меню с помощью клавиш Up:: и Down::, а также выполнять действие на этом пункте по нажатию Enter:: или NumpadEnter::. При переходе на пункт меню, его текст gui должен изменить цвет и размер шрифта - увеличить, а затем вернуть свои первоначальные настройки в случае выбора другого пункта. Не знаю, как все это написать, чтобы было понятно. Вот мой скрипт, который пытаюсь сделать. Может задумка станет немного понятнее.
Заранее благодарю за помощь.


#Requires AutoHotkey v2.0+

global txt1, txt2, txt3

mainGui := Gui(, "GUI title")
mainGui.OnEvent("close",closeGui)
mainGui.OnEvent("escape",closeGui)
mainGui.SetFont("s12")
Loop 3 {
	index := A_Index
	txt%index% := mainGui.Add("Text", "xp yp30 w300 h30 center", "Это ж Бубль Гум!")
	txt%index%.OnEvent("Click", Point%index%)
}
mainGui.Show("w400 h400")

Up::
Down::
Point1(txtCtrl, *){
	txtCtrl.Text := "Бубль Гум 1"
	SetFontOpt()
return
}

Point2(txtCtrl, *){
	txtCtrl.Text := "Бубль Гум 2"
	SetFontOpt()
return
}

Point3(txtCtrl, *){
	txtCtrl.Text := "Бубль Гум 3"
	SetFontOpt()
return
}

SetFontOpt(){
	txt%index%.SetFont("s20 cRed", "")
	Sleep(333)
	txt%index%.SetFont("s12 cBlue", "")
return
}

closeGui(*){
    ExitApp()
}

2

Re: AHK v2: Gui- навигация по Up::/Down:: и динамическое изменение шрифта

Попробуйте так:

#Requires AutoHotkey v2

wnd := Gui()
wnd.OnEvent('Close' , (*) => ExitApp())
wnd.OnEvent('Escape', (*) => ExitApp())
wnd.SetFont('s12')
wnd.txts := []
wnd.selIdx := 0
Loop 3 {
    txt := wnd.Add('Text', 'xm yp+30 w300 h30 center', 'Бубль гум!')
    txt.OnEvent('Click', Select.Bind(A_Index))
    wnd.txts.Push(txt)
}
wnd.Show('w400 h400')

Select(idx, txt, *) {
    for ctrl in wnd.txts {
        ctrl.SetFont('s12 cDefault')
    }
    wnd.selIdx := idx
    txt.Text := 'Бубль гум ' . idx
    txt.SetFont('s20 cRed')
    Sleep(333)
    txt.SetFont('s12 cBlue')
}

MoveSel(step) {
    total := wnd.txts.Length
    if !wnd.selIdx && step = -1 {
        wnd.selIdx := total + 1
    }
    wnd.selIdx := Mod(wnd.selIdx - 1 + step + total, total) + 1
    Select(wnd.selIdx, wnd.txts[wnd.selIdx])
}

#HotIf WinActive(wnd)
Up::   MoveSel(-1)
Down:: MoveSel( 1)

Enter:: {
    if !wnd.selIdx
        return
    MsgBox 'Индекс: ' . wnd.selIdx '`nТекст: ' . wnd.txts[wnd.selIdx].Text
}
#HotIf
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3 (изменено: bubblegum, 2025-07-14 23:05:55)

Re: AHK v2: Gui- навигация по Up::/Down:: и динамическое изменение шрифта

teadrinker, большое спасибо за помощь! Замечательно, теперь многое стало понятно, но это не совсем то, как я задумывал... я плохо умею объяснять, мои извинения.
Попробую так: у меня есть аналогичный шаблон gui для ahk v1, может так будет лучше объяснить. Хотелось бы нечто такое же для ahk v2:


#NoEnv
#SingleInstance force
SetBatchLines -1
SendMode Input

TotalPoints := 3
ActPoint := 1

FontSize := 16
FontSize_Act := FontSize+3
FontSize_Ent := FontSize-3
TxtPos := FontSize_Act*2

Gui Color, 000000
Gui Font, % "cYellow s" FontSize " Bold", Segoe Script
Gui Add, Text, % "w400 h30 x0 y40 Center vMenuPoint1 gPoint1", Point 1
Gui Add, Text, % "w400 h30 yp+" TxtPos " Center vMenuPoint2 gPoint2", Point 2
Gui Add, Text, % "w400 h30 yp+" TxtPos " Center vMenuPoint3 gPoint3", Выход
SetFont("cGreen s" FontSize_Act, "MenuPoint" ActPoint)
Gui Show, w400 h200, Test
Return

Point1:
Point2:
Point3:

If (!PressEnt){
	SetFont("cYellow s" FontSize, "MenuPoint" ActPoint)
	ActPoint := SubStr(A_GuiControl, 0)
	SetFont("cGreen s" FontSize_Act, "MenuPoint" ActPoint)
	}
	
PressEnt := ""
SetFont("cRed s" FontSize_Ent, "MenuPoint" ActPoint)
Sleep 333
SetFont("cGreen s" FontSize_Act, "MenuPoint" ActPoint)

If (A_ThisLabel = "Point1"){
	GoSub Action1
	}
Else If (A_ThisLabel = "Point2"){
	GoSub Action2
	}
Else If (A_ThisLabel = "Point3"){
	GoSub ExitProg
	}
	
#IfWinActive Test
Up::
Down::
	SetFont("cYellow s" FontSize, "MenuPoint" ActPoint)
	ActPoint += (A_ThisHotkey = "Up" ? -1 : 1)
	ActPoint := (ActPoint > TotalPoints ? 1 : ActPoint = 0 ? TotalPoints : ActPoint)
	SetFont("cGreen s" FontSize_Act, "MenuPoint" ActPoint)
Return

Enter::
NumpadEnter::
	PressEnt := 1
	GoTo % "Point" ActPoint
Return

SetFont(Options, Control){
	Gui Font, % Options
	GuiControl Font, % Control
	}
	
Action1:
	MsgBox Первый
Return

Action2:
	MsgBox Второй
Return

ExitProg:
Gui Destroy
ExitApp

4

Re: AHK v2: Gui- навигация по Up::/Down:: и динамическое изменение шрифта

А в чём принципиальная разница? В исходном коде первый элемент не выделен, так просто выделите его сразу, и вместо wnd.selIdx := 0 напишите wnd.selIdx := 1.

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

5

Re: AHK v2: Gui- навигация по Up::/Down:: и динамическое изменение шрифта

teadrinker, не в этом дело. Попробуйте запустить скрипт для v1 и все будет видно. Я не знаю, как все это объяснить.

6

Re: AHK v2: Gui- навигация по Up::/Down:: и динамическое изменение шрифта

Наверно, такое имели в виду:

#Requires AutoHotkey v2

wnd := Gui()
wnd.OnEvent('Close' , (*) => ExitApp())
wnd.OnEvent('Escape', (*) => ExitApp())
wnd.SetFont('s12')
wnd.txts := []
wnd.selIdx := 1
Loop 3 {
    txt := wnd.Add('Text', 'xm yp+30 w300 h30 center', 'Бубль гум' . (A_Index == 1 ? ' 1' : '!'))
    txt.OnEvent('Click', Select.Bind(A_Index, 1))
    wnd.txts.Push(txt)
}
wnd.txts[1].SetFont('s12 cBlue')
wnd.Show('w400 h400')

Select(idx, doAction, txt, *) {
    for ctrl in wnd.txts {
        ctrl.SetFont('s12 cDefault')
        ctrl.Text := 'Бубль гум!'
    }
    wnd.selIdx := idx
    txt.Text := 'Бубль гум ' . idx
    if doAction {
        txt.SetFont('s20 cRed')
        SetTimer Action.Bind(idx, txt), -333
        Sleep(333)
    }
    txt.SetFont('s12 cBlue')
}

MoveSel(step) {
    total := wnd.txts.Length
    wnd.selIdx := Mod(wnd.selIdx - 1 + step + total, total) + 1
    Select(wnd.selIdx, 0, wnd.txts[wnd.selIdx])
}

Action(idx, ctrl) {
    MsgBox 'Индекс: ' . idx '`nТекст: ' . ctrl.Text
}

#HotIf WinActive(wnd)
Up::   MoveSel(-1)
Down:: MoveSel( 1)

Enter:: Select(wnd.selIdx, 1, wnd.txts[wnd.selIdx])
#HotIf
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

7 (изменено: bubblegum, 2025-07-15 00:08:59)

Re: AHK v2: Gui- навигация по Up::/Down:: и динамическое изменение шрифта

teadrinker, все именно так! Большущее спасибо за помощь! Теперь пойду разбираться в коде