vb.net RichTextBox - How to append text to RichTextBox without scrolling and losing selection

Miroslav Draxal evik na volny.cz
Úterý Srpen 15 23:14:39 CEST 2017


Dobrý den,
Dovolil jsem si malinko upravit předmět, aby se k tomuhle dostali i jiní, protože ve VB.net jsem to nenašel.
Díky za typ, chvíli mi trvalo, než jsem to z C# přechroupal do vb, ale chodí to výborně.
Takže stačí v průzkumníkovi přidat třídu a do ní nakopírovat viz dole. 
Potom v sadě nástrojů si na form přidat RichTextBoxEx a provést přidání textu do rtb bez ztráty pozice a výběru. Rtb v průběhu přidávání textu nebliká.
Přeji dobrou noc Míra

----------------------------------------
rtbXYZ.SuspendPainting()
rtbXYZ.AppendText("něco")
rtbXYZ.ResumePainting()
----------------------------------------

Imports System.Runtime.InteropServices
Public Class RichTextBoxEx
    Inherits RichTextBox
    <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Ansi)>
    Private Shared Function SendMessage(hWnd As IntPtr, wMsg As Int32, wParam As Int32, ByRef lParam As Point) As IntPtr
    End Function

    <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Ansi)>
    Private Shared Function SendMessage(hWnd As IntPtr, wMsg As Int32, wParam As Int32, lParam As IntPtr) As IntPtr
    End Function

    Const WM_USER As Integer = &H400
    Const WM_SETREDRAW As Integer = &HB
    Const EM_GETEVENTMASK As Integer = WM_USER + 59
    Const EM_SETEVENTMASK As Integer = WM_USER + 69
    Const EM_GETSCROLLPOS As Integer = WM_USER + 221
    Const EM_SETSCROLLPOS As Integer = WM_USER + 222

    Private _ScrollPoint As Point
    Private _Painting As Boolean = True
    Private _EventMask As IntPtr
    Private _SuspendIndex As Integer = 0
    Private _SuspendLength As Integer = 0

    Public Sub SuspendPainting()
        If _Painting Then
            _SuspendIndex = Me.SelectionStart
            _SuspendLength = Me.SelectionLength
            SendMessage(Me.Handle, EM_GETSCROLLPOS, 0, _ScrollPoint)
            SendMessage(Me.Handle, WM_SETREDRAW, 0, IntPtr.Zero)
            _EventMask = SendMessage(Me.Handle, EM_GETEVENTMASK, 0, IntPtr.Zero)
            _Painting = False
        End If
    End Sub

    Public Sub ResumePainting()
        If Not _Painting Then
            Me.Select(_SuspendIndex, _SuspendLength)
            SendMessage(Me.Handle, EM_SETSCROLLPOS, 0, _ScrollPoint)
            SendMessage(Me.Handle, EM_SETEVENTMASK, 0, _EventMask)
            SendMessage(Me.Handle, WM_SETREDRAW, 1, IntPtr.Zero)
            _Painting = True
            Me.Invalidate()
        End If
    End Sub
End Class

-----Original Message-----
From: Hw-list [mailto:hw-list-bounces na list.hw.cz] On Behalf Of Ladislav Vaiz
Sent: Monday, August 14, 2017 12:02 PM
To: HW-news
Subject: Re: vb.net RichTextBox

Já se zeptal ".net richtextbox do not scroll after appendtext"
a dozvěděl jsem se:
https://stackoverflow.com/questions/6547193/how-to-append-text-to-richtextbox-without-scrolling-and-losing-selection
https://stackoverflow.com/questions/626988/prevent-autoscrolling-in-richtextbox

L.

Dne 14.8.2017 v 11:12 Miroslav Draxal napsal(a):
>
> Přeji hezký den ve spolek.
>
> Nevím jak se zeptat googlu, tak to zkusím tady.
>
> Mějme RichTextBox (rtb) do kterého metodou rtb.AppendText(„xyz“) 
> přidávám text.
>
> Pokud není rtb ve focusu a textu je v rtb více než se může zobrazit, 
> tak se nově vypisovaný text schová pod spodní okraj rtb.
>
> Metodou rtb.ScrollToCaret() se posune text na posledně vložení řádek.
>
> Čili, pokud chci neposouvat text, vynechám metodu ScrollToCaret()
>
> A teď. Pokud je rtb ve focusu, tak se text posouvá automaticky na 
> posledně přidaný text. Nevíte, jak tomu zabránit?
>
> Míra
>


_______________________________________________
HW-list mailing list  -  sponsored by www.HW.cz Hw-list na list.hw.cz http://list.hw.cz/mailman/listinfo/hw-list



Další informace o konferenci Hw-list