这一个应用场景已经遇见好多次了,所以有必要记录一下。因为比较实用,所以以备查询,也供大家参考。
当然这里只是告诉你如何将光标设置到最后面。
如果你用的是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);//向左移动一个字符
其他的自己可以举一反三。