我们在使用到WINFORM窗体工作中,要求RichTextBox 加入行号;

之前有看到大牛们写的,但是太复杂繁多,而且有用双TextBox进行联动,非常不错,今天我们尝试RichTextBox +Panel相互联动如下效果.

左侧灰色为Panel,右侧为RichTextBox 控件

1:准备Panel画布如下代码,当接到文件字符后进行坐标解析,绘制行号。

 private void showLineNo()
{
//获得当前坐标信息
Point p = this.txtFileView.Location;
int crntFirstIndex = this.txtFileView.GetCharIndexFromPosition(p); int crntFirstLine = this.txtFileView.GetLineFromCharIndex(crntFirstIndex); Point crntFirstPos = this.txtFileView.GetPositionFromCharIndex(crntFirstIndex); p.Y += this.txtFileView.Height; int crntLastIndex = this.txtFileView.GetCharIndexFromPosition(p); int crntLastLine = this.txtFileView.GetLineFromCharIndex(crntLastIndex);
Point crntLastPos = this.txtFileView.GetPositionFromCharIndex(crntLastIndex); //准备画图
Graphics g = this.panel2.CreateGraphics(); Font font = new Font(this.txtFileView.Font, this.txtFileView.Font.Style); SolidBrush brush = new SolidBrush(Color.Green); //画图开始 //刷新画布 Rectangle rect = this.panel2.ClientRectangle;
brush.Color = this.panel2.BackColor; g.FillRectangle(brush, , , this.panel2.ClientRectangle.Width, this.panel2.ClientRectangle.Height); brush.Color = Color.White;//重置画笔颜色 //绘制行号 int lineSpace = ; if (crntFirstLine != crntLastLine)
{
lineSpace = (crntLastPos.Y - crntFirstPos.Y) / (crntLastLine - crntFirstLine); } else
{
lineSpace = Convert.ToInt32(this.txtFileView.Font.Size); }
int brushX = this.panel2.ClientRectangle.Width - Convert.ToInt32(font.Size * ); int brushY = crntLastPos.Y + Convert.ToInt32(font.Size * 0.21f);
for (int i = crntLastLine; i >= crntFirstLine; i--)
{ g.DrawString((i + ).ToString(), font, brush, brushX, brushY); brushY -= lineSpace;
} g.Dispose(); font.Dispose(); brush.Dispose();
}

2:事件准备(启用)如下事件

控件加载事件

 private void txtFileView_TextChanged(object sender, EventArgs e)
{
showLineNo();
}

控件滚动事件(当算出的行数大于本控件长度)

 private void txtFileView_VScroll(object sender, EventArgs e)
{
showLineNo();
}

完成后,直接启用运行,Demo事例中的效果就出来,方便大家用于各种应用上.

