Пользовательская каретка для WinForms TextBox - PullRequest
9 голосов
/ 04 марта 2009

Я занимаюсь разработкой специального приложения, подобного HyperTerminal, в приложении WinForms .Net 2.0. У меня есть многострочный TextBox на панели, в котором вы можете взаимодействовать с аппаратным устройством.

Мой клиент хочет иметь собственную карету, заполненный прямоугольник размером в один символьный интервал вместо вертикальной линии, которая по умолчанию.

Я знаю, что .Net не предоставляет возможности сделать это по умолчанию, но для этого должна быть какая-то функция Windows.

Ответы [ 4 ]

14 голосов
/ 04 марта 2009

Это список функций Native Caret, предоставляемых Windows, которые вы можете использовать для своего приложения.

    [DllImport("User32.dll")]
    static extern bool CreateCaret(IntPtr hWnd, int hBitmap, int nWidth, int nHeight);

    [DllImport("User32.dll")]
    static extern bool SetCaretPos(int x, int y);

    [DllImport("User32.dll")]
    static extern bool DestroyCaret();

    [DllImport("User32.dll")]
    static extern bool ShowCaret(IntPtr hWnd);

    [DllImport("User32.dll")]
    static extern bool HideCaret(IntPtr hWnd);

См. SharpDevelop, Исходный код @ src \ Libraries \ ICSharpCode.TextEditor \ Project \ Src \ Gui \ Caret.cs

8 голосов
/ 04 марта 2009

Предположим, форма с текстовым полем:

public partial class Form1 : Form
{
    [DllImport("user32.dll")]
    static extern bool CreateCaret(IntPtr hWnd, IntPtr hBitmap, int nWidth, int nHeight);
    [DllImport("user32.dll")]
    static extern bool ShowCaret(IntPtr hWnd);

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Shown(object sender, EventArgs e)
    {
        CreateCaret(textBox1.Handle, IntPtr.Zero, 10, textBox1.Height);
        ShowCaret(textBox1.Handle);
    }
}
1 голос
/ 04 марта 2009

Я бы использовал System.Drawing, чтобы нарисовать собственный курсор (растровое изображение), возможно, с таймером, чтобы он мигал, как другой курсор.

Получить текущую позицию курсора в пикселях и нарисовать растровое изображение над этим курсором. Может быть сложно найти правильную позицию, но должно быть выполнимо.

Посмотрите здесь Текст, нарисованный владельцем в winforms.

0 голосов
/ 30 января 2017

Использование:

richTextBoxConsole.GetPositionFromCharIndex(cursorPos)

Скрыть обычную карету и нарисовать свою? Не проверено, но, по-моему, должно работать.

...