2009-03-04 2 views
9

Sto sviluppando un'applicazione personalizzata HyperTerminal in un'applicazione WinForms .Net 2.0. Ho un TextBox multilinea in un pannello in cui è possibile interagire con un dispositivo hardware.Custom Caret for WinForms TextBox

Il mio cliente desidera avere un Caret personalizzato, un rettangolo pieno della dimensione di uno spazio di carattere invece della linea verticale che è di default.

So che .Net non fornisce un'opzione per farlo in modo predefinito, ma ci deve essere una funzione di Windows per farlo.

risposta

8

assumere una forma con una casella di testo su di esso:

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

Vorrei utilizzare System.Drawing per disegnare un cursore personalizzato (bitmap), magari con un timer per farlo lampeggiare come un altro cursore.

Ottenere la posizione corrente del cursore in pixel e disegnare una bitmap su quel cursore. Può essere difficile trovare la posizione corretta, ma dovrebbe essere fattibile.

Date un'occhiata qui per Owner drawn textbox in winforms.

14

Questi sono l'elenco delle funzioni native Caret forniti da Windows è possibile utilizzare per voi applicazione.

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

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

+0

+1 per il collegamento sorgente sharpdevelop – Marek

0

Usa:

richTextBoxConsole.GetPositionFromCharIndex(cursorPos) 

Nascondi il cursore normale e trarre le vostre? Non testato, ma dovrebbe funzionare credo.