1.有没办法让DrawString的一段文字的某个字为不同颜色
如显示出hello,e为红色,其他为黑色2.怎么获取显示字符的宽度
i和w的宽度是不一样的

解决方案 »

  1.   

    2
    Graphics.MeasureString 方法
    ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfSystemDrawingGraphicsClassMeasureStringTopic.htm
      

  2.   

    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));
      

  3.   

    楼主第一个问题没法解,但是可以指定渐变颜色。
    如果要解,你就把它分解开来多次绘字体的大小是根据你设置参数来设置的
    例如
    F,f和具有手写特征占3格的f大小是不一样的,GDI+程序设计已讲了这一点
      

  4.   

    MeasureString测的不准确。
     chinasdp() 的办法似乎可以,但是不太懂是什么原理
    能帮我写了函数吗?返回字符串宽度的函数
    public static float StringWidth(string s,Font font)
      

  5.   

    原理很简单,不过可能是显得比较繁琐。
    比如字符串"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;//得到毫米单位的字符串宽度。
    }
      

  6.   

    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));这个就很不准
      

  7.   

    我自定义的 DrawString方法很简单,就是逐个字符调用用Graphics的DrawString方法,然后根据全角字符或半角字符计算偏移量。我已经用该方法做好几个项目了,即使是实现放缩拖运功能也没问题。
      

  8.   

    可是在我这里还不太准确
    我也找到一个方法,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;
    }