我被指派用 C# 和 Windows 窗体制作自定义网格控件。我不确定的一件事是如何处理显示闪烁的光标(插入符号)以指示单元格编辑正在进行的位置以及将显示下一个字符。
有谁知道这是如何使用标准文本框完成的?是否有一个标准框架结构可以为我做到这一点?
显然我可以设置一个计时器并自己绘制光标,但我想知道是否有更好的选择。请注意,这是一个完全由用户绘制的控件,而不是 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();
}
我很乐意把责任推卸给弄清楚把它放在哪里。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)