WinForms.Net2.0アプリケーションでカスタムハイパーターミナルのようなアプリケーションを開発しています。パネルに複数行のTextBoxがあり、ハードウェアデバイスと対話できます。
私の顧客は、デフォルトの縦線ではなく、1文字のスペースのサイズの塗りつぶされた長方形であるカスタムCaretを望んでいます。
.Netにはデフォルトでこれを行うオプションがないことは知っていますが、これを行うにはWindows関数が必要です。
これらは、アプリケーションで使用できる Windows によって提供されるネイティブ キャレット関数のリストです。
[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);
SharpDevelop、ソース コード @ src\Libraries\ICSharpCode.TextEditor\Project\Src\Gui\Caret.cs を参照してください。
テキストボックスがあるフォームを想定します。
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);
}
}
System.Drawing を使用してカスタム カーソル (ビットマップ) を描画します。タイマーを使用して別のカーソルのように点滅させることもできます。
Cursor の現在の位置をピクセル単位で取得し、そのカーソル上にビットマップを描画します。正しい位置を見つけるのは難しいかもしれませんが、実行できるはずです。
winforms の所有者描画テキストボックスについては、こちらをご覧ください。
使用する:
richTextBoxConsole.GetPositionFromCharIndex(cursorPos)
通常のキャレットを非表示にして、独自のキャレットを描画しますか? テストされていませんが、動作するはずです。