我已经被指派在C#中使用Windows窗体进行自定义网格控件。我不确定的一件事是如何处理显示闪烁的光标(插入符号)以指示正在进行单元格编辑的位置以及将显示下一个字符。
有谁知道如何使用标准文本框完成此操作?是否有一个标准的框架结构可以为我做这个?
显然我可以设置一个计时器并自己绘制光标,但我想知道是否有更好的选择。请注意,这是一个完全由用户绘制的控件,而不是UserControl衍生版本,并且由于各种原因,子类化现有类不是一个选项。
答案 0 :(得分: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();
}
我很乐意在确定把它放在哪里时推卸责任。
答案 1 :(得分:0)
关于Carets is here的MSDN参考。我最后一次看到(在框架的2.0中)插入符号不能用作托管API:因此您需要使用非托管API,或者绘制自己的插入符号。
当你实现一个插入符时,要记住的一件事是你不应该在你的控件没有焦点时显示它(在用户的桌面上一次只有一个控件,即具有输入焦点的控件,应该显示输入插入符号。)
答案 2 :(得分:0)
为什么重新发明轮子?只需在网格需要编辑时显示文本框。
好的,我看到你使用自定义绘图,但是什么阻止你在它上面放置一个文本框?
如果你想要努力,微软确实有一些旧的库可以提供虚拟文本区域(或类似的东西,很长)。