在有些时候,我们需要在自己的控件中加入象TextBox一样的插入符
这个功能可以使用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); }
        }

    }

}


转载请注明出处,如果您要使用该代码,请告之作者
posted on 2005-03-16 17:03  Zealic  阅读(2009)  评论(2编辑  收藏  举报