| 首页 | 新闻 | 网页 | 设计 | 色彩 | 原创 | 视觉 | 素材 | 动漫 | 酷站 | 策划 | 文案 | 访谈 | 运营 | 编程 | 数据库 | 服务器 | 下载 | 图库 | 
您的位置: 幽幽天空 > 网页 > 编程开发 > VB教程 > 文章正文 用户登录
著名IT博客TechCr
Better fonts免费
Symantec提供免费
tennal 的创业经历
电子商务:能取得
网站赚钱指南之:
谁杀死了站长(We
FlashMX2004的事件
Flash Lite 与 J2
清理setInterval

取得TextBox、RichTextBox光标所在的行和列(支持中文)修正           

取得TextBox、RichTextBox光标所在的行和列(支持中文)修正

作者:佚名 来源:不详 更新:2006-8-25 21:05:35 错误报告 我要投稿
功能:取得TextBox、RichTextBox光标所在的行和列

'支持中文,一个汉字算一列
'有问题请给我写邮件
'作者:Matrix
'邮件:ASPBIT@163.COM
'2003-01-24修正了马虎的错误
'************************************************************

Option Explicit

Public Const WM_USER = &H400
Public Const EM_EXGETSEL = WM_USER + 52

Public Const EM_LINEFROMCHAR = &HC9
Public Const EM_LINEINDEX = &HBB
Public Const EM_GETSEL = &HB0

Public Type CHARRANGE
    cpMin As Long
    cpMax As Long
End Type

Public Type POINTAPI
        x As Long
        y As Long
End Type

Public Declare Function SendMessage Lib "user32" Alias _
        "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As _
        Long, ByVal wParam As Long, lParam As Any) As Long

Public Declare Sub CopyMemory Lib "kernel32" Alias _
        "RtlMoveMemory" (pDst As Any, pSrc As Any, _
        ByVal ByteLen As Long)


'取得光标所在的行和列
Public Function GetCurPos(ByRef TextControl As Control) As POINTAPI
    Dim LineIndex As Long
    Dim SelRange As CHARRANGE
    Dim TempStr As String
    Dim TempArray() As Byte
    Dim CurRow As Long
    Dim CurPos As POINTAPI

    TempArray = StrConv(TextControl.Text, vbFromUnicode)

    '取得当前被选中文本的位置 适用于 RichTextBox
    'TextControl 用 EM_GETSEL 消息
    Call SendMessage(TextControl.hWnd, EM_EXGETSEL, 0, SelRange)

    '根据参数wParam指定的字符位置返回该字符所在的行号
    CurRow = SendMessage(TextControl.hWnd, EM_LINEFROMCHAR, SelRange.cpMin, 0)

    '取得指定行第一个字符的位置
    LineIndex = SendMessage(TextControl.hWnd, EM_LINEINDEX, CurRow, 0)

    If SelRange.cpMin = LineIndex Then
        GetCurPos.x = 1
    Else

        TempStr = String(SelRange.cpMin - LineIndex, 13)

        '复制当前行开始到选择文本开始的文本
        CopyMemory ByVal StrPtr(TempStr), ByVal StrPtr(TempArray) + LineIndex, SelRange.cpMin - LineIndex
        TempArray = TempStr

        '删除无用的信息
        ReDim Preserve TempArray(SelRange.cpMin - LineIndex - 1)

        '转换为 Unicode
        TempStr = StrConv(TempArray, vbUnicode)

        GetCurPos.x = Len(TempStr) + 1
    End If
    GetCurPos.y = CurRow + 1
End Function

文章录入:skyuu    责任编辑:skyuu 
  • 上一篇文章:

  • 下一篇文章:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    发表评论:
    姓名:  评 分: 1分 2分 3分 4分 5分
     
  • 严禁发表危害国家安全、政治、黄色淫秽等内容的评论。
  • 用户需对自己在使用幽幽天空服务过程中的行为承担法律责任。
  • 本站管理员有权保留或删除评论内容。
  • 评论内容只代表机友个人观点,与本网站立场无关。