10

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

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

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

4

4 回答 4

16

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

于 2009-03-04T10:32:23.447 回答
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);
    }
}
于 2009-03-04T10:42:56.620 回答
1

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

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

在这里查看winforms 中所有者绘制的文本框。

于 2009-03-04T10:28:22.473 回答
0

采用:

richTextBoxConsole.GetPositionFromCharIndex(cursorPos)

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

于 2017-01-30T09:17:09.770 回答