GDI+ DrawString的两个问题

xwy1982 2005-10-25 09:50:05
1.有没办法让DrawString的一段文字的某个字为不同颜色
如显示出hello,e为红色,其他为黑色

2.怎么获取显示字符的宽度
i和w的宽度是不一样的
...全文
987 11 打赏 收藏 举报
写回复
11 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
Ccode 2006-04-01
MARK
  • 打赏
  • 举报
回复
seasky8390 2005-11-07
同样关注!!
  • 打赏
  • 举报
回复
xwy1982 2005-11-07
可是在我这里还不太准确
我也找到一个方法,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;
}
  • 打赏
  • 举报
回复
chinasdp 2005-11-07
我自定义的 DrawString方法很简单,就是逐个字符调用用Graphics的DrawString方法,然后根据全角字符或半角字符计算偏移量。我已经用该方法做好几个项目了,即使是实现放缩拖运功能也没问题。
  • 打赏
  • 举报
回复
xwy1982 2005-11-06
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));

这个就很不准
  • 打赏
  • 举报
回复
asuan 2005-11-02
mark
  • 打赏
  • 举报
回复
chinasdp 2005-11-02
原理很简单,不过可能是显得比较繁琐。
比如字符串"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;//得到毫米单位的字符串宽度。
}
  • 打赏
  • 举报
回复
xwy1982 2005-11-01
MeasureString测的不准确。
chinasdp() 的办法似乎可以,但是不太懂是什么原理
能帮我写了函数吗?返回字符串宽度的函数
public static float StringWidth(string s,Font font)

  • 打赏
  • 举报
回复
长江支流 2005-10-26
楼主第一个问题没法解,但是可以指定渐变颜色。
如果要解,你就把它分解开来多次绘

字体的大小是根据你设置参数来设置的
例如
F,f和具有手写特征占3格的f大小是不一样的,GDI+程序设计已讲了这一点
  • 打赏
  • 举报
回复
chinasdp 2005-10-26
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));
  • 打赏
  • 举报
回复
Bob 2005-10-25
2
Graphics.MeasureString 方法
ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfSystemDrawingGraphicsClassMeasureStringTopic.htm
  • 打赏
  • 举报
回复
相关推荐
发帖
C#
加入

10.7w+

社区成员

.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
申请成为版主
帖子事件
创建了帖子
2005-10-25 09:50
社区公告

让您成为最强悍的C#开发者