2017-01-26 4 views
-1

je suis en train de donner mon éditeur de texte en mode plusieurs pages, le problème est lorsque le richtextbox atteint la dernière ligne redimensionne et ajouter une barre de défilement qui est pas ce que je veux, je l'ai fait une code pour transférer la dernière ligne du richtextbox à celui qui suit, mais il se déplace tout le texte à la place et il est un peu lent, toute aide serait appréciéeCréation d'un éditeur de texte avec plusieurs pages à l'aide richtextboxes

public partial class Form1 : Form 
 
     { 
 
      protected static bool GetVisibleScrollbars(Control ctl) 
 
      { 
 
       int wndStyle = Win32.GetWindowLong(ctl.Handle, Win32.GWL_STYLE); 
 
       bool vsVisible = (wndStyle & Win32.WS_VSCROLL) != 0; 
 

 
       return vsVisible; 
 
      } 
 
      public Form1() 
 
      { 
 
       InitializeComponent(); 
 
      } 
 
      List<RichTextBox> pages=new List<RichTextBox>(); 
 
      int currentdocindex = 0; 
 
      
 
      public void AddPage() 
 
      { 
 

 
       RichTextBox B = new RichTextBox(); 
 
       B.Size = richTextBox1.Size; 
 
       panel1.Controls.Add(B); 
 
       B.Location = new Point(pages[pages.Count - 1].Location.X, pages[pages.Count - 1].Location.Y + richTextBox1.Height + 20); 
 
       pages.Add(B); 
 
       B.SelectionIndent = 20; 
 
       B.SelectionRightIndent = 20; 
 
       B.Enter += new EventHandler(richTextBox_Enter); 
 
       
 
    } 
 
      private void richTextBox_Enter(object sender, EventArgs e) 
 
      { 
 

 
       int i = 0; 
 
       foreach (RichTextBox box in pages) 
 
       { 
 
        if (box == (RichTextBox)sender) 
 
        { 
 
         currentdocindex=i; 
 
         break; 
 
        } 
 
        i++; 
 
       } 
 
       label1.Text = (currentdocindex + 1).ToString(); 
 
      } 
 

 
      private void Form1_Load(object sender, EventArgs e) 
 
      { 
 
       pages.Add(richTextBox1); 
 
       richTextBox1.SelectionIndent = 20; 
 
       richTextBox1.SelectionRightIndent = 20; 
 
       
 
      } 
 

 
      private void richTextBox1_Enter(object sender, EventArgs e) 
 
      { 
 
       int i = 0; 
 
       foreach (RichTextBox box in pages) 
 
       { 
 
        if(box==(RichTextBox)sender) 
 
        { 
 
         currentdocindex=i; 
 
         break; 
 
        } 
 
        i++; 
 
       } 
 
    } 
 

 
      bool added = false; 
 
      
 

 
      private void timer1_Tick(object sender, EventArgs e) 
 
      { 
 
       
 
        int correntPageIndex = currentdocindex; 
 
       if (GetVisibleScrollbars(pages[currentdocindex])) 
 
       { 
 
        if (!added) 
 
        { 
 
         AddPage(); 
 
         added = true; 
 
        } 
 
       } 
 
       else 
 
       { 
 
     
 
       added = false; 
 
        
 
        } 
 
       } 
 
       
 
       if(GetVisibleScrollbars(pages[correntPageIndex])) 
 
       { 
 

 
        string LastLineText = pages[correntPageIndex].Lines[pages[correntPageIndex].Lines.Count() - 1]; 
 
        int LastLineStartIndex = pages[correntPageIndex].Text.LastIndexOf(LastLineText); 
 
        pages[correntPageIndex].SelectionStart = LastLineStartIndex; 
 
        pages[correntPageIndex].SelectionLength = pages[correntPageIndex].Text.Length - 1; 
 
        LastLineText = pages[correntPageIndex].SelectedRtf; 
 
        pages[correntPageIndex].Text = pages[correntPageIndex].Text.Remove(LastLineStartIndex); 
 
        pages[correntPageIndex + 1].SelectionStart = 0; 
 
        pages[correntPageIndex+1].SelectedRtf = LastLineText; 
 
       } 
 
         } 
 
     } 
 
     public class Win32 
 
     { 
 
      // offset of window style value 
 
      public const int GWL_STYLE = -16; 
 

 
      // window style constants for scrollbars 
 
      public const int WS_VSCROLL = 0x00200000; 
 
      public const int WS_HSCROLL = 0x00100000; 
 

 
      [DllImport("user32.dll", SetLastError = true)] 
 
      public static extern int GetWindowLong(IntPtr hWnd, int nIndex); 
 
     }

+0

_Way_ trop de code pour une question SO, IMO. –

+0

Noob Désolé ici – Untouchable

+0

je pense que le problème est d'utiliser le minuteur pour déplacer les lignes, mais idk quoi d'autre peut-être devrais-je utiliser un autre thread idk été coincé ici pendant plusieurs jours ... – Untouchable

Répondre

0

RichTextBox est une douleur pour ce genre de chose, parce que pour muter une petite partie du texte que vous h Vous devez d'abord sélectionner le texte en premier (ce que vous essayez de faire) et vous assurer que le changement n'affecte que ce texte. C'est un peu méchant sur l'utilisation de la mémoire, mais vous pourriez être mieux servi en déterminant combien de caractères vous voulez par page et en vous abonnant au KeyDown Event pour déterminer quand vous passez à une nouvelle page. Essayez d'adapter quelque chose comme ceci et voyez si cela fonctionne mieux.

public void MyKeyDownHandler(object sender, System.Windows.Forms.KeyEventArgs e) 
{ 
     if(this.CurrentPageControl.RTB.Text.Length >= MY_LIMITING_CONSTANT_I_SET) 
     { 
      MyPageUserControl mpuc = new MyPageUserControl();    
      mpuc.RTB.Text = this.CurrentPageControl.RTB.Text.Split(' ').Last(); 
      thePageCollectionIPresumeYouHave.Add(mpuc); 
      this.CurrentPageControl = thePageCollectionIPresumeYouHave.Last(); 
      mpuc.RTB.Focus(); 
     } 
} 

caveat: Je l'ai fait entièrement de mémoire et sans la possibilité de lire tout votre code (je devais écrémé) parce que je suis au travail.

Une autre caveat: Je suppose que vous mettez vos RichTextBoxes dans une coutume « page » commande. Si vous n'avez pas, j'espère que mon code vous montre pourquoi vous pourriez vouloir.

+0

je ne peux pas prédire la limite du texte que l'utilisateur peut-être utiliser plusieurs polices et tailles, plus les lignes de saut, etc. – Untouchable

+0

Cela ne devrait pas avoir d'importance avec le code ci-dessus, pensé que vous pouvez aussi 'Split()' sur Environment.NewLine pour gérer les lignes sautées. Stocker des polices, cependant, est une histoire très différente; c'est un type d'information totalement différent. Cela peut être fait, mais vous pourriez être mieux avec un contrôle tiers qui prend en charge la pagination de type livre. – CDove