代码之家  ›  专栏  ›  技术社区  ›  Beardo

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

  •  2
  • Beardo  · 技术社区  · 17 年前

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

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

    3 回复  |  直到 17 年前
        1
  •  10
  •   Hans Passant    17 年前

    干得好:

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

    我很乐意推卸责任,把它放在哪里。

        2
  •  0
  •   ChrisW    17 年前

    MSDN参考关于 Carets is here . 上次我查看时(在框架的2.0中),插入符号不能作为托管API使用:因此您需要使用非托管API,或者绘制自己的插入符号。

    在实现插入符号时,需要记住的一点是,当控件没有焦点时,不应显示该插入符号(用户桌面上一次只有一个控件,即具有输入焦点的控件应始终显示输入插入符号)。

        3
  •  0
  •   leppie    17 年前

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

    如果你想努力的话,微软确实有一些旧的库可以提供一个虚拟文本区(或者类似的东西,已经很久了)。