Texto Centralizado em uma GUI Topic is solved

Tire suas dúvidas sobre programação em AutoHotkey

Moderator: Gio

User avatar
juanmuscaria
Posts: 65
Joined: 29 Oct 2017, 10:53
Location: Brazil
Contact:

Texto Centralizado em uma GUI

21 Jan 2018, 18:38

Boa Noite.


Gostaria de saber alguma forma de fazer um texto ficar centralizado em uma GUI("Ao invés de expandir para frente ele expande para os lados fazendo ficar no mesmo eixo").
Creio que isso possa ser resolvido usando aqueles códigos de style, porem eu não sei usar eles.

Aqui uma explicação rápida do que quero fazer:
Quando um texto na minha GUI muda,ele expandir para os lados e ainda ficar centralizado.

Obrigado pela sua atenção.
garry
Posts: 3739
Joined: 22 Dec 2013, 12:50

Re: Texto Centralizado em uma GUI  Topic is solved

22 Jan 2018, 05:18

Gui menu-icon ,text , button example

Code: Select all

;- Gui with menu and center text

#warn
#NoEnv
setworkingdir,%a_scriptdir%
Gui,2:default
Gui,2:  -DPIScale
Gui,2:Font,Cdefault,Fixedsys
Gui,2:Color,Black
Gui,2:Color,ControlColor, Black
t:=""
;-------------------------------------------------
Menu,S1,add,calc               ,MH1a
Menu,S1,add,charmap            ,MH1a
menu,myMenuBar,Add,Programs     ,:S1

Menu, MyMenuBar, Add, Notepad  , Label1
Menu, MyMenuBar, Icon,Notepad  , Notepad.exe,0,20  ;- 20 is size , maybe 16
gui,2:menu,MyMenuBar ,
;-------------------------------------------------
Gui,2:add,Text,    x0    y10  w500             cGray  center vT1    ,Test ...    ;- same width as GUI
Gui,2:add,button,x10 y40 h25 w140 gA1,Alterar-texto
Gui,2:show,x10 y10 w500 h100, Test
gosub,textchange
return

2Guiclose:
exitapp

a1:
T:= !T
if t
 GuiControl,2: Text,T1,Toggle=Este é um exemplo de texto longo
else
 GuiControl,2: Text,T1,Toggle=Texto curto
return

TextChange:
sleep,1000
GuiControl,2: Text,T1,Este é um exemplo de texto longo
sleep,1000
GuiControl,2: Text,T1,Texto curto
sleep,1000
GuiControl,2: Text,T1,Pressione o botão várias vezes: 'alterar texto'
return

Label1:
run,notepad
return

mh1a:
gui,2:submit,nohide
if A_thisMenuItem=calc
   run,calc
if A_thisMenuItem=charmap
   run,charmap
return
Last edited by garry on 22 Jan 2018, 15:37, edited 1 time in total.
User avatar
Gio
Posts: 1247
Joined: 30 Sep 2013, 10:54
Location: Brazil

Re: Texto Centralizado em uma GUI

22 Jan 2018, 09:44

A solução do garry está correta, mas tem uma coisa que eu gostaria de apontar também. Quando estamos criando GUIs a ordem de criação dos controles é a mesma ordem de "desenho" dos mesmos e as dimensões desses controles (como w, que é a largura) podem fazer com que uns sejam desenhados em cima dos outros. Então, no código abaixo, embora usando a opção de largura w500 (500 é a mesma largula da janela criada) juntamente com a opção center eu tenha conseguido centralizar o controle, eu na verdade tenho que considerar agora que para todos os efeitos tem um controle de texto que foi desenhado em toda a largura da janela (mesmo que não apareça porque a mensagem é pequena).

No código abaixo dá pra ver isso claramente. O primeiro controle de texto não vai aparecer porque o segundo está desenhado em cima dele (e ocupa toda a extensão da largura da janela). O terceiro aparece mesmo estando dentro da extensão do segundo controle porque foi desenhado após ele (logo, foi desenhado em cima dele).

Code: Select all

gui add, text, x300 y50, isso aqui não vai aparecer
gui add, text, center x0 w500 y50, texto centralizado
gui add, text, x400 y50, mas isso vai
Gui, show, w500 h200
Com efeito, se eu tirar a primeira linha e colocar logo após a terceira (mas antes do show, claro), o controle de texto aparece também. E como a área dos dois últimos entra em conflito, o último é desenhado em cima do segundo.

Code: Select all

