RT,谢谢

解决方案 »

  1.   

    在C#中创建自定义控件
    创建自定义的控件有下面几种方法:
    1 创建继承自UserControl的控件。对于这样的控件,它其实是一个控件的容器,你可以像设计一般的窗体一样设计它,因此,标准的控件都是可用的。当然了,如果愿意,你也可以随意地在Paint事件的处理函数中修改它的外观。这类自定义控件可以用于把其他控件继承起来 
    2 创建继承自其他控件(例如标准控件)的控件。对于这类控件,主要是为了修改已有控件的外观和行为,没有必要从零开始。
    3 创建继承自Control的控件。可以使用的超类有 
     它允许你从头开始编写一个全新的控件,当然,这种方法也是三者中最复杂的。control类提供控件(例如事件)所需的所有基本功能,但不提供控件特定的功能或图形接口。与通过从用户控件或现有 Windows 窗体控件继承来创建控件相比,通过从 Control 类继承来创建控件需要耗费的心思和精力要多得多。因为你必须为控件的 OnPaint 事件编写代码以及所需的任何功能特定代码,但同时也允许作者根据自己的需要,灵活地自定义调整控件。
    下面我们就来看看如何创建自己的控件。
    确定好采用上面三者中的哪一个方法后,创建相应的工程。之后,需要添加自己的字段,事件,和属性。如果需要重新修改超类的某个动作,可能还要重载超类对应的虚函数。如果需要自己画控件的外观(继承自Control的空间必须这样做),需要添加Paint事件的处理函数。
    最后,我们再说一下如何使自己的控件可以在.net studio中的设计器中使用。
    1 如果在设计器中希望自己的控件改变大小之后能够被重画,需要在控件类的构造函数中使用下面的代码:SetStyle(ControlStyles.ResizeRedraw, true); 另外,如果想使控件的背景色为透明色,也需要类似的代码,例如:SetStyle(ControlStyles.ResizeRedraw | ControlStyles.SupportTransparentBackColor, true);
    2 关于控件类的元数据。为了使设计器能正确地操作我们的控件,必须提供足够的关于元数据(即描述控件自身的数据)。几个常用的元数据包括
    一 关于空间的元数据。常用的是控件默认的事件,默认的属性,控件显示在工具箱上的图标。所谓默认事件,是指当在设计器中双击空间时,要给哪个事件添加事件处理函数。所谓默认属性,是指当我们在设计器中编辑控件的属性时,哪个属性默认被激活。可以在控件类的定义前添加下面的代码指定默认事件和默认属性:
    [DefaultProperty("属性名"),DefaultEvent("事件名"),ToolboxBitmap("路径")]
    另外,ToolboxBitmap元数据也可以是Type的实例,这样,显示在工具箱中的图标就是对应控件的图标。例如:
    [ToolboxBitmap(typeof(Button))]
    二 关于某个事件的元数据。主要是事件的描述信息,即在事件设计器中,当选中对应的事件时,显示在设计器下面的描述本事件的信息。可以在事件的定义前添加下面的代码指定默认事件和默认属性:
    [Description("你自己的描述")]
    三 关于某个属性的元数据。主要包括Category,Description,DefaultValue,Browserable和Editor,其中Category是指本属性显示在设计器中的哪个分类里,Description指当在设计器中选定本属性时,显示在设计器下面的描述本属性的信息。DefaultValue就不用说了吧。至于Browserable,这个元数据太重要了,它指定对应的属性在设计器里是否可见。若设为false,在设计器里就看不到此属性了,因此最好显式把它设成true(默认好像是false )。Editor也是一个很重要的属性,它指定当要给此属性选定值时,应该采用什么编辑器。对于一般类型的属性(例如int,string等),设计器都能给出正确的默认的编辑器,但是如果设计器无法识别属性的类型,那么你就必须指定编辑器(你自己写的类,这些类继承自System.Drawing.Desing名字空间中的几个类,幸运的是,这个名字空间中提供了几个可以直接使用的编辑器,使得对于像图像、字体这样的属性不用自己写编辑器了 )。可以在属性的定义前添加代码指定这些元数据。
    下面是一个例子。
    [   Category("Flash"),
        Editor(typeof(FlashTrackBarValueEditor), typeof(UITypeEditor)),
        DefaultValue(0)]关于属性还有一点需要注意,如果这个属性和控件的外观有关,那么要在属性的set段里引发重画事件,这样才能使控件得到正确的显示
      

  2.   

    继承Label 
    public class MyLabel:Label
    {
       private int m_MyInt=-1;
       
       public int MyInt{get{return m_MyInt;}set{m_MyInt=value;}}
    }