2017-01-26 4 views
-1

Ich versuche, meinen Texteditor mehrere Seiten Modus das Problem ist, wenn die Richtextbox die letzte Zeile erreicht die Größe ändert und fügen Sie eine Bildlaufleiste, die nicht was ich will, machte ich ein Code die letzte Zeile des richtextbox den einen zu übertragen, die folgen, aber es wird den ganzen Text stattdessen zu bewegen und es ist irgendwie träge, jede HilfeErstellen eines Texteditors mit mehreren Seiten mit Richtextboxen

geschätzt würde

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_ zu viel Code für eine SO Frage, IMO. –

+0

Sorry noob hier – Untouchable

+0

Ich denke, das Problem ist die Verwendung des Timers, um Zeilen zu verschieben, aber IDK was sonst sollte ich vielleicht ein anderes Thread IDK seit Tagen hier stecken ... – Untouchable

Antwort

0

RichTextBox ist ein Schmerz für so etwas, denn um einen kleinen Teil des Textes mutieren zu können, h ave, um den Text zuerst auszuwählen (was er anscheinend versucht zu tun) und sicherzustellen, dass die Änderung nur diesen Text betrifft. Es ist ein wenig unangenehm auf die Speicherauslastung, aber Sie könnten besser bedient werden, indem Sie bestimmen, wie viele Zeichen Sie pro Seite wünschen und abonnieren Sie die KeyDown Event zu bestimmen, wenn Sie auf eine neue Seite wechseln. Versuchen Sie, so etwas anzupassen und sehen Sie, ob es besser funktioniert.

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: Das habe ich ganz aus dem Gedächtnis und ohne Chance, alle Ihre Code zu lesen (I abschöpfen hatte), weil ich bei der Arbeit bin.

Noch ein Vorbehalt: Ich nehme an, dass Sie Ihre RichTextBoxen in einem benutzerdefinierten "Seite" Steuerelement setzen. Wenn nicht, hoffe ich, dass mein Code Ihnen zeigt, warum Sie das möchten.

+0

Ich kann nicht die Grenze des Textes der Benutzer vorhersagen könnte mehrere Schriftarten und Größen verwenden, plus Zeilen überspringen etc .. – Untouchable

+0

Das sollte nicht mit dem oben genannten Code, dachte, möchten Sie möglicherweise auch 'Split()' auf Environment.NewLine, um die übersprungenen Zeilen zu behandeln. Das Speichern von Schriften ist jedoch eine ganz andere Geschichte. Das ist eine ganz andere Art von Information. Es kann getan werden, aber Sie könnten besser mit einem Drittanbieter-Steuerelement, das Buch-ähnliche Paging unterstützt. – CDove

Verwandte Themen