gui add, text, center x0 w500 y50, texto centralizado
gui add, text, x400 y50, mas isso vai
gui add, text, x300 y50, isso aqui não vai aparecer
Gui, show, w500 h200
E tem mais um efeito disso também. Os controles têm área de ativação, então se você clicar na área entre o segundo e o terceiro, fica difícil dizer qual vai ativar.

Por isso, w500 center tem que ser usado com cautela. E nisto vale destacar que existem algumas opções para você centralizar o controle sem precisar usar essas duas opções. Uma delas é calcular a posição do controle e escrever a posição x adequada. Nisso pode até usar o w também. O objetivo é não terminar com um w gigantesco. Eu costumo fazer isso assim:

1 - coloco um w que apareça toda a mensagem, mas que seja o menor possível
2 - calculo o x de acordo com a seguinte expressão: (largura da tela - w) / 2

Então se eu tiver uma tela de 500 de largura total e eu precisar de um w de 100 para escrever um texto inteiro (fui testando e aumentando até encontrar o w que caubesse todo o texto), eu simpleesmente calculo a posição central usando a fórmula acima: (500 - 100) / 2, que dá 200, daí findo escrevendo simplesmente assim:

Code: Select all

gui add, text, center x200 w100 y50, texto centralizado
Gui, show, w500 h200
Dessa forma eu posso escrever controles do lado do texto centralizado e também tenho uma certeza sobre qual controle vai ser ativado quando o usuário clicar em qualquer posição.

Para ver melhor a diferença entre as duas opções, basta fazer aparecer a cor de fundo dos controles:

Code: Select all

Gui, color, red
gui add, text, center -background x165 w170 y50, texto centralizado com cálculo
gui add, text, center -background x0 w500 center y150, texto centralizado com w500 center
Gui, show, w500 h200
User avatar
juanmuscaria
Posts: 65
Joined: 29 Oct 2017, 10:53
Location: Brazil
Contact:

Re: Texto Centralizado em uma GUI

22 Jan 2018, 13:00

Essa opção também é valida.porem tive problema com ela pois tem que fazer varias variáveis para ela funcionar com o meu LoadLang.

Agora tava tentando faze um texto centralizado que mude depois de um tempo,só que ao invés de muda o texto ele cria outro por cima.
Aqui o script (Coloquei comentários sobre o texto que apareceria no loadlang):

Code: Select all

Gui,New,AlwaysOnTop -Caption ToolWindow,MainWin
Gui,Add, Picture,x0 y0 w800 h400, %A_WorkingDir%\Files\Img\Logo.png
Gui,font, s40 q4
lang := LoadLang("launcher","LOGO2")
Gui,Add,Text,+BackgroundTrans Center vT1 x0 y300 w800,%Lang% ;Iniciando
Gui,show, w800 h400,Logo

sleep 400
lang := LoadLang("launcher","LOGO3")
GuiControl,Text,T1,%lang%;Procurando por atualizações
Update()  ;ignore isso
Gui, Destroy
Acho que o problema é eu não estar usando corretamente o GuiControl,Text,T1,%lang%

E sobre o que você falo sobre área de ativação:
Eu já fiz testes de coloca 2 controles um em cima do outro,Então já estou ciente desse problema.

Obrigado pela atenção.
User avatar
Gio
Posts: 1247
Joined: 30 Sep 2013, 10:54
Location: Brazil

Re: Texto Centralizado em uma GUI

22 Jan 2018, 13:28

O código abaixo funcionou aqui no meu computador. Muda o texto de "iniciando" para "Procurando por atualizações" depois de 3 segundos.

Code: Select all

Gui,New,AlwaysOnTop -Caption ToolWindow,MainWin
Gui,Add, Picture,x0 y0 w800 h400, %A_WorkingDir%\Files\Img\Logo.png
Gui,font, s40 q4
Gui,Add,Text,+BackgroundTrans Center vT1 x0 y300 w800, Iniciando
Gui,show, w800 h400,Logo

sleep 3000
GuiControl,,T1, Procurando por atualizações
garry
Posts: 3739
Joined: 22 Dec 2013, 12:50

Re: Texto Centralizado em uma GUI

22 Jan 2018, 15:35

@Gio
... e ocupa toda a extensão da largura da janela

Code: Select all

gui add, text, center x0 w500 y50, texto centralizado
Gui, show, w500 h200
desculpe , obrigado , eu esqueço
User avatar
juanmuscaria
Posts: 65
Joined: 29 Oct 2017, 10:53
Location: Brazil
Contact:

Re: Texto Centralizado em uma GUI

23 Jan 2018, 11:42

