C# 面板滚动c上RichTextBox的自动垂直滚动#
我在C# 面板滚动c上RichTextBox的自动垂直滚动#,c#,winforms,scrollbar,richtextbox,C#,Winforms,Scrollbar,Richtextbox,我在WinForm中的面板中有一个RichTextBox。我想隐藏RichTextBox的垂直滚动条,并将其滚动与容器面板的垂直滚动条同步;每当textbox中的文本溢出时,面板的滚动条就会显示,每当我滚动面板的滚动条时,textbox就会滚动。 如何实现这一点?为了隐藏滚动条,您可以这样做 richTextBox1.ScrollBars = RichTextBoxScrollBars.None; 但问题是它会使文本扭曲。所以你也需要 richTextBox1.WordWrap = false
WinForm
中的面板中有一个RichTextBox
。我想隐藏RichTextBox
的垂直滚动条,并将其滚动与容器面板的垂直滚动条同步;每当textbox
中的文本溢出时,面板的滚动条就会显示,每当我滚动面板的滚动条时,textbox
就会滚动。
如何实现这一点?为了隐藏滚动条,您可以这样做
richTextBox1.ScrollBars = RichTextBoxScrollBars.None;
但问题是它会使文本扭曲。所以你也需要
richTextBox1.WordWrap = false;
一旦你做到了,剩下的也就不那么容易了
注册面板滚动事件,并更改富文本框上的滚动。问题是,您不能只更改richTextBox
的滚动偏移量,因此您可以使用Select
方法跳转到您需要的位置。您可以使用行的长度来了解滚动条的大小
最后,这将是一项艰难的工作。祝你好运正如我在评论中所说,我们必须处理win32消息并使用一些黑客。我已经使用了所有关于win32 message和control hack/customization的知识,在winforms
中为您制作了这个演示。它并不完整,当然也不会像RichTextBox
的标准滚动条那样完美。不足之处在于,如果一直按住箭头键,滚动条拇指将不会向右移动,但是如果正常按下箭头键,滚动条拇指将像标准滚动条一样将插入符号移动到视图中。您可以亲自尝试代码,以查看其运行情况:
public class Form1 : Form {
[DllImport("user32")]
private static extern int SendMessage(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam);
public Form1(){
InitializeComponent();
//initialize some properties for your richTextBox1 (this should be added as a child of your panel1)
richTextBox1.ScrollBars = RichTextBoxScrollBars.Horizontal;
richTextBox1.BorderStyle = BorderStyle.None;
richTextBox1.Dock = DockStyle.Top;
richTextBox1.MinimumSize = new Size(panel1.Width, panel1.Height - 2);
//initialize some properties for your panel1
panel1.AutoScroll = true;
panel1.BorderStyle = BorderStyle.FixedSingle;
//If the size of panel1 is changed, we have to update the MinimumSize of richTextBox1.
panel1.SizeChanged += (s,e) => {
richTextBox1.MinimumSize = new Size(panel1.Width, panel1.Height - 2);
};
new NativeRichTextBox() { Parent = panel1 }.AssignHandle(richTextBox1.Handle);
hidden.Parent = panel1;
}
//hidden control of panel1 is used to scroll the thumb when the KeyUp of richTextBox1 is raised.
Control hidden = new Control();
//this is used to hook into the message loop of the richTextBox1
public class NativeRichTextBox : NativeWindow
{
public Panel Parent;
protected override void WndProc(ref Message m)
{
if (m.Msg == 0x20a)//WM_MOUSEWHEEL = 0x20a
{
if (Parent != null)
{
SendMessage(Parent.Handle, m.Msg, m.WParam, m.LParam);
return;
}
}
base.WndProc(ref m);
}
}
//ContentsResized event handler of your richTextBox1
private void richTextBox1_ContentsResized(object sender, ContentsResizedEventArgs e)
{
richTextBox1.Height = e.NewRectangle.Height + 5;
}
//KeyUp event handler of your richTextBox1
private void richTextBox1_KeyUp(object sender, KeyEventArgs e)
{
Point p = richTextBox1.GetPositionFromCharIndex(richTextBox1.SelectionStart);
hidden.Top = panel1.PointToClient(richTextBox1.PointToScreen(p)).Y;
hidden.Height = (int) richTextBox1.SelectionFont.Height;
panel1.ScrollControlIntoView(hidden);
}
}
注意:您必须使用代码或设计器为您的richTextBox1
注册事件处理程序ContentsResized
和KeyUp
。您的面板只包含richTextBox1
?是的,它只有一个richTextBox1这可能是通过一些黑客操作完成的,然而,要使它像RichTextBox的真正垂直滚动条一样工作,您必须处理一些win32消息,这并不容易。例如,如果使用向上
或向下
箭头键向上或向下移动插入符号
,则滚动条拇指也应相应移动,还有一些其他情况。。。