在有些时候,我们需要在自己的控件中加入象TextBox一样的插入符
这个功能可以使用Windows API完成
因此我封装了Caret的API,形成了Caret组件,可以方便的在控件设计中使用
转载请注明出处,如果您要使用该代码,请告之作者
这个功能可以使用Windows API完成
因此我封装了Caret的API,形成了Caret组件,可以方便的在控件设计中使用
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace Klezard.Windows.Forms
{
/// <summary>
/// 插入符
/// </summary>
public sealed class Caret : System.ComponentModel.Component
{
Native
private Control _HostControl;
private Caret() { }
/// <summary>
/// 创建一个插入符
/// </summary>
/// <param name="ctl">插入符宿主</param>
/// <remarks>创建完成后插入符默认为隐藏的</remarks>
public Caret(Control ctl):this(ctl,8,16) { }
/// <summary>
/// 使用特定的大小创建一个插入符
/// </summary>
/// <param name="ctl">宿主</param>
/// <param name="width">宽度</param>
/// <param name="height">高度</param>
/// <remarks>创建完成后插入符默认为隐藏的</remarks>
public Caret(Control ctl, int width, int height):this(ctl,true,width,height){}
/// <summary>
/// 使用特定的大小创建一个插入符,可以指定黑色或灰色
/// </summary>
/// <param name="ctl">插入符宿主</param>
/// <param name="black">True为使用黑色,False为使用灰色</param>
/// <param name="width">宽度</param>
/// <param name="height">高度</param>
/// <remarks>创建完成后插入符默认为隐藏的</remarks>
public Caret(Control ctl,bool black, int width, int height)
{
_HostControl = ctl;
Caret.CreateCaret(this._HostControl.Handle, !black, width, height);
}
/// <summary>
/// 释放该插入符对象
/// </summary>
public void Destroy()
{
Caret.DestroyCaret(_HostControl.Handle);
}
/// <summary>
/// 隐藏插入符,隐藏效果会叠加,即调用了几次Hide,要再次显示时就要调用几次Show
/// </summary>
public void Hide()
{
Caret.HideCaret(this.HostControl.Handle);
}
/// <summary>
/// 显示插入符
/// </summary>
public void Show()
{
Caret.ShowCaret(this.HostControl.Handle);
}
/// <summary>
/// 宿主窗体
/// </summary>
public Control HostControl { get { return _HostControl; } }
/// <summary>
/// 获得或设置所有插入符闪烁时间间隔
/// </summary>
/// <value></value>
public static uint BlinkTime
{
get { return Caret.GetCaretBlinkTime(); }
set { Caret.SetCaretBlinkTime(value); }
}
/// <summary>
/// 获得或设置当前激活的控件的插入符的相对位置
/// </summary>
/// <value></value>
public static Point Position
{
get
{
POINT p = new POINT();
if (Caret.GetCaretPos( out p))
{
return new Point(p.x, p.y);
}
return Point.Empty;
}
set {Caret.SetCaretPos( value.X, value.Y); }
}
}
}
using System.Drawing;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace Klezard.Windows.Forms
{
/// <summary>
/// 插入符
/// </summary>
public sealed class Caret : System.ComponentModel.Component
{
Native
private Control _HostControl;
private Caret() { }
/// <summary>
/// 创建一个插入符
/// </summary>
/// <param name="ctl">插入符宿主</param>
/// <remarks>创建完成后插入符默认为隐藏的</remarks>
public Caret(Control ctl):this(ctl,8,16) { }
/// <summary>
/// 使用特定的大小创建一个插入符
/// </summary>
/// <param name="ctl">宿主</param>
/// <param name="width">宽度</param>
/// <param name="height">高度</param>
/// <remarks>创建完成后插入符默认为隐藏的</remarks>
public Caret(Control ctl, int width, int height):this(ctl,true,width,height){}
/// <summary>
/// 使用特定的大小创建一个插入符,可以指定黑色或灰色
/// </summary>
/// <param name="ctl">插入符宿主</param>
/// <param name="black">True为使用黑色,False为使用灰色</param>
/// <param name="width">宽度</param>
/// <param name="height">高度</param>
/// <remarks>创建完成后插入符默认为隐藏的</remarks>
public Caret(Control ctl,bool black, int width, int height)
{
_HostControl = ctl;
Caret.CreateCaret(this._HostControl.Handle, !black, width, height);
}
/// <summary>
/// 释放该插入符对象
/// </summary>
public void Destroy()
{
Caret.DestroyCaret(_HostControl.Handle);
}
/// <summary>
/// 隐藏插入符,隐藏效果会叠加,即调用了几次Hide,要再次显示时就要调用几次Show
/// </summary>
public void Hide()
{
Caret.HideCaret(this.HostControl.Handle);
}
/// <summary>
/// 显示插入符
/// </summary>
public void Show()
{
Caret.ShowCaret(this.HostControl.Handle);
}
/// <summary>
/// 宿主窗体
/// </summary>
public Control HostControl { get { return _HostControl; } }
/// <summary>
/// 获得或设置所有插入符闪烁时间间隔
/// </summary>
/// <value></value>
public static uint BlinkTime
{
get { return Caret.GetCaretBlinkTime(); }
set { Caret.SetCaretBlinkTime(value); }
}
/// <summary>
/// 获得或设置当前激活的控件的插入符的相对位置
/// </summary>
/// <value></value>
public static Point Position
{
get
{
POINT p = new POINT();
if (Caret.GetCaretPos( out p))
{
return new Point(p.x, p.y);
}
return Point.Empty;
}
set {Caret.SetCaretPos( value.X, value.Y); }
}
}
}
转载请注明出处,如果您要使用该代码,请告之作者