'支持中文,一個(gè)漢字算一列Option ExplicitPublic Const WM_USER = &H400Public Const EM_EXGETSEL = WM_USER + 52Public Const EM_LINEFROMCHAR = &HC9Public Const EM_LINEINDEX = &HBBPublic Const EM_GETSEL = &HB0Public Type CHARRANGEcpMin As LongcpMax As LongEnd TypePublic Type POINTAPIx As Longy As LongEnd TypePublic Declare Function SendMessage Lib "user32" Alias _"SendMessageA" (ByVal hWnd As Long, ByVal wMsg As _Long, ByVal wParam As Long, lParam As Any) As LongPublic Declare Sub CopyMemory Lib "kernel32" Alias _"RtlMoveMemory" (pDst As Any, pSrc As Any, _ByVal ByteLen As Long)'取得光標(biāo)所在的行和列Public Function GetCurPos(ByRef TextControl As Control) As POINTAPIDim LineIndex As LongDim SelRange As CHARRANGEDim TempStr As StringDim TempArray() As ByteDim CurRow As LongDim CurPos As POINTAPITempArray = StrConv(TextControl.Text, vbFromUnicode)'取得當(dāng)前被選中文本的位置 適用于 RichTextBox'TextControl 用 EM_GETSEL 消息Call SendMessage(TextControl.hWnd, EM_EXGETSEL, 0, SelRange)'根據(jù)參數(shù)wParam指定的字符位置返回該字符所在的行號(hào)CurRow = SendMessage(TextControl.hWnd, EM_LINEFROMCHAR, SelRange.cpMin, 0)'取得指定行第一個(gè)字符的位置LineIndex = SendMessage(TextControl.hWnd, EM_LINEINDEX, CurRow, 0)If SelRange.cpMin = LineIndex ThenGetCurPos.x = 1ElseTempStr = String(SelRange.cpMin - LineIndex, 13)'復(fù)制當(dāng)前行開(kāi)始到選擇文本開(kāi)始的文本CopyMemory ByVal StrPtr(TempStr), ByVal StrPtr(TempArray) + LineIndex, SelRange.cpMin - LineIndexTempArray = TempStr'刪除無(wú)用的信息ReDim Preserve TempArray(SelRange.cpMin - LineIndex - 1)'轉(zhuǎn)換為 UnicodeTempStr = StrConv(TempArray, vbUnicode)GetCurPos.x = Len(TempStr) + 1End IfGetCurPos.y = CurRow + 1End Function