快速业务通道

如何获得TextBox里光标位置

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-19

这个问题来自论坛。

第一反应是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!!!

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号