Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Custom Caret for WinForms TextBox

I'm developing a custom HyperTerminal like application in a WinForms .Net 2.0 application. I have a multiline TextBox in a Panel in which you can interact with a hardware device.

My customer wants to have a custom Caret, a filled rectangle the size of one character space instead of the vertical line that is by default.

I know .Net does not provide an option to do this by default, but there must some Windows function to do it.

like image 499
Rogier Avatar asked Mar 04 '09 09:03

Rogier


3 Answers

These are the list of Native Caret functions provided by Windows you can use them for you application.

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

Refer SharpDevelop, Source Code @ src\Libraries\ICSharpCode.TextEditor\Project\Src\Gui\Caret.cs

like image 157
NileshChauhan Avatar answered Nov 01 '22 01:11

NileshChauhan


Assume a form with a textbox on it:

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);
    }
}
like image 8
Julian de Wit Avatar answered Nov 01 '22 00:11

Julian de Wit


I would use System.Drawing to draw a custom cursor (bitmap), maybe with a timer to let it blink like another cursor.

Get the current position of the Cursor in pixels and draw a bitmap over that cursor. Can be tricky to find the correct position, but should be doable.

Have a look here for Owner drawn textbox in winforms.

like image 1
Peter Gfader Avatar answered Nov 01 '22 01:11

Peter Gfader