CreativeJopa Posted March 26, 2012 at 08:09 PM Report #445772 Posted March 26, 2012 at 08:09 PM Boas. Alguém me pode explicar como ter uma textbox em que, quando o texto é maior que o tamanho da textbox, o texto é encurtado e adicionado com reticencias? Tentei fazê-lo com o seguinte exemplo, em que calculo o tamanho da string em pixeis e comparo-o ao tamanho da textbox, mas não o acho prático, além de que, se desejar redimensionar a textbox, teria que voltar a fazer este calculo. tamanho_artigo = System.Drawing.Graphics.FromHwnd(myHwnd).MeasureString(new_usercontrol_item_vista_mosaico.textblock_genero.Text, New System.Drawing.Font("Segoe UI", 12, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point)) If tamanho_artigo.Width.ToString > 150 Then For i = 0 To new_usercontrol_item_vista_mosaico.textblock_genero.Text.Length - 1 texto_encurtado = texto_encurtado & new_usercontrol_item_vista_mosaico.textblock_genero.Text(i) tamanho_artigo = System.Drawing.Graphics.FromHwnd(myHwnd).MeasureString(texto_encurtado, New System.Drawing.Font("Segoe UI", 12)) If tamanho_artigo.Width.ToString >= 145 Then If Val(new_usercontrol_item_vista_mosaico.textblock_genero.Text.Length) - Val(texto_encurtado.Length) > 3 Then new_usercontrol_item_vista_mosaico.textblock_genero.Text = (texto_encurtado & ("...")) Exit For End If End If Next End If O que pretendo saber, é se existe um método que seja mais prático. Cumprimentos.
ribeiro55 Posted March 28, 2012 at 01:26 PM Report #446125 Posted March 28, 2012 at 01:26 PM Não que eu conheça. Passam todos por a mesma técnica. A menos que haja garantias que só vai usar fonts monospaced 👍 O que podes fazer é criar tu uma textbox com isso "built-in". Sérgio Ribeiro "Great coders aren't born. They're compiled and released""Expert coders do not need a keyboard. They just throw magnets at the RAM chips"
bsccara Posted March 28, 2012 at 02:49 PM Report #446151 Posted March 28, 2012 at 02:49 PM A melhor maneira é criar um controlo derivado da classe TextBox. Tens aqui um exemplo que faz o que queres mas em C# (http://www.codeproject.com/Articles/309927/WPF-TextBox-With-Ellipsis), que podes estudar e depois juntar ao que aprenderes aqui: http://msdn.microsoft.com/en-us/library/ms996443.aspx
mateusb Posted April 3, 2012 at 06:33 PM Report #447325 Posted April 3, 2012 at 06:33 PM É bem fácil! Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged If TextBox1.TextLength > 19 Then ' Se o numero de caracteres da textbox for maior que 19(numero suportado), faça: TextBox1.Text = TextBox1.Text.Remove(19) + "..." ' O texto da Textbox será: Seu próprio texto - caracteres depois do 19 + "..." End If End Sub
ribeiro55 Posted April 3, 2012 at 07:47 PM Report #447336 Posted April 3, 2012 at 07:47 PM Não é assim tão simples mateusb. Com a tua solução, basta alterar o tamanho da textbox, o tipo de letra ou o tamanho da letra para que o teu "número suportado" deixe de fazer sentido. Da forma que o user_unknow mostra, sabes sempre qual vai ser a área ocupada por determinada string com determinadas características de font, de forma a que possas adaptar à área da textbox. Sérgio Ribeiro "Great coders aren't born. They're compiled and released""Expert coders do not need a keyboard. They just throw magnets at the RAM chips"
mateusb Posted April 3, 2012 at 08:14 PM Report #447348 Posted April 3, 2012 at 08:14 PM Não é assim tão simples mateusb. Com a tua solução, basta alterar o tamanho da textbox, o tipo de letra ou o tamanho da letra para que o teu "número suportado" deixe de fazer sentido. Da forma que o user_unknow mostra, sabes sempre qual vai ser a área ocupada por determinada string com determinadas características de font, de forma a que possas adaptar à área da textbox. É verdade, pois não sei de que forma ele vai usar, mas provalvelmente, deixará no padrão, caso ele mexa, é só contar quantas letras ela suporta... 😛
ribeiro55 Posted April 3, 2012 at 08:18 PM Report #447352 Posted April 3, 2012 at 08:18 PM E como é que "contas quantas letras ela suporta" ? Tem de ser feito com MeasureString, para ficar alguma coisa de jeito. Basta a fonte não ser monospaced, esta por exemplo, e abcd tem um tamanho completamente diferente de ABCD abcd | ABCD | aBcD | Continuam a ser 4... Para além disso se eu no Windows forçar um determinado tipo de letra e estilo, lá se vão os teus cálculos 😛 Sérgio Ribeiro "Great coders aren't born. They're compiled and released""Expert coders do not need a keyboard. They just throw magnets at the RAM chips"
mateusb Posted April 3, 2012 at 10:02 PM Report #447373 Posted April 3, 2012 at 10:02 PM pronto, não encontrei nenhum erro, será que está bom assim? Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged Dim numeroSuportado As Single = TextBox1.Width 'A variável de pixels suportados Dim numeroDigitado As Single = TextBox1.Font.Size * TextBox1.Text.Length ' A variável de pixels digitados Dim retOn As Boolean = False 'A variável de reticencias ativadas Dim caracteresSuportadas As Integer = TextBox1.Width / TextBox1.Font.Size 'A variável de Caracteres suportadas If retOn = False And numeroDigitado > numeroSuportado Then ' Se as reticências não estiverem visiveis e o numero (de pixels)digitado for maior que o numero(de pixels) suportado, retOn = True ' Retias visíveis = verdade TextBox1.Text = TextBox1.Text.Remove(caracteresSuportadas - 3) + "..." 'O texto da textbox1 vai ser o próprio texto, sem as caracteres depois do numero da variável caracteresSuportadas - 3(reticências) + "..." End If End Sub depois de muito tempo tentando, aí está!
ribeiro55 Posted April 3, 2012 at 10:44 PM Report #447384 Posted April 3, 2012 at 10:44 PM Não mateusb... percebeste alguma coisa do que te disse? Com o teu código, basta agarrar em algo como, sei lá, Impact, que é o completo oposto de uma fonte monospaced, e obténs as reticências em sítios parvos, e mesmo em sítios diferentes quando usas caracteres mais compridos. Ora vê abaixo. Só com MeasureString é que consegues "pintar" a string com aquela fonte e medir o seu comprimento, antes sequer de aparecer, e aí decidir se está ou não da largura da textbox. O código do user_unknown pode ser muito simplificado, mas a ideia por detrás de um "corte" de frase é aquela: escrever, medir o comprimento final e actuar. O que estás a fazer apenas funciona em fontes monospaced, onde se garante que o comprimento de cada caractere é sempre o mesmo. Sérgio Ribeiro "Great coders aren't born. They're compiled and released""Expert coders do not need a keyboard. They just throw magnets at the RAM chips"
mateusb Posted April 3, 2012 at 11:00 PM Report #447386 Posted April 3, 2012 at 11:00 PM é verdade... mas valeu o aprendizado... 😛
ribeiro55 Posted April 3, 2012 at 11:06 PM Report #447387 Posted April 3, 2012 at 11:06 PM Vale sempre 😛 Sérgio Ribeiro "Great coders aren't born. They're compiled and released""Expert coders do not need a keyboard. They just throw magnets at the RAM chips"
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now