我已經被分配到使用Windows窗體在C#中進行自定義網格控件。我不確定的一件事是如何處理顯示一個閃爍的光標(插入符號)以指示單元編輯正在發生的位置,並顯示下一個字符。如何在定製控件中包含遊標(插入符號)?
有沒有人知道這是怎麼用標準的文本框?有沒有一個標準的框架構造會爲我做到這一點?
很顯然,我可以設置一個計時器,並繪製光標自己,但我不知道是否有一個更好的選擇。請注意,這是一個完全用戶繪製的控件,而不是UserControl派生的,並且由於各種原因子類化現有類不是一個選項。
我已經被分配到使用Windows窗體在C#中進行自定義網格控件。我不確定的一件事是如何處理顯示一個閃爍的光標(插入符號)以指示單元編輯正在發生的位置,並顯示下一個字符。如何在定製控件中包含遊標(插入符號)?
有沒有人知道這是怎麼用標準的文本框?有沒有一個標準的框架構造會爲我做到這一點?
很顯然,我可以設置一個計時器,並繪製光標自己,但我不知道是否有一個更好的選擇。請注意,這是一個完全用戶繪製的控件,而不是UserControl派生的,並且由於各種原因子類化現有類不是一個選項。
在這裏你去:
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();
}
我會很樂意傳授搞清楚在哪裏把它推卸責任。
的MSDN參考關於Carets is here。我最後一次看到的是(框架2.0中的)插入符號不可用作託管API:因此您需要使用非託管API或繪製自己的插入符號。
當你實現一個插入符號時,要記住的一件事是,只要你的控件沒有焦點,你就不應該顯示它(一次只有一個控件在用戶的桌面上,即有輸入的控件重點,應該永遠顯示輸入的插頁)。
爲什麼重新發明輪子?只需在網格需要編輯時顯示一個文本框。
好吧,我看您在使用自定義繪製,但什麼阻止你把一個文本框上過來的嗎?
如果你想要去的硬盤的方式,微軟確實有一些老圖書館,可以提供一個虛擬的textarea(或類似的東西,是一個很長的)。
完美,謝謝! – Bearddo 2009-02-12 03:14:54