Discussion:
RichTextBox
(demasiado antiguo para responder)
Javier
2007-05-30 11:42:09 UTC
Permalink
Hola,

¿Como puedo forzar interlineado "normal" en un RichTextBox?

El tipo de separación entre líneas no está controlado en el objeto
RichTextBox y si por ejemplo se copia y pega desde Word un texto con
interlineado doble, queda con ese interlineado en el RichTextBox y no veo la
manera de cambiarlo.

saludos,

Javier Jiménez
unknown
2007-05-30 18:59:39 UTC
Permalink
Post by Javier
Hola,
¿Como puedo forzar interlineado "normal" en un RichTextBox?
El tipo de separación entre líneas no está controlado en el objeto
RichTextBox y si por ejemplo se copia y pega desde Word un texto con
interlineado doble, queda con ese interlineado en el RichTextBox y no veo la
manera de cambiarlo.
Hola Javier,
que yo sepa este tipo de formatos de párrafo no los podrás modificar mediante las propiedades que expone el control.

Pero al RichTextBox le puedes enviar el mensaje EM_SETPARAFORMAT a través de la función de la API de Windows 'SendMessage', pasándole una estructura PARAFORMAT2, a cuyo miembro 'dwMask' le establezcas el indicador PFM_LINESPACING para indicarle que el valor especificado en los miembros 'bLineSpacingRule' y 'dyLineSpacing' de dicha estructura contendrán un valor válido, y en tu caso le especificarías el valor 0 al primero para establecer un "interlineado sencillo" al texto seleccionado en el control.
En el miembro 'dyLineSpacing' puedes indicar un valor, que será ignorado en los casos de "Interlineado Simple | 1,5 líneas | Doble | (con una excepción en el 'Mínimo')".
En el interlineado "Mínimo", "Exacto" y "Múltiple" puedes especificar el espaciado de una línea a la siguiente.

Te sugiero que no dejes de consultar el resto de los detalles en la documentación:
· PARAFORMAT2 Structure:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/richedit/richeditcontrols/richeditcontrolreference/richeditstructures/paraformat2.asp

· EM_SETPARAFORMAT Message:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/richedit/richeditcontrols/richeditcontrolreference/richeditmessages/em_setparaformat.asp

En el siguiente ejemplo te muestro una función pública a la que le pasarás el controlador de ventana de un RichTextBox, el miembro de una enumeración que corresponderá a la "regla de espaciado", y un valor opcional para el interlineado. La función devolverá 'False' si no se pudo establecer el formato de párrafo en la llamada.
**Recuerda que el formato se aplica a la selección actual**
El control de errores te lo dejo a tí.

La llamada podrá ser por ejemplo:
If InterlineadoRTB(TuRichTextBox.hWnd, [0 - Simple]) = False Then
ó
If InterlineadoRTB(TuRichTextBox.hWnd, [5 - Múltiple], 50) ...


'En un módulo estándar...
'***********************
Option Explicit

Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" ( _
ByVal hwnd As Long, ByVal wMsg As Long, _
ByVal wParam As Long, lParam As Any) As Long

Private Const EM_SETPARAFORMAT As Long = &H447
Private Const PFM_LINESPACING As Long = &H100
Private Const PFM_SPACEAFTER As Long = &H80
Private Const MAX_TAB_STOPS As Long = 32

Private Type PARAFORMAT2
cbSize As Long
dwMask As Long
wNumbering As Integer
wEffects As Integer
dxStartIndent As Long
dxRightIndent As Long
dxOffset As Long
wAlignment As Integer
cTabCount As Integer
rgxTabs(1 To MAX_TAB_STOPS) As Long
dySpaceBefore As Long
dySpaceAfter As Long
dyLineSpacing As Long
sStyle As Integer
bLineSpacingRule As Byte
bOutlineLevel As Byte
wShadingWeight As Integer
wShadingStyle As Integer
wNumberingStart As Integer
wNumberingStyle As Integer
wNumberingTab As Integer
wBorderSpace As Integer
wBorderWidth As Integer
wBorders As Integer
End Type

