WinForms TextBox的自定义插入
我正在WinForms .Net 2.0应用程序中开发类似应用程序的自定义HyperTerminal。 我在Panel中有一个多行TextBox,您可以在其中与硬件设备进行交互。
我的客户希望有一个自定义Caret,一个填充矩形,大小为一个字符空间,而不是默认的垂直线。
我知道.Net默认情况下不提供执行此操作的选项,但必须有一些Windowsfunction才能执行此操作。
假设一个带有文本框的表单:
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); } }
这些是Windows提供的Native Caretfunction列表,您可以将它们用于您的应用程序。
[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
我会使用System.Drawing绘制一个自定义光标(位图),可能还有一个计时器让它像另一个光标一样闪烁。
以像素为单位获取Cursor的当前位置,并在该光标上绘制位图。 找到正确的位置可能很棘手,但应该是可行的。
看看winforms中所有者绘制的文本框。
使用:
richTextBoxConsole.GetPositionFromCharIndex(cursorPos)
隐藏正常的插入符并绘制自己的插入符号? 没有测试,但我认为应该工作。
- Task.Run()中的Aync / Await操作
- 获取WPF Listview以使用数据绑定显示ObservableCollection
- 调整图像的亮度对比度和灰度系数
- 如何使用HttpWebRequest.Credentials属性进行基本身份validation?
- 为什么迭代GetConsumingEnumerable()不会完全清空底层的阻塞集合
- Silverlight MultiScaleImage的Source属性
- 将BlockingCollection 用作单生成器,单用户FIFO查询是否合适?
- Azure DocumentDB – HTTP请求中找到的MAC签名与计算的签名不同
- 如何在XAML中对齐ListView或ItemsControl中的每个n元素