2009-03-04 15 views
9

Ich entwickle eine benutzerdefinierte HyperTerminal wie Anwendung in einer WinForms .Net 2.0-Anwendung. Ich habe eine mehrzeilige TextBox in einem Panel, in der Sie mit einem Hardwaregerät interagieren können.Benutzerdefinierte Caret für WinForms TextBox

Mein Kunde möchte ein benutzerdefiniertes Caret haben, ein ausgefülltes Rechteck mit der Größe eines Zeichenbereichs anstelle der vertikalen Linie, die standardmäßig angezeigt wird.

Ich weiß. NET bietet keine Option, dies standardmäßig zu tun, aber es muss einige Windows-Funktion, um es zu tun.

Antwort

8

Angenommen, ein Formular mit einem Textfeld auf es:

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

Ich würde System.Drawing verwenden, um einen benutzerdefinierten Cursor (Bitmap) zu zeichnen, vielleicht mit einem Timer, um es wie ein anderer Cursor blinken zu lassen.

Die aktuelle Position des Cursors in Pixeln ermitteln und eine Bitmap über diesen Cursor zeichnen. Kann schwierig sein, die richtige Position zu finden, sollte aber machbar sein.

Werfen Sie einen Blick hier für Owner drawn textbox in winforms.

14

Dies sind die Liste der Native Caret Funktionen von Windows bereitgestellt Sie sie für Ihre Anwendung verwenden können.

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

Siehe SharpDevelop, Quellcode @ src \ Bibliotheken \ ICSharpCode.TextEditor \ Project \ Src \ Gui \ Caret.cs

+0

+1 für die SharpDevelop-Source-Link – Marek

0

Verwendung:

richTextBoxConsole.GetPositionFromCharIndex(cursorPos) 

die normalen caret ausblenden und Ihre eigenen ziehen? Nicht getestet, sollte aber funktionieren, denke ich.

Verwandte Themen