RichTextBox类有几个帮助器方法,可以让你发现文本在窗口中的位置。这是你需要在这里使用的,因为你不再有滚动条的直接反馈。
您可以找到该线显示为RichTextBox.GetCharIndexFromPosition()来找到第一个可见字符)的第一个可见行,其次是GetLineFromCharIndex(找出包含字符行:
public static double GetVerticalScrollPos(RichTextBox box) {
int index = box.GetCharIndexFromPosition(new Point(1, 1));
int topline = box.GetLineFromCharIndex(index);
int lines = box.Lines.Length;
return lines == 0 ? 0 : 100.0 * topline/lines;
}
可以通过查看插入符当前位于哪一行来找到水平滚动位置。和映射线的起点回到位置:
public static double GetHorizontalScrollPos(RichTextBox box) {
int index = box.SelectionStart;
int line = box.GetLineFromCharIndex(index);
int start = box.GetFirstCharIndexFromLine(line);
Point pos = box.GetPositionFromCharIndex(start);
return 100 * (1 - pos.X)/box.ClientSize.Width;
}
您可能需要重新定义什么100%的方式,你原来的问题没有给予任何指导。
这个问题有一个XY Problem的方面,它闻到你真的想要做的是将滚动条替换为更大的滚动条。不要忽视愚蠢的简单解决方案,你可以通过正确放置你的正确方式覆盖现有的解决方案,使它们重叠并隐藏它们。你只需要改变边界,所以它不是那么明显。
感谢这看起来很有前途,但我仍然得到零后返回point.X或point.Y,即使滚动条已启用。我将WM_USER更改为1024 - 是吗?我还添加了以下几行:'[DllImport(“User32.Dll”]'和'static extern bool SendMessage(IntPtr hWnd,uint msg,IntPtr wParam,IntPtr lParam);'。是不是也可以? –
是的,WM_USER和DllImport但是为什么你仍然会得到零呢?我已经在发布前测试了这个代码,对我来说工作得很好。如果我能看到你的代码,那将是非常棒的。你还必须发布'ptr'(在代码中添加代码)。 – user3449857
我的不好意思,我不小心在DllImport位中有'EntryPoint =“PostMessageA”'我以为我早些时候删除了它,但也许其他的东西出了问题,于是我解开了那个删除,之后忘了它。是你的 - 非常感谢你!:D –