Historial del chat

ChatGPT

Photo Realistic Image GPT

Explorar GPT

Proyectos

Nuevo proyecto

Ayer

Serpiente y rana venenosa

7 días anteriores

Renovación y posibles problemas

30 días anteriores

Error en archivo ZIP

Problema con PayPal Checkout

Preguntar sobre webs

Ver planesAcceso ilimitado, características de Team y más

Ana Diaz

Abrir barra lateral

ChatGPT 4o mini

ChatGPT 4o mini

Compartir

Dijiste:

Hola Chat, mira, esta funcion me calcula el alto de un RichTextBox - RTB a partir de ahora - pero em pinta en el monitor, en la esquina superior izquierda, como lo solucionamos?

Private Function GetRichTextHeight(rtbHwnd As Long, rtbFont As StdFont, Text As String, rtbWidth As Long) As Long
' Declare required variables
Dim fr As FORMATRANGE_HEIGHT
Dim rcDrawTo As RECT, rcPage As RECT
Dim hdcPrinter As Long
Dim result As Long

' Get the device context for the screen
hdcPrinter = CreateDC("DISPLAY", vbNullString, vbNullString, ByVal 0&)

' Set up the FORMATRANGE structure
fr.hdc = hdcPrinter
fr.hdcTarget = hdcPrinter

' Define the printable area (relative to page size)
With rcPage
.Left = 0
.Top = 0
.Right = rtbWidth ' Use the provided width of the RichTextBox/UserControl
.Bottom = &H7FFFFFFF ' Set bottom to maximum to measure the height
End With

' Define the drawing area on the page (same as printable area)
rcDrawTo = rcPage

' Set up the FORMATRANGE with the page and drawing area
fr.rcPage = rcPage
fr.rc = rcDrawTo
fr.chrg.cpMin = 0 ' Start of the text
fr.chrg.cpMax = -1 ' End of the text

' Send EM_FORMATRANGE message to measure the text
result = SendMessage(rtbHwnd, EM_FORMATRANGE, True, fr)

' Return the height of the formatted text
GetRichTextHeight = IIf(fr.rc.Bottom = &H7FFFFFFF, 0, fr.rc.Bottom)

' Release resources
DeleteDC hdcPrinter
SendMessage rtbHwnd, EM_FORMATRANGE, False, ByVal CLng(0)
End Function

Thought for 16 segundos

Solucionando el problema

El usuario menciona que una función en Visual Basic está calculando la altura de un RichTextBox, pero está pintando en la esquina superior izquierda del monitor. Ahora pienso en cómo abordar esto.

Configurando la estructura

Estoy viendo que la función utiliza FORMATRANGE para medir la altura del texto formateado en RichTextBox, estableciendo el área imprimible y la de dibujo, y enviando mensaje EM_FORMATRANGE.

Previendo el impacto visual

Estoy viendo que EM_FORMATRANGE está enviando texto a un contexto de dispositivo, pintándolo en la pantalla. Buscando evitar esto, pienso en una solución para medir la altura sin dibujo en pantalla.

Buscando alternativas

Estoy pensando en cómo medir el texto sin dibujarlo, usando contextos o parámetros para evitar el dibujo.

Revisando la configuración

Estoy pensando en cómo EM_FORMATRANGE usa wParam para renderizar o no el texto. Configurarlo en False solo formatea.

Hola,

El problema que estás experimentando es que la función EM_FORMATRANGE está renderizando (dibujando) el texto en el contexto de dispositivo que proporcionaste, que en este caso es la pantalla (CreateDC("DISPLAY", ...)). Esto resulta en que el texto se dibuje en la esquina superior izquierda de la pantalla.

Para solucionar esto y evitar que el texto se dibuje, pero aún así obtener la altura del texto formateado, debes configurar el parámetro wParam de la llamada a SendMessage con EM_FORMATRANGE a False. Esto le indica al control que formatee el texto pero que no lo renderice.

Aquí está la corrección en tu código:

vb

Copiar

' Cambiar wParam a False para evitar el renderizado
result = SendMessage(rtbHwnd, EM_FORMATRANGE, False, fr)

Entonces, tu función completa quedaría así:

vb

Copiar

Private Function GetRichTextHeight(rtbHwnd As Long, rtbFont As StdFont, Text As String, rtbWidth As Long) As Long
' Declarar variables requeridas
Dim fr As FORMATRANGE_HEIGHT
Dim rcDrawTo As RECT, rcPage As RECT
Dim hdcPrinter As Long
Dim result As Long

' Obtener el contexto de dispositivo para la pantalla
hdcPrinter = CreateDC("DISPLAY", vbNullString, vbNullString, ByVal 0&)

' Configurar la estructura FORMATRANGE
fr.hdc = hdcPrinter
fr.hdcTarget = hdcPrinter

' Definir el área imprimible (relativa al tamaño de la página)
With rcPage
.Left = 0
.Top = 0
.Right = rtbWidth ' Usar el ancho proporcionado del RichTextBox/UserControl
.Bottom = &H7FFFFFFF ' Establecer el fondo al máximo para medir la altura
End With

' Definir el área de dibujo en la página (igual que el área imprimible)
rcDrawTo = rcPage

' Configurar FORMATRANGE con el área de página y dibujo
fr.rcPage = rcPage
fr.rc = rcDrawTo
fr.chrg.cpMin = 0 ' Inicio del texto
fr.chrg.cpMax = -1 ' Fin del texto

' Enviar mensaje EM_FORMATRANGE para medir el texto sin renderizar
result = SendMessage(rtbHwnd, EM_FORMATRANGE, False, fr)

' Devolver la altura del texto formateado
GetRichTextHeight = IIf(fr.rc.Bottom = &H7FFFFFFF, 0, fr.rc.Bottom)

' Liberar recursos
DeleteDC hdcPrinter
SendMessage rtbHwnd, EM_FORMATRANGE, False, ByVal CLng(0)
End Function

Al cambiar wParam a False, el control formatea el texto para el rango especificado y calcula las dimensiones necesarias sin dibujar nada en el contexto de dispositivo. Esto debería solucionar el problema de que el texto se dibuje en la esquina superior izquierda de la pantalla.

Esta conversación está archivada. Para continuar, desarchívala primero.

Desarchivar

?