Boa Tarde.
Gio wrote:O código abaixo funcionou aqui no meu computador. Muda o texto de "iniciando" para "Procurando por atualizações" depois de 3 segundos.

Code: Select all

Gui,New,AlwaysOnTop -Caption ToolWindow,MainWin
Gui,Add, Picture,x0 y0 w800 h400, %A_WorkingDir%\Files\Img\Logo.png
Gui,font, s40 q4
Gui,Add,Text,+BackgroundTrans Center vT1 x0 y300 w800, Iniciando
Gui,show, w800 h400,Logo

sleep 3000
GuiControl,,T1, Procurando por atualizações
Gio,eu usei esses script que você fez e continuo com o mesmo problema.

Aqui uma foto de como fica:
Image

Obs: Quando inicio pela primeira vez ele fica normal,depois de 1 vez ele fica assim bugado e só volta ao normal quando reinicio o windows.
Meu windows:10 empresarial
Versão do AHK:1.1.26.01
User avatar
Gio
Posts: 1247
Joined: 30 Sep 2013, 10:54
Location: Brazil

Re: Texto Centralizado em uma GUI

23 Jan 2018, 12:11

Hmm...
Se você rodar somente o código sugerido acima em um novo script, isso também acontece?

Se não, precisamos ver o restante do código para encontrar o que está de fato afetando ele.
Se sim, vamos ter que estudar outra solução, pois o código funcionou aqui. Uma opção nesse caso é usar o ControlSetText no lugar do GuiControl e ver se o problem é resolvido.

Também vejo que a sua tela tem uma espécie de textura que cobre todo o fundo (esses riscos verticais). Pode ser que seja isso também. As janelas podem ter problemas quando colocamos elas para desenhar controles em cima de controles (tipo, texto em cima de imagem). Se for esse o caso, teremos que estudar outra solução também. Mas não se preocupe, as vezes as solução pode estar em simplesmente pedir que a Gui redesenhe os controles em questão (tipo, redesenhar a imagem e depois redesenhar o texto alterado). Isso pode ser feito com duas chamadas ao comando GuiControl, MoveDraw.
User avatar
juanmuscaria
Posts: 65
Joined: 29 Oct 2017, 10:53
Location: Brazil
Contact:

Re: Texto Centralizado em uma GUI

23 Jan 2018, 12:26

Gio wrote:Hmm...
Se você rodar somente o código sugerido acima em um novo script, isso também acontece?

Se não, precisamos ver o restante do código para encontrar o que está de fato afetando ele.
Se sim, vamos ter que estudar outra solução, pois o código funcionou aqui. Uma opção nesse caso é usar o ControlSetText no lugar do GuiControl e ver se o problem é resolvido.

Também vejo que a sua tela tem uma espécie de textura que cobre todo o fundo (esses riscos verticais). Pode ser que seja isso também. As janelas podem ter problemas quando colocamos elas para desenhar controles em cima de controles (tipo, texto em cima de imagem). Se for esse o caso, teremos que estudar outra solução também. Mas não se preocupe, as vezes as solução pode estar em simplesmente pedir que a Gui redesenhe os controles em questão (tipo, redesenhar a imagem e depois redesenhar o texto alterado). Isso pode ser feito com duas chamadas ao comando GuiControl, MoveDraw.
Bem,rodando o script sozinho funciona normalmente,vou mandar o pacote com meu programa (O script principal é o GamesToolbox.ahk).
Games Toolbox.zip
Aqui o app
(1.24 MiB) Downloaded 106 times
Agora fiquei na duvida pois a unica coisa que roda antes desse script são algumas directives e o import .
User avatar
juanmuscaria
Posts: 65
Joined: 29 Oct 2017, 10:53
Location: Brazil
Contact:

Re: Texto Centralizado em uma GUI

23 Jan 2018, 12:33

Ok,Coloquei um Sleep 100 antes da função Update e resolveu o problema e fico assim o código:

Code: Select all

Gui,New,AlwaysOnTop -Caption ToolWindow,MainWin
Gui,Add, Picture,x0 y0 w800 h400, %A_WorkingDir%\Files\Img\Logo.png
Gui,font, s40 q4
Gui,Add,Text,+BackgroundTrans Center vT1 x0 y300 w800, Iniciando
Gui,show, w800 h400,Logo

sleep 3000
GuiControl,,T1, Procurando por atualizações
sleep 100 ;Esse é o sleep que coloquei
Update() 
Realmente o GuiControl bugo por conta dessa função.
De qualquer forma obrigado ela ajuda :thumbup:

Return to “Ajuda e Suporte Geral”

Who is online

Users browsing this forum: No registered users and 21 guests