Question

Je développe une application personnalisée comme HyperTerminal dans une application WinForms .Net 2.0. J'ai un TextBox multiligne dans un panneau dans lequel vous pouvez interagir avec un périphérique matériel.

Mon client souhaite un caret personnalisé, un rectangle plein de la taille d'un espace de caractère au lieu de la ligne verticale par défaut.

Je sais que .Net ne fournit pas d’option pour le faire par défaut, mais certaines fonctions de Windows doivent le faire.

Était-ce utile?

La solution

Supposons un formulaire comportant une zone de texte:

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

Autres conseils

Voici la liste des fonctions Native Caret fournies par Windows que vous pouvez utiliser pour votre 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);

Référez-vous à SharpDevelop, code source @ src \ Libraries \ ICSharpCode.TextEditor \ Project \ Src \ Gui \ Caret.cs

J'utiliserais System.Drawing pour dessiner un curseur personnalisé (bitmap), éventuellement avec une minuterie pour le laisser clignoter comme un autre curseur.

Obtenez la position actuelle du curseur en pixels et tracez un bitmap sur ce curseur. Peut être délicat à trouver la bonne position, mais devrait être faisable.

Regardez ici pour Zone de texte dessinée par le propriétaire dans Winforms.

Utiliser:

richTextBoxConsole.GetPositionFromCharIndex(cursorPos)

Cachez le curseur normal et dessinez le vôtre? Non testé, mais devrait fonctionner, je pense.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top