[英]How do I create a “line number strip” to a RichTextBox in C#?
想象一下,我有一個帶有 3 行的簡單 RichTextBox。
每行都說“行”,然后是行號。
我真正要問的是在 RichTextBox 的左側和我輸入的每一行上做一個條帶,一個新的 label 會彈出新的行號,直到它到達底部。
這與我想要實現的目標非常接近: https://i.ibb.co/3dQM2Pc/Ey-p.png 。 這是為了我正在制作的 Roblox 漏洞利用。
並且沒有用戶控制
要創建這樣的 RichTextBox,您可以通過自定義用戶控件來實現。 以下是您可以參考的步驟。 首先,您需要在用戶控件中添加一個面板(顯示行號)和一個 RichTextBox。
然后您可以在“UserControl.cs”中嘗試以下代碼。
private void richTextBox1_TextChanged(object sender, EventArgs e)
{
showLineNo();
}
private void richTextBox1_VScroll(object sender, EventArgs e)
{
showLineNo();
}
private void showLineNo()
{
// get current location
Point p = this.richTextBox1.Location;
int crntFirstIndex = this.richTextBox1.GetCharIndexFromPosition(p);
int crntFirstLine = this.richTextBox1.GetLineFromCharIndex(crntFirstIndex);
Point crntFirstPos = this.richTextBox1.GetPositionFromCharIndex(crntFirstIndex);
p.Y += this.richTextBox1.Height;
int crntLastIndex = this.richTextBox1.GetCharIndexFromPosition(p);
int crntLastLine = this.richTextBox1.GetLineFromCharIndex(crntLastIndex);
Point crntLastPos = this.richTextBox1.GetPositionFromCharIndex(crntLastIndex);
// Set brush
Graphics g = this.panel1.CreateGraphics();
Font font = new Font(this.richTextBox1.Font, this.richTextBox1.Font.Style);
SolidBrush brush = new SolidBrush(Color.Green);
Rectangle rect = this.panel1.ClientRectangle;
brush.Color = this.panel1.BackColor;
g.FillRectangle(brush, 0, 0, this.panel1.ClientRectangle.Width, this.panel1.ClientRectangle.Height);
brush.Color = Color.Black;
// Draw line number
int lineSpace = 0;
if (crntFirstLine != crntLastLine)
{
lineSpace = (crntLastPos.Y - crntFirstPos.Y) / (crntLastLine - crntFirstLine);
}
else
{
lineSpace = Convert.ToInt32(this.richTextBox1.Font.Size);
}
int brushX = this.panel1.ClientRectangle.Width - Convert.ToInt32(font.Size * 3);
int brushY = crntLastPos.Y + Convert.ToInt32(font.Size * 0.21f);
for (int i = crntLastLine; i >= crntFirstLine; i--)
{
g.DrawString((i + 1).ToString(), font, brush, brushX, brushY);
brushY -= lineSpace;
}
g.Dispose();
font.Dispose();
brush.Dispose();
}
測試結果,
希望這可以幫到你。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.