在C#中的文本框中更改插入符号(光标)

时间:2015-09-22 14:55:23

标签: c# textbox caret

我想在C#中的文本框中更改Caret,它看起来像旧的DOS应用程序中的更宽。

我有什么:enter image description here

我想要的例子: enter image description here

我试过了:

using System.Runtime.InteropServices;

...

  [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 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, 20, textBox1.Height);
        ShowCaret(textBox1.Handle);
    }
}

但它看起来仍然一样。你能帮忙的话,我会很高兴。提前谢谢!

编辑:

这只是一个例子。我的真实代码如下:

TextBox textbox = new TextBox();
 textbox.MaxLength = fieldLength;
 textbox.Width = fieldLength*24;
 textbox.MaxLength = maxChars;
 this.Controls.Add(textbox);

 CreateCaret(textbox.Handle, IntPtr.Zero, 20, textbox.Height);
 ShowCaret(textbox.Handle);

代码被调用,但不会改变任何东西。

Edit2:

我试过这个例子但它运行正常,但我的问题仍然存在: 在创建文本框时我无法更改Caret。它只能用于使用表单创建的文本框。

2 个答案:

答案 0 :(得分:3)

您没有正确链接事件,您应该更改为:

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();
        this.Shown += Form1_Shown;
    }

    private void Form1_Shown(object sender, EventArgs e)
    {
        CreateCaret(textBox1.Handle, IntPtr.Zero, 20, textBox1.Height);
        ShowCaret(textBox1.Handle);
    }
}

答案 1 :(得分:0)

看来发生的事件似乎只是最初有效。当您通过Tab键离开文本框并返回控件时,插入符号将被基础代码重置。

this主题中查看答案。

我拿了他们的DrawDaret方法并改了一下。在textbox1.Enter事件上调用DrawCaret不起作用。可能文本框实现将通知Enter事件,然后更改插入符号。这将撤消Enter事件处理程序中与插入符相关的更改。

修改

但是控件也有一个可以使用的GotFocus事件。

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

        textBox1.GotFocus += new EventHandler(textBox1_GotFocus);
    }

    void textBox1_GotFocus(object sender, EventArgs e)
    {
        DrawCaret(textBox1);
    }

    public void DrawCaret(Control ctrl)
    {
        var nHeight = 0;
        var nWidth = 10;

        nHeight = Font.Height;

        CreateCaret(ctrl.Handle, IntPtr.Zero, nWidth, nHeight);
        ShowCaret(ctrl.Handle);
    }
}