| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3838 人关注过本帖
标题:如何读取改写textbox中光标所在行的内容?
只看楼主 加入收藏
jmasm
Rank: 1
等 级:新手上路
威 望:1
帖 子:368
专家分:0
注 册:2006-9-24
收藏
 问题点数:0 回复次数:5 
如何读取改写textbox中光标所在行的内容?
rt
搜索更多相关主题的帖子: textbox 光标 
2008-11-21 20:13
pariszh
该用户已被删除
收藏
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽
2008-11-21 20:22
三断笛
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:31
帖 子:1621
专家分:1617
注 册:2007-5-24
收藏
得分:0 
分两步
第一步:获取光标所在位置
有两种方法
第一种是用Selstart,但这要先计算每行最多字符数,再求模
第二种是用API获取位置,代码如下
Const EM_GETSEL = &HB0
Const EM_LINEFROMCHAR = &HC9
Const EM_LINEINDEX = &HBB

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 Sub GetCaretPos(ByVal TextHwnd As Long, Line As Long, Col As Long)

Dim i As Long, j As Long
Dim lParam As Long, wParam As Long
Dim k As Long

'首先向文本框传递EM_GETSEL消息以获取从起始位置到
'光标所在位置的字符数

i = SendMessage(TextHwnd, EM_GETSEL, wParam, lParam)
j = i / 2 ^ 16

'再向文本框传递EM_LINEFROMCHAR消息根据获得的字符
'数确定光标以获取所在行数

Line = SendMessage(TextHwnd, EM_LINEFROMCHAR, j, 0)
Line = Line+ 1

'向文本框传递EM_LINEINDEX消息以获取所在列数

k = SendMessage(TextHwnd, EM_LINEINDEX, -1, 0)
Col = j - k + 1
End Sub

第二步:获取光标所在行的数据
有多种方法,以下介绍三种
如果是以回车符分的行,可以用Split分割后用第一步获取的行索引所到对应行的数据

可以根据第一步得到光标所在行的起始位置和每行的字符数,把SelStart设置为该行的起始位置(行号*每行字数),然后用SelLength指定选择的长度为每行的字符串,然后直接使用SelText即可

如果没有用回车符分行而是自动换行,则要用API,网上有现成的代码:
程序代码:
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
2008-11-21 21:43
jmasm
Rank: 1
等 级:新手上路
威 望:1
帖 子:368
专家分:0
注 册:2006-9-24
收藏
得分:0 
谢谢两位朋友的回答
2008-11-22 14:38
fat_panda
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2005-4-5
收藏
得分:0 
学习了
2008-11-22 17:15
jyp19851119
Rank: 1
等 级:新手上路
帖 子:157
专家分:0
注 册:2008-2-26
收藏
得分:0 
2008-11-23 15:54
快速回复:如何读取改写textbox中光标所在行的内容?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015180 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved