当前位置:C++技术网 > 资讯 > 如何把光标移到编辑框中字符串末尾

如何把光标移到编辑框中字符串末尾

更新时间:2016-10-19 19:19:17浏览次数:1+次

    在Windows界面编程中,经常会去对编辑框的内容进行实时检测,比如实现一个数字框,只能输入数字和点。我们要实时检测输入的内容。当输入的内容符合某一个条件时,我们可能会对编辑框的内容做处理。比如说,输入一个#,我们显示当前的日期,然后就将光标定位到编辑框中字符的最后面。
    这一个应用场景已经遇见好多次了,所以有必要记录一下。因为比较实用,所以以备查询,也供大家参考。
    当然这里只是告诉你如何将光标设置到最后面。
    如果你用的是MFC开发,可以用CEdit控件类来操作编辑框。CEdit封装了绝大部分的编辑框的基本操作。我们也可以用win32的方式来实现。实现也就是发消息,调用win32的API函数,而API函数和MFC的控件类成员函数名字基本一致。所以用了MFC的控件类,我们也就可以很自然的切换到api来实现,或者发消息来实现。
    CEdit的成员函数SetSel就可以轻松实现“把编辑框中的光标移动到编辑框中字符的最后面”。虽然很简单,但是不知道的话,那就很难找。
    另外,我们可以模拟发送按键消息。也就是发送键盘上的“End”按键,就可以将光标移动到一行的最末尾,也可以达到这一效果。
    我们一般用SetSel函数来实现。这是一个习惯问题,每一个人习惯不一样。
    我们需要用代码移动光标,主要发生在我们在代码中主动设置了编辑框的内容,比如调用了SetWindowText或者SetDlgItemText之类的。设置了编辑框的内容之后,光标的位置并没有自动更新过来,这样就让你的输入不是在最后面了。所以,我们才需要用代码将光标移动到正确的位置。
    CEdit::SetSel(起始位置,结束位置),这样调用就可以了。这个函数是设置选中的字符串的,当起始和结束的位置一样时,则没有选中任何内容,而当两个位置都是结束位置时,光标就移动到了结束位置。基于这个原理,我们就可以将光标移动到末尾了。当然,我们可以移动到内容的任何位置,而不仅是最后。就这一点,可以让光标很灵活的移动。而模拟按键消息“End”只能移动到最后,如果要移动到后几个位置,可以发送方向键“→”的按键消息,一次向右移动一个字符,完全模拟手动按键。模拟按键是能够实现,但是和代码不能很好的融合,感觉比较生硬。当然,还是一个习惯问题。
    下面是MFC代码示例:
SetWindowText(_T("3000"));//编辑框的内容变为3000
SetSel(4,4);//将光标移动到索引为4的位置。当然你可以用获取字符串长度的形式得到这个4。

    下面是等价的win32的消息实现:
SendMessage( 
  (HWND) hWnd,       // 窗口句柄
  EM_SETSEL,         // 设置选择字符串
  (WPARAM) wParam,   // 起始位置
  (LPARAM) lParam    // 结束位置
);

    最后两个参数和SetSel一样,第一个是当前控件的窗口句柄。第二个参数固定。实际上SetSel内部就是发送了这个消息。我们不推荐在MFC环境中直接使用SendMessage,除非MFC没有包装。在MFC环境中用MFC包装的函数,是最方便的。
    顺带说明一下,模拟按键来移动光标的代码如下:
::SendMessage(hwnd, WM_KEYDOWN, VK_END, 0);//移到行最后面
::SendMessage(hwnd, WM_KEYDOWN, VK_RIGHT, 0);//向右移动一个字符
::SendMessage(hwnd, WM_KEYDOWN, VK_LEFT, 0);//向左移动一个字符

    其他的自己可以举一反三。