gettextextentpoint32函数是用来计算字符串的宽度和高度,而且它说是以TWIP为单位的,但是我用之后发现好象不对,一排汉字才几百的数值,很显然不是以twip为单位的。那么它的宽度和高度究竟计算的是什么呢??
有没有用过的人帮忙解答一下啊,非常紧急啊!up 有分!!

解决方案 »

  1.   

    谁说是以TWIP为单位的?bs它!是像素!用法示例:
    Dim szText As Size
        GetTextExtentPoint32 dhDC, Text, lstrlen(Text), szText
        w = szText.cx
        h = szText.cy
      

  2.   

    谁说是以TWIP为单位的?bs它!"它".....................-_-b
      

  3.   

    那么请问你知不知道GetTextExtentPoint32计算出来的字符串像素和它在richtextbox中的宽度有关吗?(我的字符串是在richtextbox中的)
      

  4.   

    当然有关!
    GetTextExtentPoint32是根据传入参数hdc中的字体,计算描绘字符串所需的宽与高若传入的是richtextbox的hdc,那算出的就是用该dc中的当前字体,单行描绘text这么多文本实际所需宽与高的像素数,不同dc中,若字体设置不同,对同一文本计算出的宽与高也会不一样。
      

  5.   

    我用的hdc是richtextbox的hdc,那为什么我做实验时根据目测出来的很多字符的宽度没有区别,但是用该函数一算就有区别。
       比如我测试字符串宽度时:做实验如下:输入一个我字,得宽度s.cx等于8,两个我字时宽度s.cx=15,三个时甚至是s.cx=19........我不知道是怎么回事。还有,当我用字母做实验时,输入一个a,得宽度8,然后输入几个a,就是几个8的宽度。但是我输入f时,得宽度为4。但是很明显他们的宽度是一样的,因为我直接分两行写a和f,个数一样则宽度一样。
       迷茫ing........
       高手:homezj(小吉) ---你能不能加我QQ啊,我想请教你问题,在这上面等太慢了,好郁闷啊。我的QQ是249033427(花开不败)。
       或者我加你也可以啊,你下次发言时留下QQ好吗??
       谢谢!!!!
      

  6.   

    你的说法有对有错。
    1、错的是:一个“我”字,宽度只有8,可能是你传入的字符串长度不对所至,正确的字符串长度应该用API函数lstrlen测得,它是ANSI编码字节长度。“我”字为2,而"a"为1,而VB是Uncode,若用VB的Len则都是1,若用LenB,则都是2。2、对的是:“a”与“f”不一样,与hdc中使用的是非等宽字体有关。richtextbox与TextBox一样都没有hdc属性,为什么没有,因为它们的文本输出,都是在自己类中维护的后台hdc中进行,在描绘完成后才复制到前台输出,你可能是用GetDC取得richtextbox的前台hdc,这个dc与文本输出的hdc并不一样,它一般根本就不选入字体,所以使用的是默认的System字体,这正是一种非等宽字体,字母“a”的宽度一般是字母“f”、“i”、“l”等的两倍!前贴中说过,
    “GetTextExtentPoint32是根据传入参数hdc中的字体,计算描绘字符串所需的宽与高”所以在文本类控件中测字符描绘宽与高,与PictureBox或Form中不一样。一般需另建一个dc,并在新DC中选入与文本类控件当前一样的字体后,再测。
    这是正常的步骤,日常使用中,使用GetTextExtentPoint32前,也都是先选入字体,再测的。若不新建DC,在GetDC取得的hdc中直接选入字体,似乎也可以,不过我没试过,因为我做图形界面时一般都用自己的DC。
      

  7.   

    实在佩服之至!我的确是用的是getdc获得的richtextbox的dc。按你所说,原来我的GetTextExtentPoint32计算的根本不是他上面的字体,而是默认的System字体。如果我必须在这个取得的dc下来计算,那么我怎么选入字体呢?
       而且我用你所说的,用lstrlen来测量长度是,现在有几个我字它的总宽度就是15的几倍。但是字母仍然不变,应该是你说的字体的原因,还有dc不对。
    ------------------------------------------------------------------------------------
    所以在文本类控件中测字符描绘宽与高,与PictureBox或Form中不一样。一般需另建一个dc,并在新DC中选入与文本类控件当前一样的字体后,再测。
    这是正常的步骤,日常使用中,使用GetTextExtentPoint32前,也都是先选入字体,再测的。
    ------------------------------------------------------------------------------------
       里面说到要自己建dc,还有选入字体,怎么弄的,我不是很清楚。
       我是一个菜鸟,问题都很幼稚。望不吝赐教!
       再一个你怎么不留下你的QQ啊,我好象加你。那样问得清楚一些啊!!
       55555555555555.........
      

  8.   

    说来话长了,可惜我已好久不用QQ了^_^
    在论坛中讨论也有好处,也许还有更多人可以帮你。API处理文本当然离不开使用字体,所以你必须先学一下LogFont结构,在MSDN或网上搜一下它,会找到很多示例。一般来说,中文字体(如:宋体)多是等宽字体,英文字体多为非等宽字体。等宽字体很好算,每个汉字宽度是一样,高与宽相等,英文宽度正好又为中文的一半,所以有时可以简单按字符串字节数得出总描绘宽度,如:宋体9号(小五)字,汉字都是12X12像素,英文都是6X12像素。怎么使用字体,我以前写过一个文本输出函数,其中有LogFont的简单用法,你可参考:
    http://blog.csdn.net/homezj/archive/2005/04/15/349665.aspx