zoukankan      html  css  js  c++  java
  • 如何获得TextBox里光标位置

    这个问题来自论坛。

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

  • 相关阅读:
    ssh时传递环境变量
    linux删除文件后磁盘空间未释放的问题
    gitlab-ci配置疑难备忘
    javac老提示无效的标记
    unity5.6里Baked Lighting下面几个Lighting Mode的解释
    屌爆的xamarin,一人单挑google/apple/windows
    xamarin.droid自己的示例工程有些都装不上模拟器,是因为它的architectures选项没设对
    使用NFC读卡器ACR122u读取银行卡信息
    【转】Gnirehtet – 为 Android 设备提供反向网络连接[Windows、macOS、Linux]
    【转】1分钟学会U盘启动安装Linux系统
  • 原文地址:https://www.cnblogs.com/cl1024cl/p/6204953.html
Copyright © 2011-2022 走看看