WinForms文本框自定义光标

10

我正在开发一个类似HyperTerminal的自定义应用程序,使用WinForms .Net 2.0应用程序。 我在面板中有一个多行文本框,可以与硬件设备进行交互。

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

我知道 .Net 默认不提供此选项,但肯定有一些 Windows 函数可以实现这个功能。

4个回答

16

这些是 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


1
CreateCaret的hBitmap参数应该被声明为IntPtr而不是int,因为它被声明为HBITMAP,这是void*的typedef。 - Dai

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

1

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

获取光标在像素中的当前位置,并在其上绘制位图。找到正确的位置可能有些棘手,但应该是可行的。

请参考这里的WinForms中的自绘文本框


0

使用:

richTextBoxConsole.GetPositionFromCharIndex(cursorPos)

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接