一个API函数 TextOut 众所周知其中最后一个参数是要显示的字符串长度
如果字符串全是英文则len()可以得到正确的长度 使用此API也就可以正常显示
现在加入中文由于len(中文)得出的结果在TextOut中不能正常显示字符 必须用LenB()得到ANSI编码方式的字符长度才可以正常显示
现在我的字符串既不是中文也不是英文  而是两者混合在一起 如"YYpro好" ,"好YYpro" 等 请问现在要如何取得字符串长度才能使用TextOut函数正常显示?也就是得到正确的字符串长度
注:strconv "表达式",vbunicode 转换后也没用

解决方案 »

  1.   

    Private Declare Function TextOut Lib "gdi32" Alias "TextOutA" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal lpString As String, ByVal nCount As Long) As LongPrivate Sub Command1_Click()
    Dim x As String
    x = "YYpro好"
    TextOut Me.hdc, 0, 0, x, LenB(StrConv(StrConv(x, vbUnicode), vbFromUnicode))
    End Sub
      

  2.   

    Private Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpString As String) As Long
    Private Declare Function TextOut Lib "gdi32" Alias "TextOutA" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal lpString As String, ByVal nCount As Long) As LongPrivate Sub Command1_Click()
    Dim x As String
    x = "YYpro好"
    TextOut Me.hdc, 0, 0, x, lstrlen(Split(x, Chr(0))(0))
    End Sub
      

  3.   

    Private Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpString As String) As Long
    Private Declare Function TextOut Lib "gdi32" Alias "TextOutA" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal lpString As String, ByVal nCount As Long) As LongPrivate Sub Command1_Click()
        Dim x As String
        x = "YYpro好"
        TextOut Me.hdc, 0, 0, x, lstrlen(x)
    End Sub另外,建议您使用DrawText也可,可以获得更多的控件,且不必理会字符串的长度。
    Private Declare Function DrawText Lib "user32" Alias "DrawTextA" (ByVal hdc As Long, ByVal lpStr As String, ByVal nCount As Long, lpRect As RECT, ByVal wFormat As Long) As Long只需将参数 nCount 设置为 -1 即可。
      

  4.   

    LenB(strConv("好YYpro", vbfromunicode))
      

  5.   

    Public Function Lench(ByVal Tmpstr As String) As String
      Lench = LenB(StrConv(Tmpstr, vbFromUnicode))
    End Functionlench("我o")   3
      

  6.   

    做一个测试长度的函数.
    private function lenstr(byval str as string) as  long
      dim ln as long
      dim i as long
      dim iasc as long
      ln=0
      for i = 1 to len(str)
        iasc=asc(mid(str,i,1))
        if iasc<0 or iasc>255 then ln=ln+1 else ln=ln+2
      next i
      lenstr=ln
    end function
    这样,用lenstr("abcd你好吗?")就能正确得到长度了.
      

  7.   

    LenB(StrConv(StrConv(字符串, vbUnicode), vbFromUnicode))
      

  8.   

    northwolves(狼行天下) 给出的答案是基本正确的 只是有点细节可能没有注意
    LenB(StrConv(StrConv(x, vbUnicode), vbFromUnicode))得不到正确的结果LenB(StrConv(Tmpstr, vbFromUnicode))就可以了
    lstrlen(Split(x, Chr(0))(0))中split是什么作用? 用了这个会提示出错 不用就正确了