GDI+ DrawString的两个问题 1.有没办法让DrawString的一段文字的某个字为不同颜色如显示出hello,e为红色,其他为黑色2.怎么获取显示字符的宽度i和w的宽度是不一样的 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 2Graphics.MeasureString 方法ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfSystemDrawingGraphicsClassMeasureStringTopic.htm MeasureString测试出的东西不准,测试你会发现同样的字符串一个和两个的宽度都不是两倍关系,如果涉及到放缩那就更不准了,以前我在做项目的解决方案是逐个字符画:public static float w = 0.1800f;// w * fontsize为特定大小字符的宽度,以小字符为准,大字符为小字符的2倍public static float h = 0.4460f;// h * fontsize为特定大小字符的高度,以大字符为准,小字符比大字符小0.05mm/号字,可忽略以上为毫米单位public static float DrawString(Graphics g, PointF pointF, string s, Font font, SolidBrush brush){ float left = pointF.X, top = pointF.Y; float x = left; font = new Font(font.Name, font.Size * g.PageScale, font.Style); for(int i = 0 ; i < s.Length ; i ++) // 逐个字符画 { if(s[i] != ' ' && s[i] != ' ')// 空格不画,但保留位置 { g.DrawString(s.Substring(i, 1), font, brush, x, top); } if((int)s[i] > 127) x += w * font.Size / g.PageScale * 2.0f; else x += w * font.Size / g.PageScale;//g.PageScale为放缩比例 } return x - pointF.X;//返回所画字符串的长度}测试在Paint事件里e.Graphics.PageUnit = GraphicsUnit.Millimeter;float left = DrawString(e.Graphics, new PointF(0, 0), "hell", Font, new SolidBrush(Color.Blue));DrawString(e.Graphics, new PointF(left, 0), "o", Font, new SolidBrush(Color.Red)); 楼主第一个问题没法解,但是可以指定渐变颜色。如果要解,你就把它分解开来多次绘字体的大小是根据你设置参数来设置的例如F,f和具有手写特征占3格的f大小是不一样的,GDI+程序设计已讲了这一点 MeasureString测的不准确。 chinasdp() 的办法似乎可以,但是不太懂是什么原理能帮我写了函数吗?返回字符串宽度的函数public static float StringWidth(string s,Font font) 原理很简单,不过可能是显得比较繁琐。比如字符串"hello中国":知道了起始位置,字体信息,在开始位置一个字符一个字符地画,那么就需要知道每个字符的起始位置。经过测试发现,相同字体的全角字符宽度是半角字符的两倍,高度基本相同,而字符的宽度和高度又与字号大小成正比。字符宽度=字号*宽度基数,字符高度=字号*高度基数宽度基数=0.1800f,高度基数= 0.4460f。两个数据是根据半角字符并以毫米为单位。假如left = 10;top = 20;fontsize = 10; h e l l o 中 国left 10 11.8 13.6 15.4 17.2 19.0 22.6top 20 20 20 20 20 20 20要是用上面的方法画字符串的话,取字符串的宽度也是这个原理。看字符是半角还是全角,半角的字符宽度=字号*宽度基数,全角的要再乘以2。private float GetWidth(string s, int fontsize){ float tmpWidth = 0; for(int i = 0 ; i < s.Length ; i ++) { tmpWidth += w * fontsize; if((int)s[i] > 127)//全角的再加一次 { tmpWidth += w * fontsize; } } return tmpWidth;//得到毫米单位的字符串宽度。} e.Graphics.PageUnit = GraphicsUnit.Millimeter;是做什么用的还是不准string draws="Hello World!IIIWWWWWMMMMooooiiiii"; Font stringFont = new Font("Arial", 25); e.Graphics.PageUnit = GraphicsUnit.Millimeter; float left = DrawString(e.Graphics, new PointF(0, 0), draws, stringFont, new SolidBrush(Color.Blue));这个就很不准 我自定义的 DrawString方法很简单,就是逐个字符调用用Graphics的DrawString方法,然后根据全角字符或半角字符计算偏移量。我已经用该方法做好几个项目了,即使是实现放缩拖运功能也没问题。 可是在我这里还不太准确我也找到一个方法,MeasureString测一两个字符的时候是不准,但是测一段的时候就挺准的,测一段相同的字符如iiiiiiiiiiii,然后在除以个数就可以把误差减小public static float charLeng(string s, Font font,Graphics g)//s只能是单个字符,中文也可以{ int i=0; string tempS=s; do { tempS+=s; i++; }while(i<15);//字符数越多,误差就越少,一般15就够了 SizeF stringSize = new SizeF(); stringSize = g.MeasureString(tempS,font); float leng=stringSize.Width/tempS.Length; return leng; } 倒计时是如何实现的呢?谢谢 求c#学习经验! 从学校出来后走上工作是得具体情况和注意事项(希望务必说一下) 在C#中如何使用正则表达式得到指定区域内的内容。 Form 的Click事件 左键不能触发 怎么样获取要关闭文件的路径及文件名(windowsfrom) 跪求双线性插值算法的例子,在线等 前段时间,没事写来玩的一个程序.大家看看哈 C#有那么庞大的类,为什么读写文件这么麻烦? 如何在C#中用代码控制本地FTP服务打开和关闭?99分,中秋快乐. 社区的高手在吗?请问如何在web.config中设置meta的值,页面中直接绑定就行了?? 在C#中如何写一个打开钱箱的代码,高分,在线等答案
Graphics.MeasureString 方法
ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfSystemDrawingGraphicsClassMeasureStringTopic.htm
public static float w = 0.1800f;
// w * fontsize为特定大小字符的宽度,以小字符为准,大字符为小字符的2倍
public static float h = 0.4460f;
// h * fontsize为特定大小字符的高度,以大字符为准,小字符比大字符小0.05mm/号字,可忽略
以上为毫米单位
public static float DrawString(Graphics g, PointF pointF, string s, Font font, SolidBrush brush)
{
float left = pointF.X, top = pointF.Y;
float x = left; font = new Font(font.Name, font.Size * g.PageScale, font.Style);
for(int i = 0 ; i < s.Length ; i ++) // 逐个字符画
{
if(s[i] != ' ' && s[i] != ' ')// 空格不画,但保留位置
{
g.DrawString(s.Substring(i, 1), font, brush, x, top);
}
if((int)s[i] > 127)
x += w * font.Size / g.PageScale * 2.0f;
else
x += w * font.Size / g.PageScale;//g.PageScale为放缩比例
}
return x - pointF.X;//返回所画字符串的长度
}
测试在Paint事件里
e.Graphics.PageUnit = GraphicsUnit.Millimeter;
float left = DrawString(e.Graphics, new PointF(0, 0), "hell", Font, new SolidBrush(Color.Blue));
DrawString(e.Graphics, new PointF(left, 0), "o", Font, new SolidBrush(Color.Red));
如果要解,你就把它分解开来多次绘字体的大小是根据你设置参数来设置的
例如
F,f和具有手写特征占3格的f大小是不一样的,GDI+程序设计已讲了这一点
chinasdp() 的办法似乎可以,但是不太懂是什么原理
能帮我写了函数吗?返回字符串宽度的函数
public static float StringWidth(string s,Font font)
比如字符串"hello中国":
知道了起始位置,字体信息,在开始位置一个字符一个字符地画,那么就需要知道每个字符的起始位置。
经过测试发现,相同字体的全角字符宽度是半角字符的两倍,高度基本相同,而字符的宽度和高度又与字号大小成正比。
字符宽度=字号*宽度基数,字符高度=字号*高度基数
宽度基数=0.1800f,高度基数= 0.4460f。两个数据是根据半角字符并以毫米为单位。
假如left = 10;top = 20;fontsize = 10;
h e l l o 中 国
left 10 11.8 13.6 15.4 17.2 19.0 22.6
top 20 20 20 20 20 20 20要是用上面的方法画字符串的话,取字符串的宽度也是这个原理。看字符是半角还是全角,半角的字符宽度=字号*宽度基数,全角的要再乘以2。
private float GetWidth(string s, int fontsize)
{
float tmpWidth = 0;
for(int i = 0 ; i < s.Length ; i ++)
{
tmpWidth += w * fontsize;
if((int)s[i] > 127)//全角的再加一次
{
tmpWidth += w * fontsize;
}
}
return tmpWidth;//得到毫米单位的字符串宽度。
}
还是不准
string draws="Hello World!IIIWWWWWMMMMooooiiiii";
Font stringFont = new Font("Arial", 25);
e.Graphics.PageUnit = GraphicsUnit.Millimeter;
float left = DrawString(e.Graphics, new PointF(0, 0), draws, stringFont, new SolidBrush(Color.Blue));这个就很不准
我也找到一个方法,MeasureString测一两个字符的时候是不准,但是测一段的时候就挺准的,测一段相同的字符如iiiiiiiiiiii,然后在除以个数就可以把误差减小public static float charLeng(string s, Font font,Graphics g)//s只能是单个字符,中文也可以
{
int i=0;
string tempS=s;
do
{
tempS+=s;
i++;
}while(i<15);//字符数越多,误差就越少,一般15就够了
SizeF stringSize = new SizeF();
stringSize = g.MeasureString(tempS,font);
float leng=stringSize.Width/tempS.Length;
return leng;
}