web图章的实现思路与示例代码(C#NET).doc
上传人:sy****28 上传时间:2024-09-10 格式:DOC 页数:26 大小:224KB 金币:16 举报 版权申诉
预览加载中,请您耐心等待几秒...

web图章的实现思路与示例代码(C#NET).doc

web图章的实现思路与示例代码(C#NET).doc

预览

免费试读已结束,剩余 16 页请下载文档后查看

16 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

web图章的实现思路与示例代码(C#.NET)本文的重点在于探讨如何用C#在web页面上制作公司的图章,也就是生成图章图片。制作图章来说,主要是如何让字均匀的显示在弧线段上,那么一般的印章要么以圆或者椭圆为底图,不过这两者的算法大致相同,为了方便说明,如下就用相对简单的圆来举例说明,如果需要做椭圆的话,可以在我的基础上进行扩展,因为核心算法是一样的,相对于圆来说,椭圆求弧长以及各个字符的位置,这两点相对麻烦些,但是这两者都可找到相应的数学公式。您可以参看如下地址。http://www.codeproject.com/vb/net/Text_on_Path_with_VBNET.asp由于印章的实现相对于这篇文章来说,相对简单多了,而且规律性很强,因此我自己考虑重新组织算法进行实现。那么实现一个印章,大致步骤如下。1.计算字符串总长度,以及各个字符的长度;2.计算出字符串的起始角度;3.求出每个字符的所在的点,以及相对于中心的角度;4.绘制每个字符。计算字符串总长度,以及各个字符的长度这里需要用到“Graphics.MeasureString”和“Graphics.MeasureCharacterRanges”这两个方法,由于前者算出来的总长度有问题,所以需要后面进行重新计算(此外,这里我还考虑了字符最后显示方向)。这部分的代码如下:///<summary>///Computestringtotallengthandeverycharlength///</summary>///<paramname="sText"></param>///<paramname="g"></param>///<paramname="fCharWidth"></param>///<paramname="fIntervalWidth"></param>///<returns></returns>privatefloatComputeStringLength(stringsText,Graphicsg,float[]fCharWidth,floatfIntervalWidth,Char_DirectionDirection){//InitstringformatStringFormatsf=newStringFormat();sf.Trimming=StringTrimming.None;sf.FormatFlags=StringFormatFlags.NoClip|StringFormatFlags.NoWrap|StringFormatFlags.LineLimit;//MeasurewholestringlengthSizeFsize=g.MeasureString(sText,_font,(int)_font.Style);RectangleFrect=newRectangleF(0f,0f,size.Width,size.Height);//MeasureeverycharactersizeCharacterRange[]crs=newCharacterRange[sText.Length];for(inti=0;i<sText.Length;i++)crs[i]=newCharacterRange(i,1);//Resetstringformatsf.FormatFlags=StringFormatFlags.NoClip;sf.SetMeasurableCharacterRanges(crs);sf.Alignment=StringAlignment.Near;//GeteverycharactersizeRegion[]regs=g.MeasureCharacterRanges(sText,_font,rect,sf);//Re-computewholestringlengthwithspaceintervalwidthfloatfTotalWidth=0f;for(inti=0;i<regs.Length;i++){if(Direction==Char_Direction.Center||Direction==Char_Direction.OutSide)fCharWidth[i]=regs[i].GetBounds(g).Width;elsefCharWidth[i]=regs[i].GetBounds(g).Height;fTotalWidth+=fCharWidth[i]+fIntervalWidth;}f