2009-02-11 56 views
2

我已經被分配到使用Windows窗體在C#中進行自定義網格控件。我不確定的一件事是如何處理顯示一個閃爍的光標(插入符號)以指示單元編輯正在發生的位置,並顯示下一個字符。如何在定製控件中包含遊標(插入符號)?

有沒有人知道這是怎麼用標準的文本框?有沒有一個標準的框架構造會爲我做到這一點?

很顯然,我可以設置一個計時器,並繪製光標自己,但我不知道是否有一個更好的選擇。請注意,這是一個完全用戶繪製的控件,而不是UserControl派生的,並且由於各種原因子類化現有類不是一個選項。

回答

10

在這裏你去:

using System; 
using System.Drawing; 
using System.Windows.Forms; 
using System.Runtime.InteropServices; 

public class MyWidget : Control { 
    public MyWidget() { 
    this.BackColor = Color.Yellow; 
    } 
    protected override void OnGotFocus(EventArgs e) { 
    CreateCaret(this.Handle, IntPtr.Zero, 2, this.Height - 2); 
    SetCaretPos(2, 1); 
    ShowCaret(this.Handle); 
    base.OnGotFocus(e); 
    } 
    protected override void OnLostFocus(EventArgs e) { 
    DestroyCaret(); 
    base.OnLostFocus(e); 
    } 
    [DllImport("user32.dll", SetLastError = true)] 
    private static extern bool CreateCaret(IntPtr hWnd, IntPtr hBmp, int w, int h); 
    [DllImport("user32.dll", SetLastError = true)] 
    private static extern bool SetCaretPos(int x, int y); 
    [DllImport("user32.dll", SetLastError = true)] 
    private static extern bool ShowCaret(IntPtr hWnd); 
    [DllImport("user32.dll", SetLastError = true)] 
    private static extern bool DestroyCaret(); 
} 

我會很樂意傳授搞清楚在哪裏把它推卸責任。

+0

完美,謝謝! – Bearddo 2009-02-12 03:14:54

0

的MSDN參考關於Carets is here。我最後一次看到的是(框架2.0中的)插入符號不可用作託管API:因此您需要使用非託管API或繪製自己的插入符號。

當你實現一個插入符號時,要記住的一件事是,只要你的控件沒有焦點,你就不應該顯示它(一次只有一個控件在用戶的桌面上,即有輸入的控件重點,應該永遠顯示輸入的插頁)。

0

爲什麼重新發明輪子?只需在網格需要編輯時顯示一個文本框。

好吧,我看您在使用自定義繪製,但什麼阻止你把一個文本框上過來的嗎?

如果你想要去的硬盤的方式,微軟確實有一些老圖書館,可以提供一個虛擬的textarea(或類似的東西,是一個很長的)。