当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何在自定义控件中包含光标(插入符号)?》经验,为你挑选了1个好方法。

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

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

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



1> Hans Passant..:

干得好:

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

我很乐意在确定把它放在哪里时推卸责任.

推荐阅读
可爱的天使keven_464
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有