使用richtextbox

时间:2017-01-26 14:50:06

标签: c# winforms richtextbox rich-text-editor

我试图给我的文本编辑器多页模式问题是当richtextbox到达它调整大小的最后一行并添加一个不是我想要的滚动条时,我做了一个代码来传输richtextbox的最后一行对于后面的那个,但它正在移动整个文本而且它有点迟钝,任何帮助都会受到赞赏

 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);
        }

1 个答案:

答案 0 :(得分:0)

RichTextBox对于这类事情是一种痛苦,因为要改变一小部分文本,你必须先实际选择文本(它似乎是你试图做的)并确保改变只会影响那个文字。对内存使用情况有点讨厌,但通过确定每页需要多少个字符并订阅KeyDown Event来确定何时移动到新页面,可能会更好。尝试适应这样的事情,看看它是否更好。

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();
         }
}

警告:我完全是从记忆中完成的,没有机会阅读你的所有代码(我不得不浏览)因为我在工作。

另一个警告:我假设您将RichTextBox放在自定义“页面”控件中。如果你没有,我希望我的代码告诉你为什么你可能想要。