【问题标题】:Custom Caret for WinForms TextBoxWinForms 文本框的自定义插入符号
【发布时间】:2010-10-11 05:30:36
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# .net winforms caret


    【解决方案1】:

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

    【讨论】:

    • CreateCarethBitmap 参数应输入为IntPtr 而不是int,因为它被声明为HBITMAP,这是void* 的typedef。
    【解决方案2】:

    假设一个带有文本框的表单:

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

    【讨论】:

      【解决方案3】:

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

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

      在这里查看Owner drawn textbox in winforms.

      【讨论】:

        【解决方案4】:

        用途:

        richTextBoxConsole.GetPositionFromCharIndex(cursorPos)
        

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-03-06
          • 2011-01-08
          • 2016-10-06
          • 1970-01-01
          • 2014-11-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多