C# 控件 RichTextBox 显示行号,并且与Panel相互联动的更多相关文章

  1. DEV控件Grid显示行号

    DEV控件Grid的显示行号需要通过一个事件来设置,具体设置代码为: private void gridView1_CustomDrawRowIndicator(object sender, DevE ...

  2. DevExpress GridControl 显示行号、设置行号宽

    显示行号类 /// <summary> /// GridView 显示行号 设置行号列的宽度 /// </summary> /// <param name="g ...

  3. DataGridView显示行号-RowPostPaint

    DataGridView控件在显示数据时,我们有时候需要显示行号,以便检索查看方便使用. 但DataGridView默认没有设置显示行号的属性. 此时我们只要在DataGridView的RowPost ...

  4. GridView 显示行号 设置行号列的宽度

    /// <summary> /// GridView 显示行号 设置行号列的宽度 /// </summary> /// <param name="gv" ...

  5. 终于懂了:FWinControls子控件的显示是由Windows来管理,而不是由Delphi来管理(显示透明会导致计算无效区域的方式有所不同——透明的话应减少剪裁区域,所以要进行仔细计算)

    在研究TCustomControl的显示过程中,怎么样都找不到刷新FWinControls并重新显示的代码: procedure TWinControl.PaintHandler(var Messag ...

  6. 对话框上动态控件的创建、在Picture Control控件上显示图片

    1  MFC对话框之上的动态控件的创建 对话框上的控件是MFC类的一个具体对象. 当在对话框之上使用静态控件时,可以根据类向导来为每个控件添加消息.响应函数以及变量. 当需要在对话框中动态的创建某个控 ...

  7. “此网页上的某个 Web 部件或 Web 表单控件无法显示或导入。找不到该类型,或该类型未注册为安全类型。”

    自从vs装了Resharper,看见提示总是手贱的想去改掉它.于是乎手一抖,把一个 可视web部件的命名空间给改了. 喏,从LibrarySharePoint.WebPart.LibraryAddEd ...

  8. vc6.0如何显示行号以及出现版本不兼容问题

    有时编译时,提示某某行有错,但是要定位到某一行的话,如果在编辑页面能够将行号显示出来,查找也就更方便了,下面我来介绍一下让VC6.0显示行号的方法.   工具/原料   VC6.0.显示行号的插件 方 ...

  9. Row_Number()显示行号

    SELECT *, Row_Number() OVER (partition by deptid ORDER BY salary desc) rank FROM employee Row_Number ...

随机推荐

  1. charles 重写工具/rewrite Srttings

    本文参考:charles 重写工具 rewrite Srttings 重写工具/rewrite Srttings and rewrite rule 功能:在通过charles时修改请求和响应 重写工具 ...

  2. 松软科技课堂:SQL之NOTNULL约束

    SQL NOT NULL 约束 NOT NULL 约束强制列不接受 NULL 值. NOT NULL 约束强制字段始终包含值.这意味着,如果不向字段添加值,就无法插入新记录或者更新记录. 下面的 SQ ...

  3. Linux 笔记 - 第十九章 配置 Squid 正向代理和反向代理服务

    一.简介 Squid 是一个高性能的代理缓存服务器,对应中文的乌贼,鱿鱼的意思.Squid 支持 FTP,gopher 和 HTTP 协议.和一般的代理缓存软件不同,Squid 用一个单独的,非模块化 ...

  4. 使用$.getJSON()需要注意的地方

    第一 JSON文件里面不能有任何注释,不能使用单引号,必须使用双引号: 第二 JSON文件名不能使用特殊字符 -  ,比如 test-a.json 否则不会返回任何数据也不会报错. 使用方法: $.g ...

  5. CentOS 8 正式发布

    转载请注明:文章转载自 OSCHINA 社区 [http://www.oschina.net] 本文地址:https://www.oschina.net/news/110111/centos-8-re ...

  6. JS中数据类型转换

    JS中数据类型转换汇总 JS中的数据类型分为 [基本数据类型] 数字 number 字符串 string 布尔 boolean 空 null 未定义 undefined [引用数据类型] 对象 obj ...

  7. redis-自动补全

    自动补全实现方式有两种: 第一种:数据量非常小时,程序从redis中获取数据后,在程序中排序:redis只作为数据存储用: 第二种:数据量较大时,直接在redis中排序,并返回自动补全的数据. 第三种 ...

  8. 玩转 SpringBoot 2 快速整合拦截器

    概述 首先声明一下,这里所说的拦截器是 SpringMVC 的拦截器 HandlerInterceptor.使用SpringMVC 拦截器需要做如下操作: 创建拦截器类需要实现 HandlerInte ...

  9. .net core 3.0 Signalr - 01 基础篇

    因为将signalr作为单独的站点,此处需要建立两个项目,一个专门用于signalr作为推送项目,一个客户端(实际的业务项目) ## 基础知识速览 ### Clients对象属性 | 属性 | 描述 ...

  10. 基于 HTML5 WebGL 的垃圾分类系统

    前言 垃圾分类,一般是指按一定规定或标准将垃圾分类储存.分类投放和分类搬运,从而转变成公共资源的一系列活动的总称.分类的目的是提高垃圾的资源价值和经济价值,力争物尽其用.垃圾在分类储存阶段属于公众的私 ...