我正在开发一个像WinForms .Net 2.0应用程序一样的自定义超级终端。我在面板中有一个多行文本框,您可以在其中与硬件设备进行交互。用于WinForms的自定义插入文本框
我的客户希望拥有一个自定义的插入符号,一个填充的矩形,一个字符空间的大小,而不是默认的垂直线。
我知道.Net没有提供默认选项,但必须有一些Windows功能才能做到这一点。
我正在开发一个像WinForms .Net 2.0应用程序一样的自定义超级终端。我在面板中有一个多行文本框,您可以在其中与硬件设备进行交互。用于WinForms的自定义插入文本框
我的客户希望拥有一个自定义的插入符号,一个填充的矩形,一个字符空间的大小,而不是默认的垂直线。
我知道.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);
}
}
我会使用System.Drawing绘制一个自定义光标(位图),也许有一个计时器让它像另一个光标一样闪烁。
以像素为单位获取光标的当前位置并在该光标上绘制位图。找到正确的位置可能会很棘手,但应该可行。
这些都是由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 \库\ ICSharpCode.TextEditor \项目的\ src \桂\ Caret.cs
用途:
richTextBoxConsole.GetPositionFromCharIndex(cursorPos)
隐藏在正常插入符号,绘制自己的?没有测试,但应该工作,我认为。
+1为sharpdevelop源码链接 – Marek 2009-11-18 15:44:32