Тема: AHK: Как нарисовать рамку вокруг окна ?
Типа так:
в справке по канве ничё не нашёл, как быть ?
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Типа так:
в справке по канве ничё не нашёл, как быть ?
Поищи по форуму по слову "рамка".
Поищи по форуму по слову "рамка".
спасиб, сразу нашёл : DDDD
Активное окно моргает красным
Подскажите где ошибка
#Persistent
#SingleInstance Force
#WinActivateForce
TH = 2 ; толщина рамки
Col = Red
SetWinDelay, 0
Gui, +LastFound +ToolWindow -Caption +AlwaysOnTop +Disabled
SetTimer, Frame, 50
Return
;~ ------------------------------------------------------------------------------------------------
Frame:
{
;~ WinGet, ID
WinGet, active_id, ID, A
WinGetPos, X, Y, W, H, A
SetFrame(active_id, Col, X, Y, W, H)
}
;~ ------------------------------------------------------------------------------------------------
SetFrame(active_id, Col, X, Y, W, H)
{
Gui, Color, %Col%
if (X = XPrev && Y = YPrev && W = WPrev && H = HPrev)
Return
XPrev := X
YPrev := Y
WPrev := W
HPrev := H
X -= TH
Y -= TH
W += 2*TH
H += 2*TH
Gui, Show, x%X% y%Y% w%W% h%H% Hide
Options := "0-0 " W "-0 " W "-" H " 0-" H " 0-0 " TH "-" TH
. " " W-TH "-" TH " " W-TH "-" H-TH " " TH "-" H-TH " " TH "-" TH
DetectHiddenWindows, On
WinSet, Region, % Options, ahk_id %active_id%
Gui, Show, NA
;~ Return
}
?
((((
А каким оно должно моргать? Вот же вы пишете
Col = Red
SetFrame(active_id, Col, X, Y, W, H)
{
Gui, Color, %Col%
Перед завершением секции автовыполнения сделайте вызов подпрограммы таймера:
GoSub Frame
Ну и по "мелочи":
- XPrev и прочие переменные для запоминания предыдущих координат не сохраняют свои значения между вызовами, если они не Static;
- Переменная TH внутри процедуры SetFrame() не определена, если она туда не передается в кач-ве параметра, или если она не определена как глобальная;
- Непонятно назначение передаваемой в процедуру SetFrame() переменной active_id - в ней WinSet применяется к созданному GUI, а не к активному окну, так что active_id не нужен. Если нужно "оконтурить" окно, отличное от активного, то передаваемых в процедуру SetFrame() координат достаточно для этого.
#Persistent
#SingleInstance Force
#WinActivateForce
Col = Red
TH := 2
SetWinDelay, 0
SetTimer, Frame, 50
Gui, +LastFound +ToolWindow -Caption +AlwaysOnTop +Disabled
GoSub Frame
Return
;~ ------------------------------------------------------------------------------------------------
Frame:
WinGet, active_id, ID, A
WinGetPos, X, Y, W, H, A
SetFrame(Col, X, Y, W, H, TH)
Return
;~ ------------------------------------------------------------------------------------------------
SetFrame(Col, X, Y, W, H, TH)
{
Gui, Color, %Col%
static XPrev,YPrev,WPrev,HPrev
if X && !(X = XPrev && Y = YPrev && W = WPrev && H = HPrev)
{
XPrev := X, YPrev := Y, WPrev := W, HPrev := H
X -= TH, Y -= TH, W += 2*TH, H += 2*TH
Gui, Show, x%X% y%Y% w%W% h%H% Hide
Options := "0-0 " W "-0 " W "-" H " 0-" H " 0-0 " TH "-" TH
. " " W-TH "-" TH " " W-TH "-" H-TH " " TH "-" H-TH " " TH "-" TH
WinSet, Region, % Options
Gui, Show, NA
}
Return
}
А каким оно должно моргать? Вот же вы пишете
Col = Red SetFrame(active_id, Col, X, Y, W, H) { Gui, Color, %Col%
должна рисоваться рамка (вы читали заголовок этой темы ?), а не окно моргать
+ Примерно так#Persistent #SingleInstance Force #WinActivateForce Col = Red TH := 2 SetWinDelay, 0 SetTimer, Frame, 50 Gui, +LastFound +ToolWindow -Caption +AlwaysOnTop +Disabled GoSub Frame Return ;~ ------------------------------------------------------------------------------------------------ Frame: WinGet, active_id, ID, A WinGetPos, X, Y, W, H, A SetFrame(Col, X, Y, W, H, TH) Return ;~ ------------------------------------------------------------------------------------------------ SetFrame(Col, X, Y, W, H, TH) { Gui, Color, %Col% static XPrev,YPrev,WPrev,HPrev if X && !(X = XPrev && Y = YPrev && W = WPrev && H = HPrev) { XPrev := X, YPrev := Y, WPrev := W, HPrev := H X -= TH, Y -= TH, W += 2*TH, H += 2*TH Gui, Show, x%X% y%Y% w%W% h%H% Hide Options := "0-0 " W "-0 " W "-" H " 0-" H " 0-0 " TH "-" TH . " " W-TH "-" TH " " W-TH "-" H-TH " " TH "-" H-TH " " TH "-" TH WinSet, Region, % Options Gui, Show, NA } Return }
а почему рисуется не полная рамка ?
Перенеси строку Gui, +LastFound... в подпрограмму таймера:
Frame:
WinGet, active_id, ID, A
WinGetPos, X, Y, W, H, A
Gui, +LastFound +ToolWindow -Caption +AlwaysOnTop +Disabled
SetFrame(Col, X, Y, W, H, TH)
Return
#Persistent
#SingleInstance Force
#WinActivateForce
ColorFrame = Red
TH := 4
SetWinDelay, 0
SetTimer, Frame, 50
;GoSub Frame
Return
;~ ------------------------------------------------------------------------------------------------
Frame:
WinGet, active_id, ID, A
WinGetTitle, this_title, ahk_id %active_id%
WinGetPos, X, Y, W, H, Калькулятор
if (this_title = "Калькулятор")
SetFrame(ColorFrame, X, Y, W, H, TH)
else
Gui, Hide
Return
;~ ------------------------------------------------------------------------------------------------
SetFrame(Col, X, Y, W, H, TH)
{
static XPrev,YPrev,WPrev,HPrev
if (X = XPrev && Y = YPrev && W = WPrev && H = HPrev)
Return
Gui, +LastFound +ToolWindow -Caption +AlwaysOnTop +Disabled
Gui, Color, %Col%
XPrev := X
YPrev := Y
WPrev := W
HPrev := H
X -= TH
Y -= TH
W += 2*TH
H += 2*TH
Gui, Show, x%X% y%Y% w%W% h%H% Hide
Options := "0-0 " W "-0 " W "-" H " 0-" H " 0-0 " TH "-" TH
. " " W-TH "-" TH " " W-TH "-" H-TH " " TH "-" H-TH " " TH "-" TH
WinSet, Region, % Options
Gui, Show, NA
Return
}
активирую Калькулятор - рамка рисуется
активирую любое другое окно - рамка прячется
опять активирую Калькулятор - рамка НЕ рисуется, пока я его не сдвину
как сделать, чтобы рамка рисовалась всегда, когда я активирую калькулятор и при этом не моргала ?
как сделать, чтобы рамка рисовалась всегда, когда я активирую калькулятор
Global ColorFrame := "Red", TH := 4, WPrev
SetWinDelay, 0
SetTimer, Frame, 50
;GoSub Frame
Return
;~ ------------------------------------------------------------------------------------------------
Frame:
WinGet, active_id, ID, A
WinGetTitle, this_title, ahk_id %active_id%
WinGetPos, X, Y, W, H, Калькулятор
if (this_title = "Калькулятор")
SetFrame(ColorFrame, X, Y, W, H, TH)
else
{
Gui, Hide
WPrev := ""
}
Return
SetFrame(Col, X, Y, W, H, TH)
{
static XPrev,YPrev,HPrev
if (X = XPrev && Y = YPrev && W = WPrev && H = HPrev)
Return
Gui, +LastFound +ToolWindow -Caption +AlwaysOnTop +Disabled
Gui, Color, %Col%
XPrev := X
YPrev := Y
WPrev := W
HPrev := H
X -= TH
Y -= TH
W += 2*TH
H += 2*TH
Gui, Show, x%X% y%Y% w%W% h%H% Hide
Options := "0-0 " W "-0 " W "-" H " 0-" H " 0-0 " TH "-" TH
. " " W-TH "-" TH " " W-TH "-" H-TH " " TH "-" H-TH " " TH "-" TH
WinSet, Region, % Options
Gui, Show, NA
Return
}
serzh82saratov, странная тенденция у AHK программистов - мыслить локально
Notepad++
Калькулятор - это тестовое окно, и к реальным и.т.п. окнам не имеет отношения
serzh82saratov, странная тенденция у AHK программистов - мыслить локально
Ну простите.
За всех AHK программистов я не скажу.
Видимо ваш образ мышления, мне не понять.
Думаю у вас все шансы, с вашим словесным оборотом, постичь все тайны.
Тут уж, без вариантов.
Был не прав, прошу, искреннего прощения.
serzh82saratov, извинения приняты, исправляйтесь ))))
давай без обид )))
Давайте немного другой рассмотрим вопрос
Есть код, который рисует рамку
#Persistent
#SingleInstance Force
#WinActivateForce
ColorFrame = Red
TH := 4
SetWinDelay, 0
SetTimer, Frame, 50
;~ GoSub Frame
Return
;~ ------------------------------------------------------------------------------------------------
Frame:
WinGet, active_id, ID, A
WinGetTitle, this_title, ahk_id %active_id%
WinGetPos, X, Y, W, H, Калькулятор
if (this_title = "Калькулятор")
SetFrame(ColorFrame, X, Y, W, H, TH)
Return
;~ ------------------------------------------------------------------------------------------------
SetFrame(Col, X, Y, W, H, TH)
{
static XPrev,YPrev,WPrev,HPrev
if (X = XPrev && Y = YPrev && W = WPrev && H = HPrev)
Return
Gui, +LastFound +ToolWindow -Caption +AlwaysOnTop +Disabled
Gui, Color, %Col%
XPrev := X
YPrev := Y
WPrev := W
HPrev := H
X -= TH
Y -= TH
W += 2*TH
H += 2*TH
Gui, Show, x%X% y%Y% w%W% h%H% Hide
Options := "0-0 " W "-0 " W "-" H " 0-" H " 0-0 " TH "-" TH
. " " W-TH "-" TH " " W-TH "-" H-TH " " TH "-" H-TH " " TH "-" TH
WinSet, Region, % Options
Gui, Show, NA
Return
}
какой нужно добавить/изменить код в SetFrame, чтобы рамка всегда вставала cпереди нужного (окон будет несколько)
только нужного окна, а не поверх всех
у Gui есть тока AlwaysOnTop
WinSet не понятно как ставить на нужную z-посл.
Вот код:
ColorFrame := "Red"
TH := 7
global WPrev
TimerFrame:
{
SetTimer, TimerFrame, Off
WinGet, active_id, ID, A
if CheckWin(active_id)
{
WinGetPos, X, Y, W, H, ahk_id %active_id%
SetFrame(ColorFrame, X, Y, W, H, TH)
}
else
{
Gui, Hide
WPrev := ""
}
SetTimer, TimerFrame, On
}
SetFrame(Col, X, Y, W, H, TH)
{
static XPrev, YPrev, HPrev
if (X = XPrev && Y = YPrev && W = WPrev && H = HPrev)
Return
Gui, +LastFound +ToolWindow -Caption +AlwaysOnTop +Disabled
Gui, Color, %Col%
XPrev := X
YPrev := Y
WPrev := W
HPrev := H
Gui, Show, x%X% y%Y% w%W% h%H% Hide
Options := "0-0 " W "-0 " W "-" H " 0-" H " 0-0 " TH "-" TH
. " " W-TH "-" TH " " W-TH "-" H-TH " " TH "-" H-TH " " TH "-" TH
WinSet, Region, % Options
Gui, Show, NA
}
Выпадает иногда такая ошибка:
В чём дело ?
Вероятно, переменные X Y W H пустые.
Вероятно, переменные X Y W H пустые.
а как корректнее сделать проверку ?
если так
if (X = 0 or Y = 0 or W = 0 or H = 0 )
Return
но, x и y могут быть = 0
или надо так ?
if (X = or Y = or W = or H = )
Return
Можно так:
If (X = "") or (Y = "") or (W = "") or (H = "")
спасиб ))
ColorFrame := "Red"
TH := 7
global WPrev
TimerFrame:
{
SetTimer, TimerFrame, Off
WinGet, active_id, ID, A
if CheckWin(active_id)
{
WinGetPos, X, Y, W, H, ahk_id %active_id%
SetFrame(ColorFrame, X, Y, W, H, TH)
}
else
{
Gui, Hide
WPrev := ""
}
SetTimer, TimerFrame, On
}
SetFrame(Col, X, Y, W, H, TH)
{
static XPrev, YPrev, HPrev
if (X = XPrev && Y = YPrev && W = WPrev && H = HPrev)
Return
Gui, +LastFound +ToolWindow -Caption +AlwaysOnTop +Disabled
Gui, Color, %Col%
XPrev := X
YPrev := Y
WPrev := W
HPrev := H
Gui, Show, x%X% y%Y% w%W% h%H% Hide
Options := "0-0 " W "-0 " W "-" H " 0-" H " 0-0 " TH "-" TH
. " " W-TH "-" TH " " W-TH "-" H-TH " " TH "-" H-TH " " TH "-" TH
WinSet, Region, % Options
Gui, Show, NA
}
объясните какой смысл тут в
static XPrev, YPrev, HPrev
иначе эти переменные как-то попадают под глобал ?
чё-то непонятно
Смысл такой же, как всегда - сохранять значения переменных между вызовами функции. Непонятна из данного кода обособленность переменной WPrev - по-моему, ее так же можно объявить внутри функции SetFrame как static
Непонятна из данного кода обособленность переменной WPrev - по-моему, ее так же можно объявить внутри функции SetFrame как static
забил в статик и рамка не прорисовывается ))
У меня отображается рамка.
В примере поста #17 нет функции CheckWin(active_id) , вместо нее для проверки поставил "заглушку"
CheckWin(active_id)
{
Return 1
}
У меня отображается рамка.
+ открыть спойлерВ примере поста #17 нет функции CheckWin(active_id) , вместо нее для проверки поставил "заглушку"
CheckWin(active_id) { Return 1 }
если переключиться на другое окно, и обратно, то рамка не будет рисоваться, без глобала никак
1) иногда окно полностью закрашивается цветом (ColorFrame := "Red")
подскажите из за чего может быть и как этого избежать ?
2) не могу понять смысл этой строчки
Gui, Show, x%X% y%Y% w%W% h%H% Hide
Gui скрывается тока в этих параметрах?, а почему сразу его не скрыть
хотя при коде: Gui, Hide, ничё не работает
3) SetWinDelay, 0
куда запихать ?
в SetFrame ?
up
SetFrame(Col, TH, X, Y, W, H)
{
static XPrev, YPrev, HPrev
global
if (Col = "") or (TH = "") or (X = "") or (Y = "") or (W = "") or (H = "")
Return
if (X = XPrev) and (Y = YPrev) and (W = WPrev) and (H = HPrev)
Return
Gui, +LastFound +ToolWindow -Caption +AlwaysOnTop +Disabled
Gui, Color, %Col%
....................................
}
при сравнении переменных
if (Col = "")
тут разве не идёт присваивание ?
чё-то не догоняю
Нет, для присваивания нужно :=
Нет, для присваивания нужно :=
как же тогда понимать этот код ?
MyKey = F9
MyKey::
WinGet, active_id, ID, A
CoordMode, Mouse, Client
Click %x%, %y%
Return
Обрати внимание на магическое слово if в приведенном двумя постами выше примере, возможно это подтолкнет твою мысль в нужном направлении.
if a=b
и
a=b - разные конструкции, сравнения и присваивания соответственно,
хоть и применяется в них одинаковый символ "="
Иногда окно может стань невидимым типа так:
надо как-то рефрешить окно или хз как
т.е. не юзать Gui, Show, x%X% y%Y% w%W% h%H% Hide
подскажите как быть ?
подскажите как нарисовать альтернативно рамку без сокрытия области по середине ?
Gui, Show, x%X% y%Y% w%W% h%H% Hide
или надо создать 4 GUI или 4 компонента, и сделать в виде полосок и закрасить ?
Очередная покерная примочка в работе )
подскажите как нарисовать альтернативно рамку без сокрытия области по середине ?
Так вопрос же решён:
SetBatchLines -1
D := 9
Gui, +AlwaysOnTop +HWNDhGui -Caption +Toolwindow +E0x08000000 -DPIScale
Gui, Color, Red
Loop {
WinGetPos, X, Y, W, H, A
If X =
Continue
Region := 0 "-" 0 " " W "-" 0 " " W "-" H " " 0 "-" H " " 0 "-" 0 " "
. D "-" D " " W - D "-" D " " W - D "-" H - D " " D "-" H - D " " D "-" D
WinSet, Region, % Region, ahk_id %hGui%
Gui Show, NA x%X% y%Y% w%W% h%H%
}
serzh82saratov на Win 7 работает, а на Win XP ошибка
Убрал
-DPIScale
и стало норм.
Это не критично?
-DPIScale
Да это ладно, мне вот интересно в чём заключался вопрос.
сделал так:
Gui, +AlwaysOnTop +HWNDhGui -Caption +Toolwindow +Disabled +LastFound
Пока без глюков.
serzh82saratov, Спасиб за помощь.
Ekklesiast, ознакомьтесь с этой темой, отредактируйте свои посты. Надеюсь, больше замечаний делать не придётся.
поправил
Ekklesiast забанен на три дня за нарушение Правил форума.
Ekklesiast забанен на три дня за нарушение Правил форума.
Что именно я нарушил ?
Предложение начинается с большой буквы, кончается точкой. Что непонятного?
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться