Sincronizzare la scrollbar di due RichTextBox
Talvolta in applicazioni .NET WinForms (Windows Forms) potrebbe essere utile sincronizzare la scrollbar verticale di due RichTextBox ad esempio se si vuole realizzare un semplice visualizzatore di testo che abbia la funzionalità di mostrare anche il numero di riga. Un semplice visualizzatore di questo tipo può essere realizzato, ad esempio, tramite due RichTextBox, uno che visualizza il numero di riga e uno che visualizza il testo.
Di seguito un esempio di visualizzatore di questo tipo che ho scritto nell’ambito l’applicazione .NET WinForms PowerTray che sto sviluppando a tempo perso e che ha l’obbiettivo di poter eseguire script PowerShell e di visualizzare l’output quando lo si desidera tramite una un’icona nella tray bar.
Affinché i due RichTextBox siano funzionali allo scopo della visualizzazione del testo mantenendo il corretto riferimento al numero della riga la scrollbar verticale del RichTextBox che mostra il numero di riga (denominato rtbLineNumbers) deve essere sincronizzata con la vertical scrollbar del richtextbox che mostra il testo (denominato rtbScriptText). Ovvero quando si esegue uno scroll verticale sul richtextbox che mostra il testo (denominato rtbScriptText) questo deve essere replicato la scrollbar verticale del RichTextBox che mostra il numero di riga (denominato rtbLineNumbers).
Di seguito il codice VB.NET che può essere utilizzato per realizzare tale comportamento che utilizza la funzione API SendMessage per leggere e impostare la posizione della scrollbar:
<System.Runtime.InteropServices.DllImport(“user32.dll”)>
Private Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal msg As Int32, ByVal wParam As Int32, ByRef lParam As System.Drawing.Point) As Int32
End Function
Private Sub rtbScriptText_VScroll(sender As Object, e As EventArgs) Handles rtbScriptText.VScroll
Const WM_USER As Integer = &H400
Const EM_GETSCROLLPOS As Integer = WM_USER + 221
Const EM_SETSCROLLPOS As Integer = WM_USER + 222
Dim currentScrollPosition As Point
ScriptPreviewForm.SendMessage(Me.rtbScriptText.Handle, EM_GETSCROLLPOS, 0, currentScrollPosition)
ScriptPreviewForm.SendMessage(Me.rtbLineNumbers.Handle, EM_SETSCROLLPOS, 0, currentScrollPosition)
End Sub
Ciao Ermanno vorrei congratularmi con te per i tanti suggerimenti.
Poche’ sono passato da poco da VB6 a VB.net (uso VS2012) mi piacerebbe vedere come hai sviluppato la tua applicazione PowerTray. Sarebbe molto interessante vedere anche come hai fatto con lo script powershell.
Infine volevo chiederti un’applicazione del genere (sopratutto se avviata da uno script col passaggio di parametri) come va rilasciata? :
1- con xcopy
2 – col setup click-once
3 – con un setup più performante di terze parti? Quale? Andrebbe bene InnoSetup?
Troppe domande vero?
Scusami ma ho acquistato e letto tanti libri ma non riesco ad avere delle indicazioni semplici e precise; in vb6 mi era tutto più chiaro e semplice.
Ciao Antonio e prima di tutto grazie per aver letto il mio blog.
L’applicazione PowerTray la trovi qui https://github.com/ermannog/PowerTray sorgenti compresi ci sto ancora lavorando, ma a breve conto di rilasciare la versione 1.0.0
Io le mie applicazioni le rilascio sempre con XCopy e cerco di svilupparle perchè possano essere distribuite così per semplificarmi il deploy, non amo troppo i setup che però sono necessari per applicazioni che necessitano di configurazioni preventive sul sistema (aggiunta di chiavi di registro, copia di file, configurazioni di sistema)… io però da sistemista preferisco se proprio devo usare Group Policy Preferences per deploy più complessi, ma questo non è un approccio praticabile in linea generale
Prima di provare altri setup di terze parti ti suggerirei di provare quello nativo per vedere se ti basta
Ciao Ermanno,
Ti sono molto grato per questo codice per la sincronizzazione della ScrollBar di due RichTextBox. Funziona perfettamente, era proprio quello che cercavo.
Grazie ancora
Un saluto