C# RichTextBox 做简单的HTML代码编辑器 ---------左侧显示行号

说明:此显示行号为实际行号,不论是空行还是自动换行,都计算在内,跟实际IDE的行号不同,同步滚动会有半行高度以内的误差。

实现原理,在RichTextBox 编辑器左侧放置另一RichTextBox (或其它控件也可),行号为编辑器实际文字行数,滚动时计算文字滚动高度,再根据行高算出当前行大约位置,左侧自动滚动到当前行。

如果想准确的话,可以不用行,直接拿到文字滚动高度,右侧行号也滚动到相应高度即可。

        //行号 生成显示  这里rtbLineNum用的 RichTextBox,也可以用其它private void ShowLineNum(){rtbLineNum.Text = "";//计算行高,行数int linesLength = 0;var pFirst = tbEditor.GetPositionFromCharIndex(0);var pEnd = tbEditor.GetPositionFromCharIndex(tbEditor.Text.Length);if (pEnd.Y > pFirst.Y){var pSecondLine = tbEditor.GetPositionFromCharIndex(tbEditor.GetFirstCharIndexFromLine(1));var lineHeight = pSecondLine.Y - pFirst.Y;linesLength = (pEnd.Y - pFirst.Y) / lineHeight;}else{linesLength = 1;}//生成行数for (var i = 0; i < linesLength; i++){rtbLineNum.AppendText(i + 1 + "\n");}//行号右对齐rtbLineNum.SelectAll();rtbLineNum.SelectionAlignment = HorizontalAlignment.Right;}//上次滚动位置 行private int _scrollToLine = 0;//同步滚动private void SyncSrollLocation(){//首行首字符初始位置var p = new Point(1,1); //计算行高int lineHeight = 0;var pFirst = tbEditor.GetPositionFromCharIndex(0);//首行位置var pEnd = tbEditor.GetPositionFromCharIndex(tbEditor.Text.Length);//最后一行位置if (pEnd.Y > pFirst.Y)//排除只有一行的情况{var pSecondLine = tbEditor.GetPositionFromCharIndex(tbEditor.GetFirstCharIndexFromLine(1));lineHeight = pSecondLine.Y - pFirst.Y;}//滚动高度 即首行位置移动高度    int scrollHeight = p.Y - pFirst.Y;//滚动到的行的位置  由于滚动大都并非整行滚动 所以四舍五入 ***程序的误差就在这里var scrollTolineIndex = (int)Math.Round((double)(scrollHeight / lineHeight), MidpointRounding.AwayFromZero);     if (_scrollToLine != scrollTolineIndex){_scrollToLine = scrollTolineIndex;var sStart = rtbLineNum.GetFirstCharIndexFromLine(scrollTolineIndex);//左侧行号 当前滚动到行 首字符位置if (sStart >= 0){rtbLineNum.SelectionStart = sStart;rtbLineNum.SelectionLength = 0;rtbLineNum.ScrollToCaret();}}}//编辑器 Resize事件private void tbEditor_Resize(object sender, EventArgs e){ShowLineNum();SyncSrollLocation();}//编辑器 TextChanged事件private void tbEditor_TextChanged(object sender, EventArgs e){ShowLineNum();SyncSrollLocation();}//编辑器 VScroll事件private void tbEditor_VScroll(object sender, EventArgs e){SyncSrollLocation();}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/286255.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

五、文章详情页制作及跳转功能实现《iVX低代码/无代码个人博客制作》

注&#xff1a;iVX也有免费直播课《第八期直播课》 一、详情页制作 在之前的章节中&#xff0c;我们已经制作完毕了登录、注册、首页等内容&#xff0c;在这一节中&#xff0c;我们编写详情页以及详情页功能制作。 详情页页面如下&#xff1a; 详情页头部也就是一个头部栏&…

c++ 数据类型转换: static_cast dynamic_cast reinterpret_cast const_cast

c 数据类型转换&#xff1a; static_cast dynamic_cast reinterpret_cast const_cast 【版权声明】转载请注明出处 http://www.cnblogs.com/TenosDoIt/p/3175217.html【目录】 引言 static_cast 定义 dynamic_cast 定义 举例&#xff1a;下行转换&#xff08;把基类的指针或引用…

C语言试题二十八之编写函数function功能是:从字符中删除指定的字符,同一字母的大、小写按不同字符处理。

📃个人主页:个人主页 🔥系列专栏:C语言试题200例目录 💬推荐一款刷算法、笔试、面经、拿大公司offer神器 👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 编写函数f…

日用有余!国产中科方德桌面操作系统初体验

国产IT圈里最受关注的话题&#xff0c;除了芯片想必就是操作系统了。但真说起国产操作系统&#xff0c;大家是既熟悉又陌生&#xff0c;听说过的多而真正使用过的少。而伴随产业发展&#xff0c;市面上也涌现出众多国产操作软件&#xff0c;这些系统是否好用&#xff1f;能否满…

面试经验总结

8 transient是干嘛的 Java的serialization提供了一种持久化对象实例的机制。当持久化对象时&#xff0c;可能有一个特殊的对象数据成员&#xff0c;我们不想用 serialization机制来保存它。为了在一个特定对象的一个域上关闭serialization&#xff0c;可以在这个域前加上关键字…

【GIS风暴】ArcGIS栅格重采样(Resample)方法详解

Contents 1. 最邻近法(Nearest Neighbor)2. 双线性内插法(Bilinear Interpolation)3. 三次卷积法(Cubic Convolution)4. ArcGIS重采样工具(Resample)栅格/影像数据进行配准或纠正、投影等几何变换后,像元中心位置通常会发生变化,其在输入栅格中的位置不一定是整数的行…