Public Enum ConstantesInterlineado
[0 - Simple] = 0 'dyLineSpacing será ignorado
[1 - 1,5 líneas] 'dyLineSpacing será ignorado
[2 - Doble] 'dyLineSpacing será ignorado
[3 - Mínimo] 'dyLineSpacing será ignorado si se especifica un valor
' menor que un «Interlineado Simple», en cuyo caso
' se aplicará automáticamente un interlineado Simple.
[4 - Exacto] 'A diferencia del "Mínimo", aunque el valor sea menor que
' un «Interlineado Simple», se usará el valor que se indique.
[5 - Múltiple] 'Escala 1:20 de espaciado entre líneas. 20 unidades = un '0-Simple'.
End Enum

' -- -- -- -- --
Public Function InterlineadoRTB( _
ByVal hWndRTB As Long, _
ByVal OpInterlineado As ConstantesInterlineado, _
Optional ByVal ValorInterlineado As Long _
) As Boolean

Dim PF As PARAFORMAT2
With PF
.cbSize = Len(PF)
.dwMask = PFM_LINESPACING Or PFM_SPACEAFTER
.bLineSpacingRule = OpInterlineado
.dyLineSpacing = ValorInterlineado
End With
InterlineadoRTB = SendMessage(hWndRTB, EM_SETPARAFORMAT, 0&, PF) <> 0
End Function
'***********************
--
Saludos
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
( ! ) Respuestas precedentes en Google:
http://groups.google.com/group/microsoft.public.es.vb
( i ) Temperancia en el foro:
http://support.microsoft.com/default.aspx?scid=fh;ES-ES;newsreglas
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Javier
2007-05-31 07:11:03 UTC
Permalink
Hola, ya había probado esta función SendMessage pero, poniendo tu función,
aunque me devuelve verdadero me deja interlineado 1.5 en la parte lineal del
texto. Es curioso que el texto se ve con interlineado sencillo pero si se
inserta una nueva línea le pone interlineado 1.5

Estas son las líneas que uso:

TDBIclnAnotaciones.SelStart = 0
TDBIclnAnotaciones.SelLength = Len(TDBIclnAnotaciones.Text)
e = RTF_Interlineado(TDBIclnAnotaciones.hwnd, [0 - Simple], 12)
TDBIclnAnotaciones.SelLength = 0

Gracias,
Javier Jiménez
Post by Javier
Hola,
¿Como puedo forzar interlineado "normal" en un RichTextBox?
El tipo de separación entre líneas no está controlado en el objeto
RichTextBox y si por ejemplo se copia y pega desde Word un texto con
interlineado doble, queda con ese interlineado en el RichTextBox y no veo la
manera de cambiarlo.
Hola Javier,
que yo sepa este tipo de formatos de párrafo no los podrás modificar
mediante las propiedades que expone el control.

Pero al RichTextBox le puedes enviar el mensaje EM_SETPARAFORMAT a
través de la función de la API de Windows 'SendMessage', pasándole una
estructura PARAFORMAT2, a cuyo miembro 'dwMask' le establezcas el indicador
PFM_LINESPACING para indicarle que el valor especificado en los miembros
'bLineSpacingRule' y 'dyLineSpacing' de dicha estructura contendrán un valor
válido, y en tu caso le especificarías el valor 0 al primero para establecer
un "interlineado sencillo" al texto seleccionado en el control.
En el miembro 'dyLineSpacing' puedes indicar un valor, que será ignorado
en los casos de "Interlineado Simple | 1,5 líneas | Doble | (con una
excepción en el 'Mínimo')".
En el interlineado "Mínimo", "Exacto" y "Múltiple" puedes especificar el
espaciado de una línea a la siguiente.

Te sugiero que no dejes de consultar el resto de los detalles en la
documentación:
· PARAFORMAT2 Structure:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/richedit/richeditcontrols/richeditcontrolreference/richeditstructures/paraformat2.asp

· EM_SETPARAFORMAT Message:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/richedit/richeditcontrols/richeditcontrolreference/richeditmessages/em_setparaformat.asp

En el siguiente ejemplo te muestro una función pública a la que le
pasarás el controlador de ventana de un RichTextBox, el miembro de una
enumeración que corresponderá a la "regla de espaciado", y un valor opcional
para el interlineado. La función devolverá 'False' si no se pudo establecer
el formato de párrafo en la llamada.
**Recuerda que el formato se aplica a la selección actual**
El control de errores te lo dejo a tí.

La llamada podrá ser por ejemplo:
If InterlineadoRTB(TuRichTextBox.hWnd, [0 - Simple]) = False Then
ó
If InterlineadoRTB(TuRichTextBox.hWnd, [5 - Múltiple], 50) ...


