【问题标题】:Windows forms: how to do a thick blinking cursor on a textbox?Windows 窗体:如何在文本框上显示粗闪烁光标?
【发布时间】:2009-05-21 17:50:44
【问题描述】:

我正在重写一个 Windows 窗体应用程序(更新框架、重写逻辑等),但有一件事我无法弄清楚它们是如何做到的。 原始应用程序中的文本框有一个粗大的闪烁光标,如下所示:http://screencast.com/t/8QYUcjuh3n

对于我的一生,我无法弄清楚如何做到这一点。请帮忙?

【问题讨论】:

    标签: .net winforms textbox


    【解决方案1】:

    您可以使用 pinvoke CreateCaret 完成此操作

    该示例使用带有按钮 (button1) 和文本框 (textBox1) 的 Winform。

    使用指令添加这个:

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

    将此代码添加到按钮单击事件中:

      // Thickness is set where I have 10.
      CreateCaret(textBox1.Handle, IntPtr.Zero, 10, textBox1.Height);
      ShowCaret(textBox1.Handle);
    

    单击按钮时,光标会变粗。

    还有一个关于这个here的讨论。

    【讨论】:

    • 非常感谢......现在我知道要搜索什么了,我知道他们是如何调用它的。实际上...这肯定是每日 WTF 赢家
    • 没问题。不幸的是,我的 WTF 不止是每天!
    • 实际上,我确实有这个问题,它似乎导致控制句柄和表单在不同的线程上创建。 form.Show() 因此会导致跨线程异常有什么想法吗?
    • 嗯,我不知道为什么会这样。我尝试代码时没有发现问题,但我构建的示例非常简单。我想知道您是否对下面链接的代码有更多的运气。正如您将看到的,提供的类通过添加相同的 API 调用扩展了 TextBox,但采用了“完整”解决方案。 (我承认虽然我没有在真实程序中尝试过代码)。无法在 cmets 中创建链接,所以在这里单独列出:social.msdn.microsoft.com/Forums/en-US/winforms/thread/… 祝你好运!
    猜你喜欢
    • 1970-01-01
    • 2011-12-22
    • 1970-01-01
    • 2010-11-22
    • 2010-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多