[VB.NET] ¿Cómo puedo subrayar palabras de cierto color en un RichTextBox?

Iniciado por dont'Exist, 9 Septiembre 2019, 00:04 AM

0 Miembros y 1 Visitante están viendo este tema.

dont'Exist

Buenas día, me llego aquí con una consulta muy corta pero que me está haciendo doler la cabeza con algo que quizás es muy sencillo, pero sinceramente no he podido avanzar, y he buscado sobre la propiedad underline, pero me he estancado ahí.

Tengo en un RichTextBox palabras escritas de distintos colores, y quisiera hacer que me haga un subrayado en aquellas palabras que sólo estén en amarillo, por ejemplo.

Espero que me puedan orientar un poco en esto.

Muchas gracias, saludos  :-\

Serapis

La cuestión es dependiente de si tal color tú lo aplicas o si ya está ahí...

A - Si los aplicas tú, se trata de iniciar otra vez el bucle que localiza el texto en cuestión y aplica el color amarillo, pero ahora en vez de aplicar el color, lo que aplicas es la fuente con la propiedad underline a true. La forma de aplicarlo será como más abajo señalo, pero la forma de localizarlo, es la misma que usaste para aplicar dicho color de selección (es decir esta forma de localizarlo, si existe será más óptima que la siguiente)...

B - Si en cambio el texto ya trae coloreado en origen el texto ("estaba así"), no queda otra que reconocerlo (en el sentido de hacer un análizarlo, no de aceptar un hecho), para ello basta un par de bucles y usando la propiedad: SelectionColor.

Ten encuenta que SelectionColor se refiere sólo al texto seleccionado actual, por lo que debes ser tu quien manipule dicha seleccion... y no tomar cualquier texto que pudiera haber sleccionado...
...nota también que el color de selección es uno en particular, el color aplicado a un texto seleccionado, pero si el texto seleccionado tiene un color en particular, refiere a dicho color, es decir un texto sin color sería el SelectionColorDefault por decirlo de alguna manera...

En pseudocódigo sería más o menos:


funcion AplicarEstilofuente (font f)
   entero, j, k


o quizás una firma más parametrizada...

funcion AplicarEstilofuente (negrita boolean, cursiva boolean, subrayada boolean, tachado boolean, size integer)
  entero, j, k
  font f

  with f  '.Style
     .Bold = negrita
     .Italic = cursiva
     .Underline = subrayada
     .Strikeout = tachado
     .Size = size
  end with

 ' ...


o quizás una firma algo menos parametrizada...
Código (vbnet) [Seleccionar]

funcion AplicarEstilofuente (Estilo FontStyle)
    entero, j, k
    font f.Style = Estilo

    ' posicionar la seleccion al comienzo:
    richtb.Selectionlength = 1
    bucle para k desde 0 hasta richtb.TextLength
        richtb.SelectionStart = k
        ' v ---- desde aquí se va seleccionando el texto 'amarillo'
        Si ritchtb.SelectionColor = amarillo luego    
            Hacer
                richtb.Selectionlength += 1  
            Repetir mientras ritchtb.SelectionColor = amarillo

            ' v ------ aquí aplicas el estilo de la fuente al texto seleccionado.
            richtb.selectionfont = f  
            ' avanzamos el contador del bucle principal hasta el final de la selección actual.
            k += richtb.Selectionlength -1 ' +0, +1, -1 afina, yo escribo al vuelo...
            ' sin parar en detalles nimios que puedes corregir cuando lo pruebes.
            ' la selección vuelve a ser 1 carácter hasta encontrar otro candidato.
            richtb.Selectionlength = 1  
        fin si
    siguiente
fin funcion


Por último nota que si el texto fuera muy muy largo, podría demorarse la presentación, así que es mejor evitar que se actualice la vista (redibujado) con cada cambio al aplicar selectionfont. Conviene por tanto congelar el redibujado al inicio y redibujarlo al final, usando:
- Antes de iniciar el bucle (mejor a la entrada de la función) un: richtb.SuspendLayout
- Y después del bucle (o mejor justo antes de salir) un: richtb.ResumeLayout
OJO: van en pareja si pones el primero más vale que no lvides poner el segundo...



p.d.: Olvidaba decirte que como esto no es un problema de programación si no con el lenguaje, debes siempre mirar la fuente original del lenguaje... que para eso proporcionan una referencia completa del lenguaje....
y si procede buscar en google "ejemplos de objeto/objeto.propiedad/objeto.metodo" antes de venir a quí como si fuera algo inexistente o imposible d elocalizar, a buen seguro en ggogle abundan ejemplos.

https://docs.microsoft.com/es-es/dotnet/api/system.windows.forms.richtextbox?view=netframework-4.8#propiedades