2010-11-25 10 views
-1

Je déteste deux richTextBoxs.Deux problèmes avec les barres de défilement en C#

J'ai deux problèmes:

  1. peu importe comment je définir la barre de défilement - il n'apear pas. si j'écris plus que la longueur de la ligne - le curseur va à la ligne ci-dessous - je veux que tout soit inscrit dans la même rangée et que l'utilisateur puisse se déplacer à droite et à gauche avec la barre de défilement.

  2. Je souhaite qu'une barre de défilement contrôle les deux zones richtext. un horizontal pour les deux, et un vertical pour les deux.

+1

Pouvez-vous poster votre code? – Oded

+0

Et peut-être une capture d'écran de votre interface? Je n'arrive pas à visualiser la suite de votre deuxième requête. –

+0

WPF ou Windows Forms? – decyclone

Répondre

2
  1. Vous devrez définir la propriété MultiLine false (la valeur par défaut est vrai pour RichTextBoxes) si vous voulez juste une ligne, ou définissez d'autre la propriété WordWrap à faux (cela aussi par défaut à true) .
  2. Je suppose que vous devrez gérer les événements HScroll et VScroll de chaque RichTextBox et, dans les gestionnaires d'événements, faire défiler l'autre zone de texte du même montant. Je ne sais pas comment cela serait facile, mais ...
+0

+1 pour être plus rapide que moi (et correct) ;-) –

+0

Le wordwrap wored - merci :) Je me suis dit autant sur la scorlling mutuelle, mais comme vous l'avez dit - ce n'est pas Eazy. – Yarden

+0

@Yarden - si cette réponse résout votre problème, marquez-le comme accepté en cliquant sur la coche - sous la flèche vers le bas par le score de la réponse. Merci! –

0

La meilleure façon de résoudre votre second problème est d'utiliser GetScrollInfo et SetScrollInfo. Je pense que vous devriez être en mesure de gérer les événements HScroll et VScroll, quand ils se déclenchent, vous devrez définir le nouveau ScrollInfo dans la deuxième RichTextBox.

Vous aurez également besoin de WM_SendMessage pour ce travail. (Toutes les usuable avec les importations de User32.dll)

travail habituel à faire:

S'informer lorsque l'utilisateur fait défiler (Scrollevents), et le nouveau réglage SCROLLINFO à la deuxième RichTextBox. Après avoir défini ScrollInfo, vous devez envoyer un message à la barre de défilement/contrôle pour faire défiler.

tout d'abord vous avez besoin de votre "propre" SCROLLINFO struct

[StructLayout(LayoutKind.Sequential)] 
    struct SCROLLINFO 
    { 
     public uint cbSize; 
     public uint fMask; 
     public int nMin; 
     public int nMax; 
     public uint nPage; 
     public int nPos; 
     public int nTrackPos; 
    } 

obtenir ensuite le SCROLLINFO à ScrollingEvent dans la première zone de texte:

GetScrollInfo(this.Handle, SB_VERT, ref _si); 

(où _Si est votre SCROLLINFO instance). Ensuite, envoyez le message à la barre de défilement

_si.nPos = 0815; //Your wanted new ScrollbarPosition (I think you can use the value of the first Scrollbar) 
       //// Reposition scroller 
       SetScrollInfo(Handle, SB_VERT, ref _si, true); 

       //// Send a WM_VSCROLL scroll message using SB_THUMBTRACK as wParam 
       //// SB_THUMBTRACK: low-order word of wParam, si.nPos high-order word of wParam 

       IntPtr ptrWparam = new IntPtr(SB_THUMBTRACK + 0x10000 * _si.nPos); 
       IntPtr ptrLparam = new IntPtr(0); 
       SendMessage(Handle, WM_VSCROLL, ptrWparam, ptrLparam);  

HANDLE est la poignée de votre RichTextBox qui doit être fait défiler - vous pouvez obtenir la poignée à tout moment en utilisant

RichTextBox.Handle 

Vous devriez vraiment jeter un oeil à http://msdn.microsoft.com/en-us/library/bb787537%28VS.85%29.aspx et http://msdn.microsoft.com/en-us/library/ms644950%28VS.85%29.aspx

Il y a aussi quelques bons exemples à pinvoke.net (par exemple GetScrollInfo)