转载:http://blog.csdn.net/jianlizhao66/article/details/1480457

我们获得了每个字形的宽度数组piAdvances,以及这个RUN所占用的总宽度abc。

piVdvances对应于每个字符,它取得了每个字形所占用宽度。

如果我们以行为单位来绘制文字,我们可以以一个循环来取得每个RUN的宽度信息,并一直相加,假设我们己取得了一些run的宽度和,假设这个宽度和为LineWidth.当我们再取得链表中下一个run的宽度(假设为lo)与这个宽度相加后超过一个行的宽度。我们假设这个run的索引为n即在链表中的节点顺序由头节点向后遍历的顺序为第n个。

我们可以中断这个run即把这个run分为两个run,所谓划分实际上也就是把这个run的字符分为两部分。

可以这样实现:

hr = ScriptGetLogicalWidths(&pRun->analysis,

                                pRun->iLen,

                                cGlyphs,

                                piAdvances,

                                pClusters,

                                pVisattrs,

                                logwidths);

ScriptGetLogicalWidhts函数转换一个指定字体的字形向前宽度为逻辑宽度。

HRESULT WINAPI ScriptGetLogicalWidths(
 const SCRIPT_ANALYSIS *psa,
 int cChars,
 int cGlyphs,
 const int *piGlyphWidth,
 const WORD *pwLogClust,
 const SCRIPT_VISATTR *psva,
 int *piDx,
);

psa

[in]一个 SCRIPT_ANALYSIS 结构指针.

cChars

[in] 在RUN中的逻辑编码点数量

cGlyphs

[in] 在一个RUN中的字形数量

piGlyphWidth

[in] 字形向前宽度的数组指针

pwLogClust

[in] 逻辑Cluster的数组指针

psva

[in] SCRIPT_VISATTR 结构指针

piDx

[out] 逻辑宽度的数组指针

可以看出这个函数的最后一个参数为输出参数,它代表逻辑宽度的数组。即每个字形所占用的宽度数组。

然后我们可以以一个循环来判断具体到哪个字符时满足不超过窗口宽度的条件。

iChars = 0;

       iWidth = 0;

       while(iChars < pRun->iLen && iWidth + logwidths[iChars] < iMaxWidth)

       {

              iWidth += logwidths[iChars];

              iChars++;

       }

pRun代表我们当前的run。iWidth代表当前run中某个字符的逻辑宽度,iMaxWidth代表窗口剩余的宽度即剩余了iMaxWidth的宽度,但这个宽度不足以显示这个run.

通过上面这个循环,我们找到了这个字符的位置。

if(iChars < pRun->iLen )

    {

        pNewRun     = new RUN;

        *pNewRun    = *pRun;

        pRun->pNext = pNewRun;

        pRun->iLen = iChars;

        pNewRun->iLen -= iChars;

    }

我们已经划分了这个RUN。

第二步已经完成,总结第二步,主要目的是确定一行(窗口宽度)要显示多少个RUN,并进行相应的划分。

