我想尝试一下写文章的,就写下了这篇文章希望能够给C#的初学者给与一点提示。上午做了一个MSN样式的控件,我就以此为例教大家做控件。让大家感受一下 .net给我们带来的 方便。体验一下他快速开发的能力。下面我先介绍控件的大体结构(如图所示)
,
Bars和PageCollection为俩个集合分别来控制 bar 和page ,下面我说说我写控件碰到的一些难点,第一个就是控件做好了,如何在自己以后的编程不写代码就能完成界面的设计,这个。net已经给我们准备好一套很好的机制,只要照着用就可以了,我参照了 微软的tabcontrol 写法,通过设置属性就可以添加选型卡,我的做法为[Category("Appearance")]
[Description("在这里添加选项卡了")]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public PageCollection PagesItem
{
get
{
return this.pages;
}
}
[Category("Appearance")]
public Panel Bars
{
get
{
return this.myBars;
}
}
注意这条属性哦 [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)],具体什么意思还是你自己看看帮助了,
第二个难点就是如何控制控件在设计时候的状态就是说什么时候把消息教给控件处理,什么时候把消息交给设计器来处理,在这一点我做的不是很成功,我是把消息都交给控件处理,虽然试图精确的控制但是还是没有能控制的住,
protected override void WndProc(ref System.Windows.Forms.Message m)
{
this.DefWndProc(ref m); //把消息全交给了控件,缺点就是设计器都不能完成单击选中的功能了,但是你拖动还是可以的,
#region garbage
// switch(m.Msg)
// {
// case (int)Msgs.WM_MOUSEMOVE:
// this.DefWndProc(ref m);
// break;
// case (int)Msgs.WM_LBUTTONDOWN:
// if(this.Control != null)
// {
// int xPos = (short)((uint)m.LParam & 0x0000FFFFU);
// int yPos = (short)(((uint)m.LParam & 0xFFFF0000U) >> 16);
// Rectangle rect = new Rectangle(this.Control.Location,new Size(40,100));
// if(rect.Contains(xPos,yPos))
// {
// this.DefWndProc(ref m);
// }
// else
// {
// base.WndProc(ref m);
// }
// }
// break;
// default:
// base.WndProc(ref m);
// break;
// }
#endregion
,下面说说如何使用,如果你用过tabcontrol,用我的控件就很容易了,通过设置 pageitem 属性 ,和page的barimage属性就可以了。好了一个接近完善的控件就做出来的,使用是那末的方便,只要把它加入工具箱就可以了,不需要每次都写一些复杂的代码,做控件是不时很容易哦 ,
需要的的向我要了 QQ:59294081