2009-02-11 54 views
2

我已经被分配到使用Windows窗体在C#中进行自定义网格控件。我不确定的一件事是如何处理显示一个闪烁的光标(插入符号)以指示单元编辑正在发生的位置,并显示下一个字符。如何在定制控件中包含游标(插入符号)?

有没有人知道这是怎么用标准的文本框?有没有一个标准的框架构造会为我做到这一点?

很显然,我可以设置一个计时器,并绘制光标自己,但我不知道是否有一个更好的选择。请注意,这是一个完全用户绘制的控件,而不是UserControl派生的,并且由于各种原因子类化现有类不是一个选项。

回答

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(); 
} 

我会很乐意传授搞清楚在哪里把它推卸责任。

+0

完美,谢谢! – Bearddo 2009-02-12 03:14:54

0

的MSDN参考关于Carets is here。我最后一次看到的是(框架2.0中的)插入符号不可用作托管API:因此您需要使用非托管API或绘制自己的插入符号。

当你实现一个插入符号时,要记住的一件事是,只要你的控件没有焦点,你就不应该显示它(一次只有一个控件在用户的桌面上,即有输入的控件重点,应该永远显示输入的插页)。

0

为什么重新发明轮子?只需在网格需要编辑时显示一个文本框。

好吧,我看您在使用自定义绘制,但什么阻止你把一个文本框上过来的吗?

如果你想要去的硬盘的方式,微软确实有一些老图书馆,可以提供一个虚拟的textarea(或类似的东西,是一个很长的)。