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

原创 2003年01月24日 17:36:00

'************************************************************
'功能:取得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

C# RichTextBox 获取当前光标的行号列号

获得行和列的快速方法要用到  GetFirstCharIndexOfCurrentLine()、.GetLineFromCharIndex(int  index)、SelectionStart 自定义...
  • ou832339
  • ou832339
  • 2014年03月18日 03:13
  • 2701

有格式文本控件RichTextBox(文本类控件)

有格式文本控件(RichTextBox)用于显示、输入和操作带有格式的文本。RichTextBox控件除了执行TextBox控件的所有功能之外,还可以显示字体、颜色和链接,从文件加载文本和嵌入的图像,...
  • vjudge
  • vjudge
  • 2014年04月28日 11:13
  • 1477

c# RichTextBox 垂直居中 边距设置

附件 http://files.cnblogs.com/xe2011/richTextBox_EM_SETRECT.rar   using System.Runtime.Int...
  • yangbindxj
  • yangbindxj
  • 2014年01月10日 14:11
  • 5250

精彩编程与编程技巧-如何取得RichTextBox控件中光标所在行的值?...

  • 2009年10月10日 23:34
  • 547B
  • 下载

C#中取得TextBox多行文本的行、列位置与定位

在模仿Windows自带的记事本做练习时,发现TextBox控件没有直接的办法取得当前的行和列的位置,也没有定位的功能。查了资料发现可以能过Windows API来实现,具体要用到SendMessag...
  • ouyangin10
  • ouyangin10
  • 2011年05月03日 12:52
  • 1533

C# richTextBox TextBox赋值失败的奇葩问题

今遇一奇葩问题,将非空String类型变量的值,赋值给 richTextBox,显示为空! 具体如图 可是重新写个程序测试却正常,具体测试代码如下: namespace StringText {...
  • A746605205
  • A746605205
  • 2016年01月30日 21:40
  • 187

支持中文链接的RichTextBox

  • 2008年04月02日 17:06
  • 23KB
  • 下载

winform中去掉richtextbox中的光标

  • 2017年11月10日 17:31
  • 9KB
  • 下载

winform textbox 输入状态下隐藏光标

只能通过WINDOWS API的HideCaret函数来实现 HideCaret函数的申明: [DllImport("user32", EntryPoint = "HideCaret")]...
  • LOVE_GG
  • LOVE_GG
  • 2012年07月29日 18:30
  • 1536

用上下左右箭头键在textbox中的光标跳转

How to allow up and down arrows to navigate your form fieldsOctober 5th, 2008 by Robert ...
  • ztguang
  • ztguang
  • 2016年03月30日 10:31
  • 277
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:取得TextBox、RichTextBox光标所在的行和列(支持中文)修正
举报原因:
原因补充:

(最多只允许输入30个字)