RichTextBox长度

sylvia_dai 2007-09-13 02:38:23
请教高手,如何判断RichTextBox指定长度的信息,
比如:
rich: 1234567890iiiiiiiiii欢迎光临!
显然,在richtextbox中1234567890、iiiiiiiiii和欢迎光临!占的长度不一样,但是他们的LenB是一样的,我要判断的是占的长度一样,而不是LenB,谢谢!
...全文
221 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
脆皮大雪糕 2007-09-19
  • 打赏
  • 举报
回复
EM_POSFROMCHAR 消息的用法: wParam 参数传入字符的索引,也就是说这个字符在整个文章里面是第几个,注意这个索引从0开始,比如你要取第3个字符,它的索引是2。lParam参数没有用,传0

返回值为long型,其中高2字节为字符左上角Y坐标,低2字节为字符左上角X坐标 用 ret And 65535取出低2字节 用(ret And &HFFFF0000) / (2 ^ 16) 可以取出高2字节。当然用copymemory也能做到,我是懒得再去声明了。

脆皮大雪糕 2007-09-19
  • 打赏
  • 举报
回复
可以了,下面这段代码能够取得被选择的字符的宽度,单位是像素。这里我只取出被选中的第一个字符的X坐标以及被选中最后一个字符的下一个字符的X坐标然后相减获得宽度。因为字符坐标均以字符左上角为准,所以必须计算最后一个字符的下一个字符的坐标才能得出被选中字符的最右侧X值(语文不好,不知道上面这些描述能不能被看懂) 选择的文字在同一行计算得才正确,并且不能选中最后的那个回车换行符。跨行的需要把代码改一改获得X坐标。如果你已经能够非常明确的知道你想要测试的字符的位置就没必要发送EM_GETSEL消息了

Option Explicit

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Const EM_POSFROMCHAR = 214
Private Const EM_GETSEL = &HB0

Private Sub Command1_Click()
Dim ret As Long
Dim intStart As Integer
Dim intEnd As Integer
Dim intStartX As Integer
Dim intEndX As Integer
ret = SendMessage(RichTextBox1.hwnd, EM_GETSEL, 0, 0)
intStart = ret And 65535
intEnd = (ret And &HFFFF0000) / (2 ^ 16)
ret = SendMessage(RichTextBox1.hwnd, EM_POSFROMCHAR, intStart, 0)
intStartX = ret And 65535
ret = SendMessage(RichTextBox1.hwnd, EM_POSFROMCHAR, intEnd + 1, 0)
intEndX = ret And 65535
MsgBox intEndX - intStartX
End Sub
sylvia_dai 2007-09-19
  • 打赏
  • 举报
回复
非常感謝!
脆皮大雪糕 2007-09-18
  • 打赏
  • 举报
回复
研究一下那堆EM开头的消息 特别是EM_GET的。应该能够找到。先回家了,明天再继续
脆皮大雪糕 2007-09-18
  • 打赏
  • 举报
回复
太看得起小弟了,不过不好意思,小弟暂时无法解决
sylvia_dai 2007-09-18
  • 打赏
  • 举报
回复
請口香糖幫我看看,謝謝!
tanghuawei 2007-09-15
  • 打赏
  • 举报
回复
帮你顶,等待高手!
sylvia_dai 2007-09-14
  • 打赏
  • 举报
回复
怎麽沒人幫忙啊?如果分少了我可以再開一帖!
sylvia_dai 2007-09-13
  • 打赏
  • 举报
回复
还有你说的:将一个picturebox(或者任何具有方法TextWidth的控件,如form)的字体,字号与需要求宽度的部分设置的一样,然后调用TextWidth方法,返回的就是宽度。
这部分要如何设置成一样?请举个例子,谢谢!
sylvia_dai 2007-09-13
  • 打赏
  • 举报
回复
camel78(骆驼)
你好,按照你说的,得出的宽度还是不一样
camel78 2007-09-13
  • 打赏
  • 举报
回复
Modest(塞北雪貂)·(偶最欣赏楼主的分)
别欣赏了,你说的估计和楼主的问题不是一回事。
我理解楼主说的是显示的宽度,而不是Length之类的东西。
RT是允许带格式的,所以计算显示的宽度的时候应该这样
将一个picturebox(或者任何具有方法TextWidth的控件,如form)的字体,字号与需要求宽度的部分设置的一样,然后调用TextWidth方法,返回的就是宽度。如:
sTextWidth=me.TextWidth("1234567890")
运行后,sTextWidth就是字符的宽度,类型是Single
sylvia_dai 2007-09-13
  • 打赏
  • 举报
回复
谢谢你的回复,我说了不是LenB
在vb中LenB(StrConv("1234567890", vbFromUnicode))、LenB(StrConv("iiiiiiiiii", vbFromUnicode))和LenB(StrConv("欢迎光临!", vbFromUnicode))的长度是一样的,但是实际占的长度可以看出来不一样长!
迈克揉索芙特 2007-09-13
  • 打赏
  • 举报
回复
Dim str As String
str = "1234567890iiiiiiiiii欢迎光临!"
MsgBox LenB(StrConv(str, vbFromUnicode))

7,762

社区成员

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

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