簡體   English   中英

如何在 C# 中為 RichTextBox 創建“行號條”?

[英]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 漏洞利用。

並且沒有用戶控制

正如有人向我建議的那樣,我通過使用 FastColoredTextBox 解決了我的問題。

使用 FastColoredTextBox 或 ScintillaNET – Alexander Petrov

結果是這樣的: FastColoredTextBox 示例

要創建這樣的 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM