关于API函数SendMessage的EM_EXSETSEL的问题,100分求解!!

VampireB 2005-12-16 03:06:16
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As FindText) As Long

Public Const FR_DOWN = &H1

Public Const WM_USER = &H400
Public Const EM_FINDTEXT = WM_USER + 56
Public Const EM_FINDTEXTEX = WM_USER + 79
Public Const EM_EXSETSEL = WM_USER + 55
Public Const EM_SETTEXTEX = WM_USER + 97

Type charrange
cpMin As Long
cpMax As Long
End Type

'and lParam is a findtext structure:
Type FindText
chrg As charrange
lpstrText As String
End Type

Type charrangeFind
cpMin As Long
cpMax As Long
End Type
`------------------------
Private Sub Command1_Click()
Dim star As Long
Dim fText As FindText
Dim cRange As charrange
Dim chrgText As charrangeFind
With cRange
.cpMin = 0
.cpMax = LenB(StrConv(Form1.RichTextBox.Text, vbFromUnicode))
End With
With fText
.chrg = cRange
.lpstrText = TextFind.Text
'.chrgText = cRangeFind
End With
Form1.RichTextBox.SelStart = 0
lReturn = SendMessage(Form1.RichTextBox.hwnd, EM_FINDTEXTEX, FR_DOWN, fText)
With chrgText
.cpMin = lReturn
.cpMax = lReturn + LenB(StrConv(TextFind.Text, vbFromUnicode))
End With
SendMessage Form1.RichTextBox.hwnd, EM_EXSETSEL, 0, chrgText
End Sub

以上,是我做的一个在中进行查询字符串的程序,前面查找都正常,可是总是在最后一句进行定位的chrgText报“参数类型不对”,请问是什么意思啊?谁能帮帮我啊
...全文
413 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
faysky2 2005-12-16
  • 打赏
  • 举报
回复
因为函数在声明的时候是FindText类型,而chrgText是charrangeFind类型,所以会报“参数类型不对”,可以再添加一个函数,把FindText类型改为charrangeFind类型:

Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As FindText) As Long

Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As charrangeFind) As Long

Public Const FR_DOWN = &H1

Public Const WM_USER = &H400
......



yorkness 2005-12-16
  • 打赏
  • 举报
回复
问题解决了吗?
faysky2 2005-12-16
  • 打赏
  • 举报
回复
SendMessage Form1.RichTextBox.hwnd, EM_EXSETSEL, 0, chrgText
----------------------------------------
上面这句改一下:
SendMessage Form1.RichTextBox.hwnd, EM_EXSETSEL, 0, fText
tztz520 2005-12-16
  • 打赏
  • 举报
回复
参数是FindText类型的呀..
rainstormmaster 2005-12-16
  • 打赏
  • 举报
回复
to myhgyp(也许是这样的,信不信由你) :

//sFileName = MidB$(StrConv(Rich.Text, vbFromUnicode), charOffset + 1, LineLength) '取行内容
Debug.Print sFileName

这样取,太笨拙了,你可以看看:
http://community.csdn.net/Expert/TopicView3.asp?id=4405082
rainstormmaster 2005-12-16
  • 打赏
  • 举报
回复
恩?程序呢?再贴一次:
Option Explicit
'typedef struct _charrange {
' LONG cpMin;
' LONG cpMax;
'} CHARRANGE;

'typedef struct _findtextex {
' CHARRANGE chrg;
' LPCTSTR lpstrText;
' CHARRANGE chrgText;
'} FINDTEXTEX;
Private Type CHARRANGE
cpMin As Long
cpMax As Long
End Type
Private Type FINDTEXTEX
chrg As CHARRANGE
lpstrText As String
chrgText As CHARRANGE
End Type
Private Const FR_DOWN = &H1
Private Const FR_MATCHCASE = &H4
Private Const FR_WHOLEWORD = &H2
Private Const FR_REPLACE = &H10
Private Const FR_REPLACEALL = &H20
Private Const FR_NOWHOLEWORD = &H1000
Private Const FR_NOUPDOWN = &H400
Private Const FR_NOMATCHCASE = &H800
Private Const WM_USER = &H400
Private Const EM_FINDTEXTEX = WM_USER + 79
Private Const EM_GETTEXTLENGTHEX = (WM_USER + 95)

' /* flags for the GETTEXTLENGTHEX data structure */
Private Const GTL_DEFAULT = 0& ' /* do the default (return ' # of chars) */
Private Const GTL_USECRLF = 1& ' /* compute answer using CRLFs for paragraphs*/
Private Const GTL_PRECISE = 2& ' /* compute a precise answer */
Private Const GTL_CLOSE = 4& ' /* fast computation of a "close" answer */
Private Const GTL_NUMCHARS = 8& ' /* return the number of characters */
Private Const GTL_NUMBYTES = 16& ' /* return the number of _bytes_ */

Private Const CP_ACP = 0 ' default to ANSI code page
Private Const CP_NONE = 0 ' No clipping of output
Private Const CP_OEMCP = 1 ' default to OEM code page
Private Const CP_RECTANGLE = 1 ' Output clipped to rects
Private Const CP_REGION = 2 '
Private Const CP_WINANSI = 1004 ' default codepage for windows old DDE convs.
Private Const CP_WINUNICODE = 1200

' /* EM_GETTEXTLENGTHEX info; this struct is passed in the wparam of the msg */
Private Type GETTEXTLENGTHEX
flags As Long ' /* flags (see GTL_XXX defines) */
codepage As Long ' /* code page for translation (CP_ACP for default,1200 for Unicode */
End Type

Private Const EM_SETSEL = &HB1
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 Sub Command1_Click()
Dim textlength As Long
Dim mGetTextLengthEx As GETTEXTLENGTHEX
mGetTextLengthEx.codepage = 2
mGetTextLengthEx.flags = GTL_NUMBYTES
Dim i As Long
i = SendMessage(Me.RichTextBox1.hwnd, EM_GETTEXTLENGTHEX, VarPtr(mGetTextLengthEx), ByVal 0&)
Dim mFINDTEXTEX As FINDTEXTEX
mFINDTEXTEX.chrg.cpMin = 0
mFINDTEXTEX.chrg.cpMax = i
mFINDTEXTEX.chrgText.cpMin = -1
mFINDTEXTEX.lpstrText = TextFind.Text
Call SendMessage(Me.RichTextBox1.hwnd, EM_FINDTEXTEX, FR_DOWN, mFINDTEXTEX)
Me.RichTextBox1.SetFocus
SendMessage Me.RichTextBox1.hwnd, EM_SETSEL, mFINDTEXTEX.chrgText.cpMin, ByVal mFINDTEXTEX.chrgText.cpMax
End Sub

Private Sub Form_Load()
'Text1.PasswordChar = "as"
Me.RichTextBox1.LoadFile "e:\mc\mc.txt", rtfText
End Sub


rainstormmaster 2005-12-16
  • 打赏
  • 举报
回复
//Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As FindText) As Long

不要这样修改SendMessage的声明
实在想要修改的话,也建议这样修改:
Public Declare Function SendMessageFindText Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As FindText) As Long
以免造成混乱

下面是我写的程序
myhgyp 2005-12-16
  • 打赏
  • 举报
回复
'完整示例
Option Explicit

Public Type CHARRANGE
cpMin As Long
cpMax As Long
End Type
Public Type FINDTEXTEX
chrg As CHARRANGE
lpstrText As String
chrgText As CHARRANGE
End Type
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

Const LB_SETITEMHEIGHT = &H1A0 '用于设置ListBox行高
Const CB_SETITEMHEIGHT = &H153 '用于设置ComboBox行高
Const EM_GETLINECOUNT = &HBA '用于计算总行数
Const EM_GETLINE = &HC4 '用于获取行内容
Const EM_FINDTEXTEX = &H44F '用于用户搜索设置
Const EM_FINDTEXT = &H438 '基本同上
Const EM_EMPTYUNDOBUFFER = 205
Const EM_CANUNDO = 198
Const EM_GETMODIFY = 184
Const EM_SETMODIFY = 185
Const EM_UNDO = 199
Const EM_SETSEL = &HB1
Const EM_CANPASTE = 1074
Const EM_GETFIRSTVISIBLELINE = 206
Const EM_LINEFROMCHAR = 201
Const EM_LINEINDEX = 187
Const EM_LINELENGTH = 193
Const EM_EXLINEFROMCHAR = 1078
Const EM_LINESCROLL = 182
Const EM_SCROLLCARET = 183
Const EM_SETTABSTOPS = 203
Private Sub Command2_Click()
Dim FindX As FINDTEXTEX
Dim sFileName As String
Dim Lines
Dim WinH As Long
Dim i As Integer
Dim LineLength As Long
Dim charOffset As Long
WinH = Rich.hwnd
Lines = SendMessage(WinH, EM_GETLINECOUNT, 0, 0)
For i = 0 To Lines - 1
charOffset = SendMessage(WinH, EM_LINEINDEX, i, 0) '获得当前行开始位置
LineLength = SendMessage(WinH, EM_LINELENGTH, charOffset, 0) '行长度
sFileName = MidB$(StrConv(Rich.Text, vbFromUnicode), charOffset + 1, LineLength) '取行内容
Debug.Print sFileName
Next i
Dim s As String
s = StrConv("sam", vbFromUnicode)
FindX.lpstrText = "sam" '搜索“sam”
FindX.chrg.cpMax = LenB(StrConv(Rich.Text, vbFromUnicode))
FindX.chrg.cpMin = 0
Call SendMessage(WinH, EM_SETSEL, FindX.chrgText.cpMin, FindX.chrgText.cpMax)
Rich.SetFocus
End Sub

1,486

社区成员

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

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