一个API函数 TextOut 众所周知其中最后一个参数是要显示的字符串长度
如果字符串全是英文则len()可以得到正确的长度 使用此API也就可以正常显示
现在加入中文由于len(中文)得出的结果在TextOut中不能正常显示字符 必须用LenB()得到ANSI编码方式的字符长度才可以正常显示
现在我的字符串既不是中文也不是英文 而是两者混合在一起 如"YYpro好" ,"好YYpro" 等 请问现在要如何取得字符串长度才能使用TextOut函数正常显示?也就是得到正确的字符串长度
注:strconv "表达式",vbunicode 转换后也没用
如果字符串全是英文则len()可以得到正确的长度 使用此API也就可以正常显示
现在加入中文由于len(中文)得出的结果在TextOut中不能正常显示字符 必须用LenB()得到ANSI编码方式的字符长度才可以正常显示
现在我的字符串既不是中文也不是英文 而是两者混合在一起 如"YYpro好" ,"好YYpro" 等 请问现在要如何取得字符串长度才能使用TextOut函数正常显示?也就是得到正确的字符串长度
注:strconv "表达式",vbunicode 转换后也没用
Dim x As String
x = "YYpro好"
TextOut Me.hdc, 0, 0, x, LenB(StrConv(StrConv(x, vbUnicode), vbFromUnicode))
End Sub
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
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 即可。
Lench = LenB(StrConv(Tmpstr, vbFromUnicode))
End Functionlench("我o") 3
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你好吗?")就能正确得到长度了.
LenB(StrConv(StrConv(x, vbUnicode), vbFromUnicode))得不到正确的结果LenB(StrConv(Tmpstr, vbFromUnicode))就可以了
lstrlen(Split(x, Chr(0))(0))中split是什么作用? 用了这个会提示出错 不用就正确了