Eu recomendaria renomear as variáveis para fazer sentido. A instrução WinSet
desenha duas caixas em pares de coordenadas x / y, portanto, nomear as variáveis em pares de coordenadas x / y e atribuí-las antes da instrução WinSet
é menos confuso
Neste exemplo específico, você também está desenhando a borda ao redor da parte externa da janela. Quando a parte externa da janela está na borda da tela, a borda está fora da tela, por isso não será visível. Se você quiser desenhá-lo na tela quando a borda estiver na borda da tela (ou mesmo dela), será necessário desenhar a borda interna (ou parcialmente interna) no limite da janela vs. desenhá-la fora do limite da janela .
Isso é apenas uma solução parcial, porque, em um estado maximizado, a janela fica ainda mais longe da tela do que apenas estar na (s) borda (s). Nesse caso, você precisa detectar uma condição maximizada e compensar a borda ainda mais do que seria normalmente por um determinado número de pixels.
Eu ajustei o nome para as variáveis e ajustei seu código para dar um exemplo. Você pode alterar o 'tipo de borda' diferente para ver os efeitos ... o resto é apenas matemática se você quiser desenhar de forma diferente.
#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
Além disso, apenas para informações, também há maneiras de ligar os eventos de retorno de chamada do Windows para eventos de movimentação de janelas, para que você não precise usar um cronômetro de 50ms que esteja sempre atualizando. Nesse caso, ele só será atualizado quando a janela se mover e o cronômetro chegar com atraso visível e sobrecarga de processamento. Mas o temporizador é de longe a solução mais fácil de implementar do lado de fora (como você já fez), e em muitos casos não vale a complexidade extra para ligar os eventos da janela se você não precisa. Só permitindo que você saiba que isso é possível.