Uniscribe文字自动换行的更多相关文章

  1. canvas文字自动换行、圆角矩形画法、生成图片手机长按保存、方形图片变圆形

    canvas的文字自动换行函数封装 // str:要绘制的字符串 // canvas:canvas对象 // initX:绘制字符串起始x坐标 // initY:绘制字符串起始y坐标 // lineH ...

  2. 使用echart的雷达图的时候,如果文字越界的解决办法记录,标签文字自动换行

    使用echart的雷达图的时候,如果文字越界的解决办法记录,标签文字自动换行 前几天项目中有一个图表的是用echart生成的,遇到一个问题,就是在手机端显示的售时候,如果文字太长就会超出div,之前的 ...

  3. HTML DIV中文字自动换行 , 顶部对齐

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta ht ...

  4. WPF控件TextBlock中文字自动换行

    原文:WPF控件TextBlock中文字自动换行 在很多的WPF项目中,往往为了追求界面的美观,需要控制控件中文字的换行显示,现对TextBlock控件换行的实现方式进行总结,希望大家多多拍砖!!! ...

  5. css控制文字自动换行

    自动换行问题,正常字符的换行是比较合理的,而连续的数字和英文字符常常将容器撑大,挺让人头疼,下面介绍的是CSS如何实现换 行的方法 对于div,p等块级元素正常文字的换行(亚洲文字和非亚洲文字)元素拥 ...

  6. html/css实现文字自动换行,超出部分出现(...)

    PS:这是我在别人博客copy下来的 做前端的我们都会发现这样一个问题,当你控制文字出现多行时,而这多行是有限制的(比如超出部分隐藏不显示),而这多行文字如果全部是数字或者字母抑或是数字和字母的组合时 ...

  7. java 画图 Graphics 文字自动换行

    /** * 文字超出限定长度自动换行 * * @param g 画布 * @param font 字体样式 * @param text 文字 * @param widthLength 最大长度 (多少 ...

  8. H5 canvas填充文字自动换行

    canvas是H5中非常重要,非常常用,也是非常强大的一个新标签,美中不足的事,canvas中没没有自动换行的属性,我的第一反应是,字符串截取,然后计算每行的距离来实现自动换行.. 然后百度了一下,已 ...

  9. UIlabel多行文字自动换行 (自动折行)

    UIView *footerView = [[UIView alloc]initWithFrame:CGRectMake(, , , )]; UILabel *label = [[UILabel al ...

随机推荐

  1. 使用Ganglia监控hadoop、hbase

    Ganglia是一个监控服务器,集群的开源软件,能够用曲线图表现最近一个小时,最近一天,最近一周,最近一月,最近一年的服务器或者集群的cpu负载,内存,网络,硬盘等指标. Ganglia的强大在于:g ...

  2. 邮件江湖群狼环伺 U-Mail邮件系统防狼有术

    小时候听过一首儿歌<小兔子乖乖>,里面说到有条恶狼,常常冒充小兔子的“妈妈”,要求小兔 子开门,但小兔子谨守妈妈的训诫,就是不开门,直到辨别出妈妈在窗外的声音,才打开房门.如果我们将一些似 ...

  3. ORACLE 10进制与16进制的互相转换

    1. 10---->16 使用to_char(10,'xxx')函数,如果位数长,多加几个 x 2. 16---->10 使用to_number(’a','xxx')函数,如果位数长,多加 ...

  4. Notepad++ HTML格式化

    [Notepad++ HTML格式化] Tidy2.

  5. addClass() 和 toggleClass()

    addClass()是在原有的类基础上增加类属性,仍然保留原有的类的样式.语法格式为:addClass(class0 class1 ...) ,例如: $("p").addClas ...

  6. stm32 MDK5软件仿真之查看io口输出

    软件MDK5 stm32的pack     打开MDK,添加工程 一.首先找到Project的Options选项,里面的Debug选为Use Simulator,也就是选择软件仿真. 然后再Logic ...

  7. 把svn上的mycelipse导到本地的eclipse中

    myeclipse和eclipse的web项目互导时会产生各种问题,现在把我遇到的情况记录如下: eclipse如何把svn上down下来的myeclipseWeb项目变成eclipse的Web项目: ...

  8. (十一) 一起学 Unix 环境高级编程 (APUE) 之 高级 IO

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  9. 行锁sqlserver

    SELECT COUNT(1) FROM BLBQ_Sys_TableId With (RowLock,UpdLock) WHERE Table_Name = @Table_Name commit   ...

  10. Python学习笔记第七天(列表解析)

    列表解析: 根据已有列表,高效生成列表的方式,它的执行效率要快很多,比for循环的速度要快很多 示例如下: 生成器表达式 生成器表达式并不真正创建数字列表,而是返回一个生成器对象,此对象在每次计算出一 ...