您的位置:首页 > 其它

如何获得TextBox里光标位置

2008-04-17 20:05 197 查看
这个问题来自论坛。

第一反应是SelectionStart属性,结果发现在分方向选择内容时返回错误值,真正答案如下:



using
System;



using
System.ComponentModel;



using
System.Windows.Forms;



using
System.Runtime.InteropServices;



using
System.Drawing;



namespace
WindowsApplication5





...
{




public

partial

class
Form1 : Form






...
{




public
Form1()






...
{



InitializeComponent();



}



[DllImport(
"
user32.dll
"
)]




private

static

extern

bool
GetCaretPos(
out
Point ppt);






private

void
Form1_Load(
object
sender, EventArgs e)






...
{




this
.textBox1.Text
=

"
jinjazz
"
;



}




private

void
Form1_MouseDown(
object
sender, MouseEventArgs e)






...
{



Point p;



GetCaretPos(
out
p);




int
i
=
this
.textBox1.GetCharIndexFromPosition(p);




this
.Text
=
i.ToString();





}



}



}

在zswang(偶最pf的伴水)的提醒下,上面方法存在两个遗漏,zswang的补充如下:

1、当输入焦点没有在编辑框中(比如有多个输入框),这样光标的位置获取并非指定。

当然可以考虑获取之前先Focus()一下。

2、GetCharIndexFromPosition()方法有缺陷,当光标在最后一个字符来回的时候数值不变-_-!!!得完善一下。




public

virtual

int
GetCharIndexFromPosition(Point pt)





...
{




int
lParam
=
NativeMethods.Util.MAKELONG(pt.X, pt.Y);




int
n
=
(
int
) UnsafeNativeMethods.SendMessage(
new
HandleRef(
this
,
base
.Handle),
0xd7
,
0
, lParam);
//
EM_CHARFROMPOS = 0xd7



n
=
NativeMethods.Util.LOWORD(n);




if
(n
<

0
)






...
{




return

0
;



}




string
text
=

this
.Text;




if
(n
>=
text.Length)






...
{



n
=
Math.Max(text.Length
-

1
,
0
);
//
<<<<<<<



}




return
n;



}



感谢zswang!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: