求教:用SendMessage + EM_SETSEL 在Textbox选取文本
vb吧
全部回复
仅看楼主
level 9
klimaa 楼主
用SendMessage + EM_SETSEL 在Textbox选取文本
在开发环境调试时,有中文就选不对,但是编译后选择的位置就是正确的,原因是什么?
有没有办法在调试时也能正确选择?
2023年06月16日 09点06分 1
level 12
有两个版本,SendMessageA和SendMessageW,你声明的时候用的是哪个?换一下试试
2023年06月16日 16点06分 2
我声明时用的是A版,试了一下两个版本没有区别。 文本为默认代码页(而且因为是从显示结果选择,应该无关),无论是EM_SETSEL,还是EM_GETSEL,在IDE下都把汉字当两个字符,编译后当成一个字符。
2023年06月19日 03点06分
level 9
klimaa 楼主
破案了,使用6.0版控件的时候(Textbox支持Ctrl+A),EM_SETSEL把汉字当一个字符。否则,EM_SETSEL把汉字当2个字符。这是要玩死我啊!@隨風缒夢 @yjryym @涐吢铱舊囿儚
2023年06月20日 05点06分 3
你用的是SendMessageA吧?用SendMessageW试试看。
2023年06月21日 01点06分
你用的是SendMessageA吧?用SendMessageW试试看。
2023年06月21日 01点06分
@yjryym 我试了,没区别啊。请看看楼下的演示代码哪里有问题。
2023年06月21日 07点06分
@klimaa SendMessageA按ANSI字符长度算,SendMessageW按Unicode字符长度算。
2023年06月25日 07点06分
level 9
klimaa 楼主
Public Declare Function SendMessageByRefW Lib "USER32" Alias "SendMessageW" _
(ByVal hwnd As Long, ByVal wMsg As Long, ByRef wParam As Long, ByRef lParam As Long) As Long
Private Sub TxtFile_Click()
Dim lSelStPos As Long '选择起始位置
Dim lSelEdPos As Long '选择结束位置
' DispMsg "Position at " & TxtFile.SelStart
SendMessageByRefW TxtFile.hwnd, EM_GETSEL, lSelStPos, lSelEdPos
DispMsg "Position at " & lSelEdPos & " " & lSelEdPos
End Sub
这样可以取鼠标位置,随便输入汉字文本,鼠标点击可以看到一个汉字是占了2个字符还是1个。
2023年06月21日 07点06分 4
level 10
看下图右边两组结果,是相同代码编译后运行的:
图片右上的窗口,是启用WinXP样式控件的运行结果。
  这个是“1个汉字按1个字符算”的。
图片右下的窗口,是没启用WinXP样式控件的。
  这个跟调试运行一样,是“1个汉字按2个字符算”的。
2023年07月07日 13点07分 5
level 10
试了一下,把VB6的IDE开启WinXP样式就可以了。
[哈哈]
2023年07月07日 13点07分 6
这是在IDE中运行的结果。注意,不是编译后的哦。
2023年07月07日 13点07分
试了,果然IDE打开XP样式就可以了
2023年07月10日 03点07分
当个好奇宝宝。你的IDE似乎是深度改造的?sendmessage不用声明,启动窗口也不一样。是改的VB6IDE.dll吗?
2023年07月10日 03点07分
我的vb6是不卡版本,不能直接用manifest,mt可以
2023年07月10日 03点07分
1