1

我需要处理在编辑控件(不是richedit 控件)中更改插入符号位置的事件。

我知道如何处理编辑中更改文本的事件,但我不知道如何处理更改编辑控件中插入符号位置的事件。

我希望有一个人可以帮助我。谢谢大家。

4

2 回答 2

2

一旦我通过子类化编辑控件 ( 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;
于 2017-11-19T12:07:03.137 回答
1

您可以通过发送一条EM_SETSEL消息来设置编辑控件中插入符号的位置,该消息从所需位置选择到相同位置:

SendMessage(hWnd, EM_SETSEL, pos, pos);

获取插入符号的位置需要发送EM_GETSEL消息。请注意,如果开始和结束在同一位置,则您知道插入符号的精确位置。如果有差异,则表示选择了文本,您可以将最后一个作为位置。

没有用于仅跟踪插入符号/选择更改的特定事件。在您的事件循环中,您需要捕获按键和鼠标事件,并检查它们是否改变了位置。但是,您难道不能仅在需要时才读取插入符号的位置而不是主动跟踪它吗?

于 2017-11-19T00:02:00.867 回答