繁体   English   中英

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

[英]Change Caret (Cursor) in Textbox in C#

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

是)我有的: 在此输入图像描述

我想要的例子: 在此输入图像描述

我试过了:

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。 它只能用于使用表单创建的文本框。

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

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

似乎发生了什么事情,所显示的事件最初只会起作用。 当您通过Tab键离开文本框并返回控件时,插入符号将被基础代码重置。

看看这个帖子中的答案。

我拿了他们的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);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM