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报“参数类型不对”,请问是什么意思啊?谁能帮帮我啊

解决方案 »

  1.   

    SendMessage Form1.RichTextBox.hwnd, EM_EXSETSEL, 0, chrgText
    ----------------------------------------
    上面这句改一下:
    SendMessage Form1.RichTextBox.hwnd, EM_EXSETSEL, 0, fText
      

  2.   

    因为函数在声明的时候是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 LongPublic Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As charrangeFind) As LongPublic Const FR_DOWN = &H1Public Const WM_USER = &H400
    ......
      

  3.   

    '完整示例 
    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
      

  4.   

    //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
    以免造成混乱下面是我写的程序
      

  5.   

    恩?程序呢?再贴一次:
    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
      

  6.   

    to myhgyp(也许是这样的,信不信由你) ://sFileName = MidB$(StrConv(Rich.Text, vbFromUnicode), charOffset + 1, LineLength) '取行内容
    Debug.Print sFileName这样取,太笨拙了,你可以看看:
    http://community.csdn.net/Expert/TopicView3.asp?id=4405082