WinForms TextBox的自定义插入

我正在WinForms .Net 2.0应用程序中开发类似应用程序的自定义HyperTerminal。 我在Panel中有一个多行TextBox,您可以在其中与硬件设备进行交互。

我的客户希望有一个自定义Caret,一个填充矩形,大小为一个字符空间,而不是默认的垂直线。

我知道.Net默认情况下不提供执行此操作的选项,但必须有一些Windowsfunction才能执行此操作。

假设一个带有文本框的表单:

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

这些是Windows提供的Native Caretfunction列表,您可以将它们用于您的应用程序。

  [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绘制一个自定义光标(位图),可能还有一个计时器让它像另一个光标一样闪烁。

以像素为单位获取Cursor的当前位置,并在该光标上绘制位图。 找到正确的位置可能很棘手,但应该是可行的。

看看winforms中所有者绘制的文本框。

使用:

 richTextBoxConsole.GetPositionFromCharIndex(cursorPos) 

隐藏正常的插入符并绘制自己的插入符号? 没有测试,但我认为应该工作。