none
RichTextBox con texto muy largo RRS feed

  • Pregunta

  • Hola.

    Me.RichTextBox1.Dock = System.Windows.Forms.DockStyle.Fill

    Hay cargado un archivo de texto bastante extenso en el RichTextBox.

    El problema es que, al agrandar el formulario con el cursor del mouse desde una esquina de éste, se bloquea un rato todo el formulario .

    Conocen alguna solución para evitar este inconveniente?

    Gracias.

    sábado, 19 de diciembre de 2015 9:47

Respuestas

  • Otra opción que quizás te dé mejor rendimiento es la de deshabilitar el redibujado del control a través de la API de Windows mientras se realiza la redimensión:

        <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)>
        Private Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal Msg As UInteger, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr
        End Function
    
        Private Const WM_SETREDRAW As Integer = &H000B
        Private Const WM_USER As Integer = &H400
        Private Const EM_GETEVENTMASK As Integer = (WM_USER + 59)
        Private Const EM_SETEVENTMASK As Integer = (WM_USER + 69)
    
        Private eventMask As IntPtr = IntPtr.Zero
    
        Private Sub Form1_ResizeBegin(sender As Object, e As EventArgs) Handles MyBase.ResizeBegin
            SendMessage(RichTextBox1.Handle, WM_SETREDRAW, 0, IntPtr.Zero)
            eventMask = SendMessage(RichTextBox1.Handle, EM_GETEVENTMASK, 0, IntPtr.Zero)
        End Sub
    
        Private Sub Form1_ResizeEnd(sender As Object, e As EventArgs) Handles MyBase.ResizeEnd
            SendMessage(RichTextBox1.Handle, EM_SETEVENTMASK, 0, eventMask)
            SendMessage(RichTextBox1.Handle, WM_SETREDRAW, 1, IntPtr.Zero)
            RichTextBox1.Invalidate()
        End Sub

    Sin embargo, aunque pueda mejorar, el tiempo que tarda en redibujarse el control no lo vas a poder evitar. Es decir, puedes evitar que el control realice redibujados innecesarios, pero el tiempo que tarda en redibujarse no vas a poder evitarlo.

    Me temo que para poder ir más allá deberías buscar algún control de terceros.


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    sábado, 19 de diciembre de 2015 11:49

Todas las respuestas

  • Pues sí tiene que ser grande el documento.

    Es un poco guarrada pero se me ocurre que podías ocultar el control al comenzar la redimensión y volver a mostrarlo al finalizar.

        Private Sub Form1_ResizeBegin(sender As Object, e As EventArgs) Handles MyBase.ResizeBegin
            RichTextBox1.Visible = False
        End Sub
    
        Private Sub Form1_ResizeEnd(sender As Object, e As EventArgs) Handles MyBase.ResizeEnd
            RichTextBox1.Visible = True
        End Sub
    

    Quizás reemplazándolo con una imagen para mejorar el efecto.


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    sábado, 19 de diciembre de 2015 10:39
  • Gracias por la respuesta Asier Villanueva

    Pero al soltar la esquina del Form, (después de redimensionar), empieza de nuevo el bloqueo.

    Será porque se vuelven a reescribir los datos contenidos en el RichTextBox! Alguna idea?

    ...Tengo desactivada la opción de mover las ventanas durante el arrestre en "Configuración avanzada del sistema.



    • Editado RafaelFM sábado, 19 de diciembre de 2015 11:23
    sábado, 19 de diciembre de 2015 11:16
  • Otra opción que quizás te dé mejor rendimiento es la de deshabilitar el redibujado del control a través de la API de Windows mientras se realiza la redimensión:

        <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)>
        Private Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal Msg As UInteger, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr
        End Function
    
        Private Const WM_SETREDRAW As Integer = &H000B
        Private Const WM_USER As Integer = &H400
        Private Const EM_GETEVENTMASK As Integer = (WM_USER + 59)
        Private Const EM_SETEVENTMASK As Integer = (WM_USER + 69)
    
        Private eventMask As IntPtr = IntPtr.Zero
    
        Private Sub Form1_ResizeBegin(sender As Object, e As EventArgs) Handles MyBase.ResizeBegin
            SendMessage(RichTextBox1.Handle, WM_SETREDRAW, 0, IntPtr.Zero)
            eventMask = SendMessage(RichTextBox1.Handle, EM_GETEVENTMASK, 0, IntPtr.Zero)
        End Sub
    
        Private Sub Form1_ResizeEnd(sender As Object, e As EventArgs) Handles MyBase.ResizeEnd
            SendMessage(RichTextBox1.Handle, EM_SETEVENTMASK, 0, eventMask)
            SendMessage(RichTextBox1.Handle, WM_SETREDRAW, 1, IntPtr.Zero)
            RichTextBox1.Invalidate()
        End Sub

    Sin embargo, aunque pueda mejorar, el tiempo que tarda en redibujarse el control no lo vas a poder evitar. Es decir, puedes evitar que el control realice redibujados innecesarios, pero el tiempo que tarda en redibujarse no vas a poder evitarlo.

    Me temo que para poder ir más allá deberías buscar algún control de terceros.


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    sábado, 19 de diciembre de 2015 11:49
  • Gracias de nuevo Asier Villanueva

    Voto esta respuesta y dejo elhilo abierto por si a alguien se le ocurre otra mejor.

    sábado, 19 de diciembre de 2015 12:50