'En un módulo estándar...
'***********************
Option Explicit

Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA"
( _
ByVal hwnd As Long, ByVal wMsg As Long, _
ByVal wParam As Long, lParam As Any) As Long

Private Const EM_SETPARAFORMAT As Long = &H447
Private Const PFM_LINESPACING As Long = &H100
Private Const PFM_SPACEAFTER As Long = &H80
Private Const MAX_TAB_STOPS As Long = 32

Private Type PARAFORMAT2
cbSize As Long
dwMask As Long
wNumbering As Integer
wEffects As Integer
dxStartIndent As Long
dxRightIndent As Long
dxOffset As Long
wAlignment As Integer
cTabCount As Integer
rgxTabs(1 To MAX_TAB_STOPS) As Long
dySpaceBefore As Long
dySpaceAfter As Long
dyLineSpacing As Long
sStyle As Integer
bLineSpacingRule As Byte
bOutlineLevel As Byte
wShadingWeight As Integer
wShadingStyle As Integer
wNumberingStart As Integer
wNumberingStyle As Integer
wNumberingTab As Integer
wBorderSpace As Integer
wBorderWidth As Integer
wBorders As Integer
End Type

Public Enum ConstantesInterlineado
[0 - Simple] = 0 'dyLineSpacing será ignorado
[1 - 1,5 líneas] 'dyLineSpacing será ignorado
[2 - Doble] 'dyLineSpacing será ignorado
[3 - Mínimo] 'dyLineSpacing será ignorado si se especifica un valor
' menor que un «Interlineado Simple», en cuyo caso
' se aplicará automáticamente un interlineado Simple.
[4 - Exacto] 'A diferencia del "Mínimo", aunque el valor sea menor
que
' un «Interlineado Simple», se usará el valor que se
indique.
[5 - Múltiple] 'Escala 1:20 de espaciado entre líneas. 20 unidades =
un '0-Simple'.
End Enum

' -- -- -- -- --
Public Function InterlineadoRTB( _
ByVal hWndRTB As Long, _
ByVal OpInterlineado As ConstantesInterlineado, _
Optional ByVal ValorInterlineado As Long _
) As Boolean

Dim PF As PARAFORMAT2
With PF
.cbSize = Len(PF)
.dwMask = PFM_LINESPACING Or PFM_SPACEAFTER
.bLineSpacingRule = OpInterlineado
.dyLineSpacing = ValorInterlineado
End With
InterlineadoRTB = SendMessage(hWndRTB, EM_SETPARAFORMAT, 0&, PF) <> 0
End Function
'***********************
--
Saludos
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
( ! ) Respuestas precedentes en Google:
http://groups.google.com/group/microsoft.public.es.vb
( i ) Temperancia en el foro:
http://support.microsoft.com/default.aspx?scid=fh;ES-ES;newsreglas
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
unknown
2007-05-31 21:22:06 UTC
Permalink
Post by Javier
Hola, ya había probado esta función SendMessage pero, poniendo tu función,
aunque me devuelve verdadero me deja interlineado 1.5 en la parte lineal del
texto. Es curioso que el texto se ve con interlineado sencillo pero si se
inserta una nueva línea le pone interlineado 1.5
TDBIclnAnotaciones.SelStart = 0
TDBIclnAnotaciones.SelLength = Len(TDBIclnAnotaciones.Text)
e = RTF_Interlineado(TDBIclnAnotaciones.hwnd, [0 - Simple], 12)
TDBIclnAnotaciones.SelLength = 0
Hola,
yo no he conseguido reproducir lo que comentas, después de modificar el interlineado me deja añadir una línea al principio, en medio, o al final, conservando el formato que posee el punto de inserción actual.
Claro que solamente he conseguido ver lo que dices si por ejemplo regreso a Word y copio otra sección de texto con formato distinto a 'simple' *y lo vuelvo a pegar* en cualquier lugar del RichTextBox, pero vamos, se supene que así es como debe ser.

De hecho, tampoco consigo entender qué quieres decir concretamente con «me deja interlineado 1.5 *en la parte lineal* del texto».
Comenta qué acciones realizas exactamente, para que podamos intentar reproducir el comportamiento que describes.
--
Saludos
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
( ! ) Respuestas precedentes en Google:
http://groups.google.com/group/microsoft.public.es.vb
( i ) Temperancia en el foro:
http://support.microsoft.com/default.aspx?scid=fh;ES-ES;newsreglas
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Javier
2007-06-01 06:48:15 UTC
Permalink
Lapsus dedus al teclear. Quería decir que deja un interlineado 1.5 en la
parte final del texto. A simple vista el interlineado es normal pero si
inserto una línea me la pone con el interlineado de 1.5

