Я бы рекомендовал переименовать переменные, чтобы иметь смысл. The WinSet
оператор рисует два поля в парах координат x / y, так называя переменные в парах координат x/y и присваивая их до WinSet
утверждение менее запутанной
в этом конкретном примере вы также рисуете границу вокруг внешней стороны окна. Когда за окном, на краю экрана, граница с экрана, поэтому его не будет видно. Если вы хотите нарисовать его на экране, когда граница находится на краю экрана (или даже вне его), вам нужно будет нарисовать границу внутри (или частично внутри) границы окна или нарисовать ее за пределами границы окна.
Это только частичное решение, поскольку в развернутом состоянии, окно еще дальше от экрана, чем просто быть на краю(с). В этом случае необходимо обнаружить развернутое условие и сдвинуть границу еще дальше, чем обычно, на определенное число пикселы.
Я изменил переименовал переменные и изменил ваш код, чтобы привести пример. Вы можете изменить другой "тип границы", чтобы увидеть эффекты... остальное просто математика, если вы хотите сделать это по-другому.
#Persistent
SetTimer, DrawRect, 50
border_thickness = 5
border_color = FF0000
DrawRect:
WinGetPos, x, y, w, h, A
if (x="")
return
Gui, +Lastfound +AlwaysOnTop +Toolwindow
borderType:="inside" ; set to inside, outside, or both
if (borderType="outside") {
outerX:=0
outerY:=0
outerX2:=w+2*border_thickness
outerY2:=h+2*border_thickness
innerX:=border_thickness
innerY:=border_thickness
innerX2:=border_thickness+w
innerY2:=border_thickness+h
newX:=x-border_thickness
newY:=y-border_thickness
newW:=w+2*border_thickness
newH:=h+2*border_thickness
} else if (borderType="inside") {
WinGet, myState, MinMax, A
if (myState=1)
offset:=8
else
offset:=0
outerX:=offset
outerY:=offset
outerX2:=w-offset
outerY2:=h-offset
innerX:=border_thickness+offset
innerY:=border_thickness+offset
innerX2:=w-border_thickness-offset
innerY2:=h-border_thickness-offset
newX:=x
newY:=y
newW:=w
newH:=h
} else if (borderType="both") {
outerX:=0
outerY:=0
outerX2:=w+2*border_thickness
outerY2:=h+2*border_thickness
innerX:=border_thickness*2
innerY:=border_thickness*2
innerX2:=w
innerY2:=h
newX:=x-border_thickness
newY:=y-border_thickness
newW:=w+4*border_thickness
newH:=h+4*border_thickness
}
Gui, Color, FF0000
Gui, -Caption
;WinSet, Region, 0-0 %w%-0 %w%-%h% 0-%h% 0-0 %border_thickness%-%border_thickness% %iw%-%border_thickness% %iw%-%ih% %border_thickness%-%ih% %border_thickness%-%border_thickness%
WinSet, Region, %outerX%-%outerY% %outerX2%-%outerY% %outerX2%-%outerY2% %outerX%-%outerY2% %outerX%-%outerY% %innerX%-%innerY% %innerX2%-%innerY% %innerX2%-%innerY2% %innerX%-%innerY2% %innerX%-%innerY%
;Gui, Show, w%w% h%h% x%x% y%y% NoActivate, Table awaiting Action
Gui, Show, w%newW% h%newH% x%newX% y%newY% NoActivate, Table awaiting Action
return
кроме того, только для информации, есть также способы подключить события обратного вызова windows для событий перемещения окна, так что вам не придется использовать таймер 50мс, который всегда обновляется. В этом случае он будет обновляться только тогда, когда Окно движется, и таймер поставляется с видимые задержки и накладные расходы на обработку. Но таймер-это более простое решение, безусловно, для реализации вне ворот (как вы это уже сделали), и во многих случаях на самом деле не стоит дополнительной сложности, чтобы зацепить события окна, Если вам это не нужно. Просто даю тебе знать, что это возможно.