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 –