2009-03-04 53 views
9

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

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

我知道.Net没有提供默认选项,但必须有一些Windows功能才能做到这一点。

回答

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

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

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

看一看这里Owner drawn textbox in winforms.

14

这些都是由Windows提供的本地插入符号功能,你可以用它们为你的应用程序列表。

[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 \库\ ICSharpCode.TextEditor \项目的\ src \桂\ Caret.cs

+0

+1为sharpdevelop源码链接 – Marek 2009-11-18 15:44:32

0

用途:

richTextBoxConsole.GetPositionFromCharIndex(cursorPos) 

隐藏在正常插入符号,绘制自己的?没有测试,但应该工作,我认为。