Saludos,

Javier J
Post by Javier
Hola, ya había probado esta función SendMessage pero, poniendo tu función,
aunque me devuelve verdadero me deja interlineado 1.5 en la parte lineal del
texto. Es curioso que el texto se ve con interlineado sencillo pero si se
inserta una nueva línea le pone interlineado 1.5
TDBIclnAnotaciones.SelStart = 0
TDBIclnAnotaciones.SelLength = Len(TDBIclnAnotaciones.Text)
e = RTF_Interlineado(TDBIclnAnotaciones.hwnd, [0 - Simple], 12)
TDBIclnAnotaciones.SelLength = 0
Hola,
yo no he conseguido reproducir lo que comentas, después de modificar el
interlineado me deja añadir una línea al principio, en medio, o al final,
conservando el formato que posee el punto de inserción actual.
Claro que solamente he conseguido ver lo que dices si por ejemplo
regreso a Word y copio otra sección de texto con formato distinto a 'simple'
*y lo vuelvo a pegar* en cualquier lugar del RichTextBox, pero vamos, se
supene que así es como debe ser.

De hecho, tampoco consigo entender qué quieres decir concretamente con
«me deja interlineado 1.5 *en la parte lineal* del texto».
Comenta qué acciones realizas exactamente, para que podamos intentar
reproducir el comportamiento que describes.
--
Saludos
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
( ! ) Respuestas precedentes en Google:
http://groups.google.com/group/microsoft.public.es.vb
( i ) Temperancia en el foro:
http://support.microsoft.com/default.aspx?scid=fh;ES-ES;newsreglas
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
unknown
2007-06-03 00:27:15 UTC
Permalink
Post by Javier
Lapsus dedus al teclear. Quería decir que deja un interlineado 1.5 en la
parte final del texto. A simple vista el interlineado es normal pero si
inserto una línea me la pone con el interlineado de 1.5
Pues lo lamento Javier, pero por más que lo intento no consigo que me suceda lo mismo que a tí.
Te vuelvo a remitir a mi mensaje anterior, en donde te pido que nos des detalladamente los pasos a seguir para reproducir el problema, de lo contrario no veo cómo poder ayudarte.

De paso, por si acaso a alguien le suena, comenta la versión de Visual Basic, del RichTextBox, y del Service Pack de VB que estás usando (aunque pienso que será irrelevante para el comportamiento que describes...)
--
Saludos
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
( ! ) Respuestas precedentes en Google:
http://groups.google.com/group/microsoft.public.es.vb
( i ) Temperancia en el foro:
http://support.microsoft.com/default.aspx?scid=fh;ES-ES;newsreglas
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
unknown
2007-06-03 10:55:06 UTC
Permalink
Post by Javier
Lapsus dedus al teclear. Quería decir que deja un interlineado 1.5 en la
parte final del texto. A simple vista el interlineado es normal pero si
inserto una línea me la pone con el interlineado de 1.5
¡Lo econtré! :-)

Cuando el texto en el RichTextBox está finalizado por uno o más retornos de carro y avance de línea, no toma en cuenta la selección del último cuando se ejecuta:

TuRichTextBox.SelStart = 0
TuRichTextBox.SelLength = Len(TuRichTextBox.Text)

por lo que el último carácter conservará el formato anterior, y lógicamente al añadir texto a partir de él sigues teniendo en el último punto de inserción el formato de párrafo y fuente anterior.

Para corregir el problema, simplemente debes asegurar que se incluya, si lo hubiera, el último retorno de carro, forzando extender la selección a los dos caracteres que lo forman:

'****************
TuRichTextBox.SelStart = 0
TuRichTextBox.SelLength = Len(TuRichTextBox.Text) + 2
'****************
--
Saludos
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
( ! ) Respuestas precedentes en Google:
http://groups.google.com/group/microsoft.public.es.vb
( i ) Temperancia en el foro:
http://support.microsoft.com/default.aspx?scid=fh;ES-ES;newsreglas
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Continúe leyendo en narkive:
Loading...