C# 使用RichTextBox制作具有多个页面的文本编辑器

C# 使用RichTextBox制作具有多个页面的文本编辑器,c#,winforms,richtextbox,rich-text-editor,C#,Winforms,Richtextbox,Rich Text Editor,我尝试给我的文本编辑器多页模式问题是当richtextbox到达最后一行时,它会调整大小并添加一个滚动条,这不是我想要的,我编写了一个代码,将richtextbox的最后一行转移到后面的一行,但它会移动整个文本,而且有点缓慢,任何帮助都将不胜感激 公共部分类表单1:表单 { 受保护的静态bool getVisibleCrollbars(控制ctl) { int wndStyle=Win32.GetWindowLong(ctl.Handle,Win32.GWL_样式); bool-vsVisib

我尝试给我的文本编辑器多页模式问题是当richtextbox到达最后一行时,它会调整大小并添加一个滚动条,这不是我想要的,我编写了一个代码,将richtextbox的最后一行转移到后面的一行,但它会移动整个文本,而且有点缓慢,任何帮助都将不胜感激

公共部分类表单1:表单
{
受保护的静态bool getVisibleCrollbars(控制ctl)
{
int wndStyle=Win32.GetWindowLong(ctl.Handle,Win32.GWL_样式);
bool-vsVisible=(wndStyle&Win32.wsvscroll)!=0;
返回可见;
}
公共表格1()
{
初始化组件();
}
列表页=新列表();
int currentdocindex=0;
公共void AddPage()
{
RichTextBox B=新的RichTextBox();
B.大小=richTextBox1.大小;
小组1.控制。添加(B);
B.Location=新点(pages[pages.Count-1].Location.X,pages[pages.Count-1].Location.Y+richTextBox1.Height+20);
第页.添加(B);
B.选择凹痕=20;
B.选择右缩进=20;
B.输入+=新事件处理程序(richTextBox\u输入);
}
私有void richTextBox\u输入(对象发送方,事件参数e)
{
int i=0;
foreach(页面中的RichTextBox)
{
如果(框==(RichTextBox)发送方)
{
currentdocindex=i;
打破
}
i++;
}
label1.Text=(currentdocindex+1).ToString();
}
私有void Form1\u加载(对象发送方、事件参数e)
{
添加页面(richTextBox1);
richTextBox1.SelectionIndent=20;
richTextBox1.SelectionRightIndent=20;
}
私有void richTextBox1_Enter(对象发送方,事件参数e)
{
int i=0;
foreach(页面中的RichTextBox)
{
如果(框==(RichTextBox)发送方)
{
currentdocindex=i;
打破
}
i++;
}
}
bool added=false;
私有无效计时器1_刻度(对象发送方,事件参数e)
{
int correntPageIndex=currentdocindex;
if(GetVisibleCrollbars(页面[currentdocindex]))
{
如果(!已添加)
{
AddPage();
添加=真;
}
}
其他的
{
添加=错误;
}
}
if(GetVisibleCrollbars(页面[correntPageIndex]))
{
字符串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]。已选择edRTF;
pages[correntPageIndex].Text=pages[correntPageIndex].Text.Remove(LastLineStartIndex);
页面[correntPageIndex+1]。SelectionStart=0;
pages[correntPageIndex+1]。SelectedRtf=LastLineText;
}
}
}
公共类Win32
{
//窗样式值的偏移量
公共const int GWL_STYLE=-16;
//滚动条的窗口样式常量
公共常数int WS_VSCROLL=0x00200000;
公共常数int WS_HSCROLL=0x00100000;
[DllImport(“user32.dll”,SetLastError=true)]
公共静态外部intgetWindowLong(IntPtr hWnd,intnindex);

}
RichTextBox
对于这类事情来说是一件痛苦的事情,因为要改变文本的一小部分,你必须首先选择文本(看起来你正试图这样做),并确保更改只影响该文本。内存使用情况有点糟糕,但最好确定每页需要多少字符,并订阅
按键事件来确定何时移动到新页。试着适应这样的东西,看看它是否工作得更好

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放在自定义“页面”控件中。如果您没有这样做,我希望我的代码能告诉您为什么要这样做

对于一个如此复杂的问题,我的代码太多了。对不起,这里我想问题是使用计时器来移动行,但是idk我还应该使用什么呢?可能是另一个线程idk被困在这里好几天了…我无法预测文本的限制用户可能会使用多种字体和大小,加上跳过行等等。这与上述代码无关,我想您可能还需要在Environment.NewLine上执行
Split()
,以处理跳过的行。然而,存储字体是一个完全不同的故事;这是一种完全不同的信息类型。这是可以做到的,但使用支持类似书本的分页的第三方控件可能会更好。