Arcgis Engine开发将ttf格式的符号通过字符标记符号接口显示出来
来源:互联网 发布:nginx的特点 编辑:程序博客网 时间:2024/05/17 02:32
[资源共享] 显示字体文件(ttf格式)中的符号并自定义配置点状符号
字体文件可以储存文字、图片等符号,通过ArcMap的符号配置工具可以使用字体文件(ttf格式)中包含的图片或符号。在Arc Engine中,也可以使用ICharacterMarkerSymbol接口根据字体文件生成对应的符号,通过ICharacterMarkerSymbol.CharacterIndex属性,设置符号对应的unicode可以生成对应的字体符号。但在实际应用中,用户是不可能知道符号与unicode编码的映射关系。因此,需要将ttf文件中的符号以图形化的方式显示出来,让用户自主选择生成ICharacterMarkerSymbol对象。本文将介绍读取ttf文件中符号及绘制方法,并最终生成CharacterMarkerSymbol。
一、字体文件(ttf)的格式
Ttf文件的结构共包括四部分,字体头、位置索引、图元数据和图元指令。在我们上述的讨论中,我们只需要关注字体头部分,就可以满足我们的要求。(详细信息请参考:http://venrar.blog.163.com/blog/static/60699459200881102648855/)
通过调用Win32 API 函数:GetFontUnicodeRanges,我们可以获得支持的图元的数量、支持的UNICODE区域的数量以及设备上下文中字体的这些区域的详细信息,上述信息以GLYPHSET结构返回。 GetFontUnicodeRanges函数通常需要调用两 次。第一次调用时得到以NULL指针作为最后一个参数,GDI会返回所需内存的大小。调用者然后分配所需的内存,再次调用以得到真正的数据。下面是C#里调用该函数的方法:
首先定义一个FontRange对象:
然后调用GetFontUnicodeRanges函数返回,下面是获取字体范围的关键方法,完整代码见附件。
二、符号绘制
符号绘制的关键是我们如何根据获得的Unicode值绘制对应的符号。有两种方式可以实现:
1、 将Unicode赋值给ICharacterMarkerSymbol.CharacterIndex ,生成CharacterMarkerSymbol对象,然后通过ISymbol.Draw方法将符号绘制到窗体上;
2、 使用.Net里的Graphics.DrawString()方法将符号绘制到窗体上。
这两种方法效果类似,但第一种方法将创建上百个CharacterMarkerSymbol,而且必须缓存这些对象(因为窗体上的绘制方法会频繁调用,缓存可以提高响应效率)。所以,我选择了第二种方法将符号绘制到窗体上。
为什么使用DrawString()方法可以绘制符号呢?我们都知道,电脑上的文字都有一个编码,我们可以把绘制文字的过程理解为电脑根据这个编码去字体库里找到相应的图片,然后绘制到屏幕上。在.net里,Char类型和int类型是可以转换的。因此,用如下代码就可以依据Unicode值绘制ttf文件里的符号:
实现了单个符号的绘制,对于多个符号,我们只需要依据步骤一里获得Unicode范围,用遍历的方法逐个绘制,即可将所有符号绘制到窗体上,并记录每个符号匹配的Unicode。
在绘制所有的符号时,要注意窗体的刷新范围,尽量使用局部重绘,这样可以提高绘制效率,避免窗体闪烁。
三、CharacterMarkerSymbol生成
CharacterMarkerSymbol的生成就比较简单。依据用户的操作,获得字体对象Font和Unicode编码,代码如下:
下图为基于Engine开发的符号选择器中通过字体文件配置点状符号的效果图。实现自定义字符符号配置的关键是获取字体文件中字符编码及使用GDI绘制这些符号。目前还不能支持鼠标滚动。欢迎大家交流,本人Email: killo007@163.com
本文内容参考了:
http://venrar.blog.163.com/blog/static/60699459200881102648855/
http://202.165.105.226/babelfish/translate_url_content?intl=cn&lp=en_zh&trurl=http%3a%2f%2fwww.codeproject.com%2fKB%2fstring%2fFontGlyphSet.aspx
- Arcgis Engine开发将ttf格式的符号通过字符标记符号接口显示出来
- 关于arcgis engine符号库的讨论
- 关于arcgis engine符号库的讨论
- ARCGIS ENGINE符号库制作方法
- arcgis符号显示异常
- ArcGis Engine中实现对符号的预览图输出
- ArcGIS Engine中实现对符号的输出预览
- Arcgis Engine二次开发,如何获取符号库文件中的符号
- 预排版标记<pre></pre>在网页中原封不动地都显示出来,实体符号
- xml里面的回车换行符号怎样显示出来?
- ArcGIS Engine开发教程之图层符号化(三)——符号化Symbol(符号)体系
- ArcGIS Engine开发教程之图层符号化(三)——符号化Symbol(符号)体系
- 转自新浪关于python开发的注释标记符号
- 基于ArcGIS Engine + C#实现用户自定义动态电力符号
- ArcGIS Engine代码共享-符号(Symbol)对象操作
- ArcGIS Engine开发教程之图层符号化(五)——利用ESRI自带的符号库进行唯一值符号化
- ArcGIS Engine开发教程之图层符号化(五)——利用ESRI自带的符号库进行唯一值符号化
- 将数据源的数据格式化显示,加上金额符号
- 关于nofollow的问题
- flex中datagrid checkbox全选及单选源码
- mysql sql server oracle 都表关联更新
- sql2005自动备份
- Javascript模板引擎-Surge.js
- Arcgis Engine开发将ttf格式的符号通过字符标记符号接口显示出来
- 黑马程序员 知识点总结-Java IO(二)字符流
- MySQL #1045错误完全解决方案
- MEF系列二:定义部件(Parts)和契约(Contracts)
- 怎么理解thinkphp的volist标签
- python strip()函数 介绍
- js 正则表达式语法规则
- 学习HTML5开发RPG游戏第四步>游戏对象设计
- 同一网段中的两台linux A,B; A机设置文件的权限,B通过mount (mount –t nfs ip:/opt/fs /opt/fs)过载A中的文件,无论A机怎样设置文件的权限,B机都可以访