WinForms TextBox的自定义插入

时间:2009-03-04 09:59:00

标签: c# .net winforms caret

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

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

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

4 个答案:

答案 0 :(得分:14)

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

    [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

答案 1 :(得分:8)

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

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

答案 2 :(得分:1)

我会使用System.Drawing来绘制一个自定义光标(位图),可能还有一个计时器让它像另一个光标一样闪烁。

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

在这里查看Owner drawn textbox in winforms.

答案 3 :(得分:0)

使用:

richTextBoxConsole.GetPositionFromCharIndex(cursorPos)

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