2024年6月14日发(作者:)

制作印章来说,主要是如何让字均匀的显示在弧线段上,那么一般的印章要

么以圆或者椭圆为底图,不过这两者的算法大致相同,为了方便说明,如下就用

相对简单的圆来举例说明,如果需要做椭圆的话,可以在我的基础上进行扩展,

因为核心算法是一样的,相对于圆来说,椭圆求弧长以及各个字符的位置,这两

点相对麻烦些,但是这两者都可找到相应的数学公式。

这里首先提一点,我这篇文章部分借鉴了codeproject的一个例子,原文可以

参看如下地址。

vb/net/Text_on_Path_with_">/vb/net/

Text_on_Path_with_

(说实话,这篇文章写得有些乱,而且对于buffer的操作近乎于疯狂)

由于印章的实现相对于这篇文章来说,相对简单多了,而且规律性很强,因

此我自己考虑重新组织算法进行实现。

那么实现一个印章,大致步骤如下。

1.

计算字符串总长度,以及各个字符的长度;

2.

计算出字符串的起始角度;

3.

求出每个字符的所在的点,以及相对于中心的角度;

4.

绘制每个字符。

计算字符串总长度,以及各个字符的长度

这里需要用到“eString”和“eCharacterRang

es”这两个方法,由于前者算出来的总长度有问题,所以需要后面进行重新计算

(此外,这里我还考虑了字符最后显示方向)。

这部分的代码如下:

///

/// Compute string total length and every char length

///

///

///

///

///

///

private float ComputeStringLength( string sText, Graphics g, float[] fCharWidth,

float fIntervalWidth,

Char_Direction Direction )

{

// Init string format

StringFormat sf = new StringFormat();

ng = ;

Flags = |

| mit;

// Measure whole string length

SizeF size = eString( sText, _font, (int)_ );

RectangleF rect = new RectangleF( 0f,0f, , );

// Measure every character size

CharacterRange[] crs = new CharacterRange[];

for( int i = 0; i < ; i++ )

crs[i] = new CharacterRange( i, 1 );

// Reset string format

Flags = ;

surableCharacterRanges( crs );

ent = ;