一个小问题求len(表达式)=? 解决者100分相送(不散分100分给第一个完美解决者)

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

...全文
247 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
昵称很难想哎 2004-10-18
  • 打赏
  • 举报
回复
northwolves(狼行天下) 给出的答案是基本正确的 只是有点细节可能没有注意
LenB(StrConv(StrConv(x, vbUnicode), vbFromUnicode))得不到正确的结果LenB(StrConv(Tmpstr, vbFromUnicode))就可以了
lstrlen(Split(x, Chr(0))(0))中split是什么作用? 用了这个会提示出错 不用就正确了
starsoulxp 2004-10-18
  • 打赏
  • 举报
回复
up
还想懒够 2004-10-18
  • 打赏
  • 举报
回复
LenB(StrConv(StrConv(字符串, vbUnicode), vbFromUnicode))
super852 2004-10-18
  • 打赏
  • 举报
回复
做一个测试长度的函数.
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你好吗?")就能正确得到长度了.
yassee 2004-10-18
  • 打赏
  • 举报
回复
Public Function Lench(ByVal Tmpstr As String) As String
Lench = LenB(StrConv(Tmpstr, vbFromUnicode))
End Function

lench("我o") 3
of123 2004-10-18
  • 打赏
  • 举报
回复
LenB(strConv("好YYpro", vbfromunicode))
韧恒 2004-10-18
  • 打赏
  • 举报
回复
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 Long

Private 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 即可。
northwolves 2004-10-18
  • 打赏
  • 举报
回复
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 Long

Private Sub Command1_Click()
Dim x As String
x = "YYpro好"
TextOut Me.hdc, 0, 0, x, lstrlen(Split(x, Chr(0))(0))
End Sub
northwolves 2004-10-18
  • 打赏
  • 举报
回复
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 Long

Private Sub Command1_Click()
Dim x As String
x = "YYpro好"
TextOut Me.hdc, 0, 0, x, LenB(StrConv(StrConv(x, vbUnicode), vbFromUnicode))
End Sub

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