Пользовательский курсор для текстового поля WinForms
Вопрос
Я разрабатываю пользовательское приложение, подобное 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)
Спрячьте обычную каретку и нарисуйте свою собственную?Не тестировался, но, думаю, должен сработать.