2009-03-04 25 views
9

Tôi đang phát triển một ứng dụng HyperTerminal tùy chỉnh giống như ứng dụng trong ứng dụng WinForms .Net 2.0. Tôi có một TextBox đa dòng trong một Panel mà bạn có thể tương tác với một thiết bị phần cứng.Custom Caret cho WinForms TextBox

Khách hàng của tôi muốn có Dấu trang tùy chỉnh, hình chữ nhật được lấp đầy kích thước của một không gian ký tự thay vì dòng dọc theo mặc định.

Tôi biết .Net không cung cấp tùy chọn để thực hiện việc này theo mặc định, nhưng phải có một số chức năng của Windows để thực hiện.

Trả lời

8

Giả sử một mẫu với một textbox trên đó:

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

Tôi sẽ sử dụng System.Drawing để vẽ con trỏ tùy chỉnh (bitmap), có thể với bộ hẹn giờ để cho nó nhấp nháy giống như con trỏ khác.

Lấy vị trí hiện tại của Con trỏ theo pixel và vẽ bitmap trên con trỏ đó. Có thể khó khăn để tìm vị trí chính xác, nhưng phải có thể thực hiện được.

Có một cái nhìn vào đây để Owner drawn textbox in winforms.

14

Đây là danh sách các hàm Native Caret cung cấp bởi Windows bạn có thể sử dụng chúng cho bạn ứng dụng.

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

Tham khảo SharpDevelop, Source Code @ src \ Libraries \ ICSharpCode.TextEditor \ Project \ Src \ Gui \ Caret.cs

+0

+1 cho liên kết nguồn sharpdevelop – Marek

0

Sử dụng:

richTextBoxConsole.GetPositionFromCharIndex(cursorPos) 

Ẩn dấu mũ bình thường và vẽ của riêng bạn? Chưa thử nghiệm, nhưng nên làm việc tôi nghĩ.