Пользовательский курсор для текстового поля WinForms

StackOverflow https://stackoverflow.com/questions/609927

  •  03-07-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

Примите форму с текстовым полем на ней:

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);
    }
}

Другие советы

Это список функций 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

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

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

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

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

richTextBoxConsole.GetPositionFromCharIndex(cursorPos)

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top