2012-08-07 49 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