Unhandled event loop exception PermGen space

原来一直用eclipse3.5&#xff0c;最近尝试升级到3.7和4.2&#xff0c;但不管是3.7还是4.2项目编译过程中总提示“Unhandled event loop exception PermGen space”要求退出workspace&#xff0c;与原来3.5版本比较了一下eclipse.ini参数设置发现没有差别&#xff0c;怀疑是公司…

C# RichTextBox 做简单的HTML代码编辑器 ---------利用WinApi修正左侧显示行号 误差

说明&#xff1a;通过WinApi可以准确定准滚动位置。 //行号 生成显示 这里rtbLineNum用的 RichTextBox&#xff0c;也可以用其它private void ShowLineNum(){rtbLineNum.Text "";//计算行高&#xff0c;行数int linesLength 0;var pFirst tbEditor.GetPositionFr…

Angular - - angular.element

angular.element 将DOM元素或者HTML字符串一包装成一个jQuery元素。 格式&#xff1a;angular.element(element); element&#xff1a;包装成jquery对象的html字符串或者dom元素 jqLite提供的方法&#xff1a; addClass()after()append()attr()bind() – 不支持命名空间,选择器…

六、文章详情显示及点赞实现《iVX低代码/无代码个人博客制作》

注&#xff1a;iVX也有免费直播课《第八期直播课》 一、文章详情实现 上一节我们已经完成了首页的内容显示&#xff0c;那么此时我们完成点击后跳转到详情页内容。 那么此时由于我们需要跳转到详情页需要对应的数据ID&#xff0c;那么此时还需要给首页的文章数据对象数组一个…

centos格式化xfs文件系统格式并设置自动启动挂载磁盘

文章目录 说明操作步骤 说明 非全方位资料&#xff0c;学习实践而来&#xff0c;欢迎参考学习 操作步骤 要将 /dev/sdb1 分区快速格式化为 XFS 文件系统并设置开机自动挂载&#xff0c;可以按照以下步骤进行操作&#xff1a; 查看已连接的硬盘列表&#xff0c;主要是设备名称…

System.CommandLine选项Option

前一篇简单看了一下CommandLine命令的使用&#xff0c;其实在一个命令行工具中&#xff0c;还有一个重要的点&#xff0c;那就是选项——Option&#xff0c;选项是为命提供参数&#xff0c;就好像C#中方法&#xff0c;Command就像方法&#xff0c;Option就像方法的参数&#xf…

长尾关键词如何优化

长尾关键词流量占据全站流量的80%&#xff0c;这是根据御梵景观后台数据得出来的结论&#xff0c;千万不要以为泛关键词给网站带来的流量大&#xff0c;打个比方花园设计一天带100个 流量&#xff0c;但是花园设计案例带10个&#xff0c;花园设计效果图带10个&#xff0c;花园设…

【ArcGIS风暴】ArcGIS10.6栅格计算器(Raster Calculator)用法详解

扩展阅读: 【ArcGIS风暴】ArcGIS 10.2栅格计算器实用公式大全(经典珍藏版) 【ArcGIS风暴】栅格计算器(Raster Calculator)运算出现错误问题及解决方案汇总 文章目录 1. 栅格计算器简介2. 栅格计算器用法3. 简单算术运算4. 数学函数运算5. 空间分析函数运算1. 栅格计算器简…

C语言试题二十九之编写函数int function(int lim,int aa[max])求出小于或等于lim的所有素数并放在aa数组中,该函数返回所求的素数的个数。

📃个人主页:个人主页 🔥系列专栏:C语言试题200例目录 💬推荐一款刷算法、笔试、面经、拿大公司offer神器 👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 编写函数i…

三、登录页制作《iVX低代码/无代码个人博客制作》

注&#xff1a;iVX也有免费直播课《第八期直播课》 一、登录页实现 本节需要做的登录页如下&#xff1a; 该页面我们复习可以的值&#xff0c;首先设置整个页面页面的垂直和水平对其为居中&#xff0c;随后一个容器包裹对应的登录区域&#xff0c;此时我们创建一个页面命名为…

Android ContentProvider支持跨进程数据共享与互斥、同步 杂谈

在开发中&#xff0c;假如&#xff0c;A、B进程有部分信息需要同步&#xff0c;这个时候怎么处理呢&#xff1f;设想这么一个场景&#xff0c;有个业务复杂的Activity非常占用内存&#xff0c;并引发OOM&#xff0c;所以&#xff0c;想要把这个Activity放到单独进程&#xff0c…

【C#控件详解】对话框类控件(打开文件,保存文件,选择字体和颜色)

在实际应用中,我们会用到各种各样的对话框,如打开文件,保存文件,选择字体和颜色等等。本文详细讲解C#中的颜色对话框、打开文件对话框、字体对话框、浏览文件夹对话框和保存文件对话框。 文章目录 1. ColorDialog对话框2. FolderBrowserDialog对话框3. FontDialog对话框4. …

动物界的再生一个故事

猪月薪5千&#xff0c;打算用20万建一个窝&#xff0c;老虎不允许&#xff0c;说私自建就是违章建筑&#xff0c;只允许向狼买。 狼是搞工程的&#xff0c;先用20万贿赂老虎取得开发权&#xff0c;再用50万元向老虎买这块地&#xff0c; 花10万元把猪圈盖好&#xff0c;向猪要价…

C语言试题三十之请编写函数function对长度位7个字符的字符串,除首尾字符外,将其余5个字符按ascii码降序排列。

📃个人主页:个人主页 🔥系列专栏:C语言试题200例目录 💬推荐一款刷算法、笔试、面经、拿大公司offer神器 👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 请编写函数…