2009-03-04 9 views
9

Estoy desarrollando una aplicación similar a HyperTerminal personalizada en una aplicación WinForms .Net 2.0. Tengo un TextBox multilínea en un Panel en el que puedes interactuar con un dispositivo de hardware.Custom Caret para WinForms TextBox

Mi cliente desea tener un Caret personalizado, un rectángulo lleno del tamaño de un espacio de caracteres en lugar de la línea vertical que es por defecto.

Sé .NET no proporciona una opción para hacer esto por defecto, pero debe haber alguna función de Windows para hacerlo.

Respuesta

8

Asumir un formulario con un cuadro de texto en él:

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

Usaría System.Drawing para dibujar un cursor personalizado (mapa de bits), tal vez con un temporizador para permitir que parpadee como otro cursor.

Obtenga la posición actual del cursor en píxeles y dibuje un mapa de bits sobre ese cursor. Puede ser difícil encontrar la posición correcta, pero debería ser factible.

un vistazo aquí para Owner drawn textbox in winforms.

14

Estos son la lista de funciones nativas intercalación proporciona Windows que puede utilizar para usted aplicación.

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

Consulte SharpDevelop, Código Fuente @ src \ Libraries \ ICSharpCode.TextEditor \ proyecto \ Src \ Gui \ Caret.cs

+0

+1 para el enlace fuente sharpdevelop – Marek

0

uso:

richTextBoxConsole.GetPositionFromCharIndex(cursorPos) 

ocultar el cursor normal y sacar sus propias? No probado, pero debería funcionar, creo.