热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

c#richtextbox转html,C#RichTextBox输入内容转自定义样式图像

此类功能网上很多例子,但转换效果极差,基本看不成。最近用到了这项功能,就写了一个示例。本示例可将rtf内部文字和标准图像转换为自己可以设定

此类功能网上很多例子,但转换效果极差,基本看不成。最近用到了这项功能,就写了一个示例。

本示例可将rtf内部文字和标准图像转换为自己可以设定的字体效果和大小的图像。

21a995e9cca9502d7e4d0bb5815d52af.png

原理:

在自定义的RichTextBox组件输入文字和图像,对每个文字和图像建立坐标和内容

图像:

public class ImageStruct

{

public Point Img_Point;

public int Img_Location;

public Bitmap Img;

public ImageStruct(Point _point, int _location, Bitmap _img)

{

Img_Point = _point;

Img_Location = _location;

Img = _img;

}

}

public List ImageList = new List();

文字:

public class ContentStruct

{

public Point Content_Point;

public string Content_Text;

public ContentStruct(Point _point, string _text)

{

Content_Point = _point;

Content_Text = _text;

}

}

public List ContentList = new List();

转换时,在程序内部建立一个临时的RichTextBox组件(自定宽度,高度会自动计算),装入输入内容,

并计算自适应宽度和高度,然后取得临时RichTextBox内部文字、图像坐标,在一副bitmap上按照坐标绘制文字和图像。

绘制文字使用SQK_Ui.DLL,源码在http://www.haolizi.net/example/view_14426.html,修改源码可调节文字阴影透明度等,

也可以自行搜索DrawStrng用法。

///

/// Rtf 转 图像

///

/// Rtf 内容

/// 图像宽度

/// 每个中文文字的宽度

/// 每个英文文字的宽度

/// 包含的固定样式图像的大小-宽度高度相同

/// 文字的颜色

///

private Bitmap RtfToBitmap (string Rtf_Message, int _width, int ch_Width, int en_Width, int img_Width, Color TextColor)

{

RichTextEx Rich_tmp = new RichTextEx() // 临时Richbox 取得全部内容,重新设置字体

{

WordWrap = true,

ScrollBars = RichTextBoxScrollBars.None,

BorderStyle = BorderStyle.None,

Height = 10

};

Rich_tmp.Rtf = Rtf_Message;

Rich_tmp.SelectAll();

Rich_tmp.SelectionColor = Color.FromArgb(255, 255, 255);

Rich_tmp.SelectionFont = font;

int havePic = Regex.Matches(Rich_tmp.Rtf, "Paint.Picture").Count; // 取得包含图像的数量

MatchCollection haveTxt = Regex.Matches(Rich_tmp.Text, @"[\u4e00-\u9fa5]", RegexOptions.IgnoreCase | RegexOptions.Singleline); // 取得包含中文的数量

int haveEn = Rich_tmp.Text.Length - haveTxt.Count; // 取得英文、数字、符号的数量

if ((haveTxt.Count * ch_Width havePic * img_Width haveEn * en_Width) > _width) // 超过限定宽度,为设定的宽度

{

Rich_tmp.Width = _width;

}

else // 没超过限定,为实际宽度

{

Rich_tmp.Width = haveTxt.Count * ch_Width havePic * img_Width haveEn * en_Width;

}

CSetLineSpace.SetLineSpace(Rich_tmp, 390); // 设定行间距

Rich_tmp.updata(); // 刷新

if (Rich_tmp.Lines.Length > 1) //如果有多行,获取行字数最多数的行,设置为图像宽度

{

RichTextEx Rich_branch = new RichTextEx()

{

WordWrap = true,

ReadOnly = true,

BorderStyle = BorderStyle.None,

ScrollBars = RichTextBoxScrollBars.None,

Text = Rich_tmp.Text

};

for (int t = 0; t

{

Rich_branch.Text = Rich_branch.Text.Remove(Rich_tmp.ImageList[t].Img_Location, 1);

Rich_branch.Text = Rich_branch.Text.Insert(Rich_tmp.ImageList[t].Img_Location, "♐");

}

MatchCollection haveZh, haveImg;

int maxlen = 0, exchange;

for (int i = 0; i

{

haveZh = Regex.Matches(Rich_branch.Lines[i], @"[\u4e00-\u9fa5]", RegexOptions.IgnoreCase | RegexOptions.Singleline); // // Rtf内部中文数量

haveImg = Regex.Matches(Rich_branch.Lines[i], @"♐", RegexOptions.IgnoreCase | RegexOptions.Singleline); // Rtf内部图像的数量

exchange = (Rich_branch.Lines[i].Length - haveZh.Count - haveImg.Count) * en_Width haveZh.Count * ch_Width haveImg.Count * img_Width; // // Rtf内部英文、符号数量

if (exchange > _width)

{

maxlen = _width;

break;

}

if (maxlen

}

Rich_tmp.Width = maxlen;

Rich_branch.Dispose();

}



推荐阅读
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • ASP.NET2.0数据教程之十四:使用FormView的模板
    本文介绍了在ASP.NET 2.0中使用FormView控件来实现自定义的显示外观,与GridView和DetailsView不同,FormView使用模板来呈现,可以实现不规则的外观呈现。同时还介绍了TemplateField的用法和FormView与DetailsView的区别。 ... [详细]
  • 使用圣杯布局模式实现网站首页的内容布局
    本文介绍了使用圣杯布局模式实现网站首页的内容布局的方法,包括HTML部分代码和实例。同时还提供了公司新闻、最新产品、关于我们、联系我们等页面的布局示例。商品展示区包括了车里子和农家生态土鸡蛋等产品的价格信息。 ... [详细]
  • 带添加按钮的GridView,item的删除事件
    先上图片效果;gridView无数据时显示添加按钮,有数据时,第一格显示添加按钮,后面显示数据:布局文件:addr_manage.xml<?xmlve ... [详细]
  • 正则表达式及其范例
    为什么80%的码农都做不了架构师?一、前言部分控制台输入的字符串,编译成java字符串之后才送进内存,比如控制台打\, ... [详细]
  • 2.ElasticSearch练习索引 : sms-logs-index类型:sms-logs-type   数据导入部分PUTsms_logs_indexsms_logs_typ ... [详细]
  • 本篇文章为大家展示了input语句的作用有哪些,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。HTML标签 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • 本文介绍了在处理不规则数据时如何使用Python自动提取文本中的时间日期,包括使用dateutil.parser模块统一日期字符串格式和使用datefinder模块提取日期。同时,还介绍了一段使用正则表达式的代码,可以支持中文日期和一些特殊的时间识别,例如'2012年12月12日'、'3小时前'、'在2012/12/13哈哈'等。 ... [详细]
  • 在一对一直播源码使用过程中,有时会出现软键盘切换闪屏问题,就是当切换表情的时候屏幕会跳动,因此要对一对一直播源码表情面板无缝切换进行优化。 ... [详细]
  • javaftp上传,javaftp下载文件
    本文目录一览:1、javaftp上传5G以上大文件,怎么做 ... [详细]
  • 一、正则表达式1、match()方法调用match()方法可在字符串内检索指定的值,这个校验方法有点类似于数组字符串的和`lastIndexOf()match()`返回两种结果:1 ... [详细]
author-avatar
荣清右
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有