2012-08-07 78 views
1

我編寫的代碼將文本顯示在單獨的頁面中,如Microsoft Word,我使用文本框集合,並且當用戶填充一個文本框時,將自動顯示新框,並且光標移向她。在RichTextBox中禁用滾動(c#)

問題是,當用戶在文本框中寫入最後一行時,該框會向下滾動一點,您將看到何時會運行此代碼,所以如何禁用滾動。

代碼:

 using System; 
     using System.Collections.Generic; 
     using System.ComponentModel; 
     using System.Data; 
     using System.Drawing; 
     using System.Linq; 
     using System.Text; 
     using System.Windows.Forms; 
     using System.Runtime.InteropServices; 

     namespace WindowsFormsApplication1 
     { 
      public partial class Form1 : Form 
      { 
       List<myRTB> pages; // collection of our RichTextBox, use as pages 

       public Form1() 
       { 
        InitializeComponent(); 

        pages = new List<myRTB>(); 
        pages.Add(new myRTB()); 
        pages[0].Width = 200; 
        pages[0].Height = 290; 
        pages[0].Location = new Point(50, 10); 
        pages[0].Name = "0"; 
        this.Controls.Add(pages[0]); 

        this.Width = 300; 
        this.Height = 360; 
        this.AutoScroll = true; 
       } 

       public void AddPage(int correntPageIndex) 
       { 
        if (correntPageIndex == (pages.Count - 1)) 
        { 
         // create a new page 
         pages.Add(new myRTB()); 
         pages[correntPageIndex + 1].Width = 200; 
         pages[correntPageIndex + 1].Height = 290; 
         pages[correntPageIndex + 1].Location = new Point(50, pages[correntPageIndex].Location.Y + 300); 
         this.Controls.Add(pages[pages.Count - 1]); 
         this.Name = (correntPageIndex + 1).ToString(); 
        } 

        bool CursorInEnd = (pages[correntPageIndex].SelectionStart == pages[correntPageIndex].TextLength); 

        // Transfer the last word on the previous page, to the new page 

        int lastLineIndex = pages[correntPageIndex].GetLineFromCharIndex(pages[correntPageIndex].TextLength - 2); 
        // find the index of the first char in the last line 
        int indexOfFirstCharInLastLine = pages[correntPageIndex].GetFirstCharIndexFromLine(lastLineIndex); 
        // find the index of the last space in the last line 
        int indexOfLastSpace = pages[correntPageIndex].Text.LastIndexOf(' ', indexOfFirstCharInLastLine); 

        string restOfString; 

        if (indexOfLastSpace < 0) // no spaces in the last line 
        { 
         restOfString = pages[correntPageIndex].Text.Substring(pages[correntPageIndex].TextLength - 1); 
         pages[correntPageIndex + 1].Text.Insert(0, restOfString); 
         pages[correntPageIndex].Text.Remove(pages[correntPageIndex].TextLength - 1); 
        } 
        else // there is spaces in the last line 
        { 
         restOfString = pages[correntPageIndex].Text.Substring(indexOfLastSpace + 1); 
         pages[correntPageIndex + 1].Text = pages[correntPageIndex + 1].Text.Insert(0, restOfString); 
         pages[correntPageIndex].Text = pages[correntPageIndex].Text.Remove(indexOfLastSpace + 1); 
        } 

        if (CursorInEnd) 
        { 
         // Move the cursor to next page 
         pages[correntPageIndex + 1].SelectionStart = restOfString.Length; 
         pages[correntPageIndex + 1].Focus(); 
        } 
       } 
      } 

      class myRTB : RichTextBox 
      { 
       public myRTB() 
       { 
        this.ScrollBars = RichTextBoxScrollBars.None; 
       } 
       protected override void WndProc(ref Message m) 
       { 
        // catch the request resize message 
        if (m.Msg == (WM_REFLECT | WM_NOTIFY)) 
        { 
         REQRESIZE rrs = (REQRESIZE)(Marshal.PtrToStructure(m.LParam, typeof(REQRESIZE))); 
         if (rrs.nmhdr.code == EN_REQUESTRESIZE) 
         { 
          if (rrs.rc.ToRectangle().Height > this.ClientRectangle.Height) 
          { 
           ((Form1)Parent).AddPage(int.Parse(this.Name)); 
          } 
         } 
        } 
        base.WndProc(ref m); 
       } 

       [StructLayout(LayoutKind.Sequential)] 
       public struct NMHDR 
       { 
        public IntPtr HWND; 
        public uint idFrom; 
        public int code; 
        public override String ToString() 
        { 
         return String.Format("Hwnd: {0}, ControlID: {1}, Code: {2}", 
         HWND, idFrom, code); 
        } 
       } 

       [StructLayout(LayoutKind.Sequential)] 
       public struct REQRESIZE 
       { 
        public NMHDR nmhdr; 
        public RECT rc; 
       } 

       [StructLayout(LayoutKind.Sequential)] 
       public struct RECT 
       { 
        public int Left, Top, Right, Bottom; 
        public override string ToString() 
        { 
         return String.Format("{0}, {1}, {2}, {3}", Left, Top, Right, 
         Bottom); 
        } 
        public Rectangle ToRectangle() 
        { 
         return Rectangle.FromLTRB(Left, Top, Right, Bottom); 
        } 
       } 

       public const int WM_USER = 0x400; 
       public const int WM_NOTIFY = 0x4E; 
       public const int WM_REFLECT = WM_USER + 0x1C00; 
       public const int EN_REQUESTRESIZE = 0x701; 

      } 
     } 

回答

0

要確保文本不自動滾動,看看下面的回答類似的問題。

Disabling RichTextBox autoscroll

這裏是另一個偉大的回答你的問題:

Prevent Autoscrolling in RichTextBox

我複製從上面的鏈接代碼,請確保給用戶信用提供驗證碼(它不是mine)

[System.Runtime.InteropServices.DllImport("user32.dll")] 

    static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, Int32 wParam, Int32 lParam); 
    const int WM_USER = 0x400; 
    const int EM_HIDESELECTION = WM_USER + 63; 

    void OnAppend(string text)  
    {   
    bool focused = richTextBox1.Focused; 
    //backup initial selection 
    int selection = richTextBox1.SelectionStart;   
    int length = richTextBox1.SelectionLength;   
    //allow autoscroll if selection is at end of text   
     bool autoscroll = (selection==richTextBox1.Text.Length); 
     if (!autoscroll)   
     { 
     //shift focus from RichTextBox to some other control    
     if (focused) 
      textBox1.Focus();    
     //hide selection    
     SendMessage(richTextBox1.Handle, EM_HIDESELECTION, 1, 0); 
     }   

     richTextBox1.AppendText(text); 

     if (!autoscroll)   
     {    
     //restore initial selection    
     richTextBox1.SelectionStart = selection;    
     richTextBox1.SelectionLength = length;    
     //unhide selection    
     SendMessage(richTextBox1.Handle, EM_HIDESELECTION, 0, 0);    
     //restore focus to RichTextBox    
     if(focused) richTextBox1.Focus();   
     }  
    } 
+0

在我的例子中,我已經寫了** this.ScrollBars = RichTextBoxScrollBars.None; **它使得滾動條不是顯示,但文本框仍在滾動。 – user1543998 2012-08-07 11:44:27

+0

對不起,錯過了非常重要的一行代碼:)我更新了我的答案,我認爲它會幫助你。 – Dayan 2012-08-07 12:22:40

+0

但鍵入後,如果將光標移動到第一頁上的最後一行,則文本框向下滾動一下,並在該行下顯示一個空格。 – user1543998 2012-08-07 13:55:50