如何在自定义控件中包含光标(插入符号)?

时间:2009-02-11 22:26:28

标签: c# winforms

我已经被指派在C#中使用Windows窗体进行自定义网格控件。我不确定的一件事是如何处理显示闪烁的光标(插入符号)以指示正在进行单元格编辑的位置以及将显示下一个字符。

有谁知道如何使用标准文本框完成此操作?是否有一个标准的框架结构可以为我做这个?

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

3 个答案:

答案 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)

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

好的,我看到你使用自定义绘图,但是什么阻止你在它上面放置一个文本框?

如果你想要努力,微软确实有一些旧的库可以提供虚拟文本区域(或类似的东西,很长)。