Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As FindText) As LongPublic Const FR_DOWN = &H1Public 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 + 97Type charrange
cpMin As Long
cpMax As Long
End Type'and lParam is a findtext structure:
Type FindText
chrg As charrange
lpstrText As String
End TypeType 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报“参数类型不对”,请问是什么意思啊?谁能帮帮我啊
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 + 97Type charrange
cpMin As Long
cpMax As Long
End Type'and lParam is a findtext structure:
Type FindText
chrg As charrange
lpstrText As String
End TypeType 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报“参数类型不对”,请问是什么意思啊?谁能帮帮我啊
----------------------------------------
上面这句改一下:
SendMessage Form1.RichTextBox.hwnd, EM_EXSETSEL, 0, fText
......
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
实在想要修改的话,也建议这样修改:
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
以免造成混乱下面是我写的程序
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 TypePrivate 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 SubPrivate Sub Form_Load()
'Text1.PasswordChar = "as"
Me.RichTextBox1.LoadFile "e:\mc\mc.txt", rtfText
End Sub
Debug.Print sFileName这样取,太笨拙了,你可以看看:
http://community.csdn.net/Expert/TopicView3.asp?id=4405082