RichTextBoxのテキストに基づいて行番号にラベルを付けるラベルがあります。ラベル付けを処理するためにVscrollのイベントをフックしました。
private void rtbLogicCode_VScroll(object sender, EventArgs e)
{
Point pt = new Point(0, 1);
int firstIndex = rtbLogicCode.GetCharIndexFromPosition(pt);
int firstLine = rtbLogicCode.GetLineFromCharIndex(firstIndex);
pt.X = ClientRectangle.Width;
pt.Y = ClientRectangle.Height;
int lastIndex = rtbLogicCode.GetCharIndexFromPosition(pt);
int lastLine = rtbLogicCode.GetLineFromCharIndex(lastIndex);
// Small correction
if (rtbLogicCode.Text.EndsWith("\n"))
lastLine++;
labelLogicCode.ResetText();
LabelLineNum(firstLine+1,lastLine);
}
#endregion
private void LabelLineNum(int startNum, int lastNum)
{
labelLogicCode.Font = UIConstant.DDCLogicCodeFont;
for (int i = startNum; i < lastNum; i++)
{
labelLogicCode.Text += i + Environment.NewLine;
}
}
RichTextBoxがスムーズスクロール機能を使用していることを除いて、すべてが正常に機能しているようです。この機能は、ユーザーが次の行までスクロールしていない場合に、多くの場合、行番号を台無しにします。これにより、行番号がRichTextBoxに表示される実際のテキストと同期されなくなります。
最後に、これを実現するには、スムーズスクロール機能を無効にする必要があります。RichTextBoxのpostMessageAPIをオーバーライドして、前述の機能を無効にできると言われましたが、多くのドキュメントを検索したところ、適切なドキュメントが見つかりませんでした。
スムーズスクロール機能を無効にする方法について、可能な限り詳細な解決策をいただければ幸いです。ありがとう。