如何处理更改插入符号位置的事件
How can I handle event of changing caret pos?
我需要处理在编辑控件(不是 richedit 控件(中更改插入符号 pos 的事件。
我知道如何处理编辑中更改文本的事件,但我不知道如何处理在编辑控件中更改插入符号位置的事件。
我希望有人能帮助我。谢谢大家。
一旦我完成了此操作,通过子类化编辑控件 (SetWindowLongPtr
( 并在可能移动插入符号的消息上向父窗口发送消息来在状态栏上显示行号。
#define CARET_MOVED_COMMAND_ID 50001
WNDPROC OriginalEditProc = 0;
HWND OriginalEditParent = 0;
LRESULT WINAPI MyEditProc( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam )
{
// Handle message by original edit control procedure.
LRESULT result = CallWindowProc( OriginalEditProc, hwnd, msg, wparam, lparam );
switch ( msg )
{
case WM_CHAR:
case WM_KEYDOWN:
case WM_KEYUP:
case WM_LBUTTONDOWN:
case WM_LBUTTONUP:
case WM_LBUTTONDBLCLK:
case WM_RBUTTONDOWN:
case WM_RBUTTONUP:
case WM_RBUTTONDBLCLK:
case WM_MBUTTONDOWN:
case WM_MBUTTONUP:
case WM_MBUTTONDBLCLK:
case EM_SETSEL:
// And maybe others...
// Notify parent of posible caret move.
// You can recreate EN_SELCHANGE behavior, I have been too lazy
// and was just sending command (like from menu).
SendMessage( OriginalEditParent, WM_COMMAND, MAKEWPARAM( CARET_MOVED_COMMAND_ID, 0 ), 0 );
break;
}
return result;
}
// ---- In initialization code ----
// subclass
OriginalEditParent = MyMainWindow;
OriginalEditProc = (WNDPROC) SetWindowLongPtr( EditBoxHwnd, GWLP_WNDPROC, (LONG_PTR)MyEditProc );
// ---- In parent window message handling ----
case WM_COMMAND:
switch ( LOWORD( wparam ) )
{
case CARET_MOVED_COMMAND_ID:
{
// You sould execute this code in EN_CHANGE handler,
// so it can handle cuting, pasting, undo etc.
int line = (int) SendMessage( EditBoxHwnd, EM_LINEFROMCHAR, -1, 0 );
// Update status bar. Could be optimized by remembering
// displayed line number and updating only when it changes.
wchar_t buff[50];
wsprintf( buff, L"%d", line );
SendMessage( StatusBarHwnd, SB_SETTEXT, MAKEWPARAM( 1, SBT_NOBORDERS ), (LPARAM) buff );
}
break;
}
break;
可以通过发送一条EM_SETSEL
消息来设置插入符号在编辑控件中的位置,该消息从所需位置选择到同一位置:
SendMessage(hWnd, EM_SETSEL, pos, pos);
获取插入符号的位置需要发送EM_GETSEL
消息。 请注意,如果开始和结束位于同一位置,则您知道插入符号的精确位置。 如果存在差异,则表示选择了文本,您可以将最后一个文本作为位置。
没有用于仅跟踪插入符号/选择更改的特定事件。 在事件循环中,您需要捕获按键和鼠标事件,并检查它们是否更改了位置。但是,您是否可能仅在需要时读取插入符号位置而不是主动跟踪它?
相关文章:
- 在数字之间插入 + 或 - 符号以使其等于整数
- C++如果旋转是特定字符,请插入符号
- 检测键按事件 - Qt C++上的插入符号 (^) 键
- 设置诊断:插入符号来自 CMakeLists.txt
- 如何处理更改插入符号位置的事件
- 如何在禁用的MFC CEdit控件中显示插入符号
- C++ Win32 从编辑框中隐藏(禁用)插入符号
- SQLite C++插入无符号字符数组
- 在 SQL Server 中插入'€'符号并获取'?'
- 插入标头后出现无法解决的外部符号错误(LNK2019)
- EM_EXGETSEL与文本选择顺序无关.如何确定一段选定文本中的插入符号位置
- Win32 编辑控件没有插入符号
- ^(插入符号)在C++中是什么意思,就像在String^中一样
- 在richit winapi中隐藏插入符号
- 如何在std::string中插入无符号char*变量
- 在c++中向*char类型的数组中插入符号
- 如何在C++中使用插入符号"^"进行幂运算
- c++插入数字直到某个符号
- 无法在矩阵中插入符号
- 当插入符号在最后一个位置时,EM_POSFROMCHAR没有返回正确的值