WinForm控件开发总结(一)------开篇

来源:互联网 发布:python web flask 编辑:程序博客网 时间:2024/06/05 16:21

  我本人不是专业的控件开发人员,只是在平常的工作中,需要自己开发一些控件。在自己开发WinForm控件的时候,没有太多可以借鉴的资料,只能盯着MSDN使劲看,还好总算有些收获。现在我会把这些经验陆陆续续的总结出来,写成一系列方章,希望对看到的朋友有所帮助。今天我来开个头。
      其实开发WinForm控件并不是很复杂,.NET为我们提供了丰富的底层支持。如果你有MFC或者API图形界面的开发经验,那么学会WinForm控件可能只需要很短的时间就够了。
      自己开发的WinForm控件通常有三种类型:复合控件(Composite Controls),扩展控件(Extended Controls),自定义控件(Custom Controls)。   
      复合控件:将现有的各种控件组合起来,形成一个新的控件,将集中控件的功能集中起来。
      扩展控件:在现有控件的控件的基础上派生出一个新的控件,为原有控件增加新的功能或者修改原有控件的控能。
      自定义控件:直接从System.Windows.Forms.Control类派生出来。Control类提供控件所需要的所有基本功能,包括键盘和鼠标的事件处理。自定义控件是最灵活最强大的方法,但是对开发者的要求也比较高,你必须为Control类的OnPaint事件写代码,你也可以重写Control类的WndProc方法,处理更底层的Windows消息,所以你应该了解GDI+和Windows API。    
      本系列文章主要介绍自定义控件的开发方法。
      控件(可视化的)的基本特征:
      1.       可视化。
      2.       可以与用户进行交互,比如通过键盘和鼠标。
      3.       暴露出一组属性和方法供开发人员使用。
      4.       暴露出一组事件供开发人员使用。
      5.       控件属性的可持久化。
      6.       可发布和可重用。
      这些特征是我自己总结出来,不一定准确,或者还有遗漏,但是基本上概括了控件的主要方面。
      接下来我们做一个简单的控件来增强一下感性认识。首先启动VS2005创建一个ClassLibrary工程,命名为CustomControlSampleVS会自动为我们创建一个solution与这个工程同名,然后删掉自动生成的Class1.cs文件,最后在Solution explorer里右键点击CustomControlSample工程选择Add->Classes…添加一个新类,将文件的名称命名为FirstControl。下边是代码:
 using System;
using System.ComponentModel;
using System.Collections;
using System.Diagnostics;
 
using System.Text;
using System.Windows.Forms;
using System.Drawing;
namespace Lanyou.BoardControl
{
 /// <summary>
 /// xMLable 的摘要说明。
 /// </summary>
     [System.ComponentModel.ToolboxItem(true)]
 public class xMLable : System.Windows.Forms.Control
 {
  /// <summary>
  /// 必需的设计器变量。
  /// </summary>
  private System.ComponentModel.Container components = null;

  // ContentAlignment is an enumeration defined in the System.Drawing
  // namespace that specifies the alignment of content on a drawing
  // surface.
  private ContentAlignment alignmentValue = ContentAlignment.MiddleLeft;

  [
  Category("Alignment"),
  Description("Specifies the alignment of text.")
  ]
  public ContentAlignment TextAlignment
  {

   get
   {
    return alignmentValue;
   }
   set
   {
    alignmentValue = value;

    // The Invalidate method invokes the OnPaint method described
    // in step 3.
    Invalidate(); //
   }
  }

  public xMLable(System.ComponentModel.IContainer container)
  {
   ///
   /// Windows.Forms 类撰写设计器支持所必需的
   ///
   container.Add(this);
   InitializeComponent();

   //
   // TODO: 在 InitializeComponent 调用后添加任何构造函数代码
   //
  }

  public xMLable()
  {
   ///
   /// Windows.Forms 类撰写设计器支持所必需的
   ///
   InitializeComponent();

   //
   // TODO: 在 InitializeComponent 调用后添加任何构造函数代码
   //
  }

  /// <summary>
  /// 清理所有正在使用的资源。
  /// </summary>
  protected override void Dispose( bool disposing )
  {
   if( disposing )
   {
    if(components != null)
    {
     components.Dispose();
    }
   }
   base.Dispose( disposing );
  }


  #region 组件设计器生成的代码
  /// <summary>
  /// 设计器支持所需的方法 - 不要使用代码编辑器修改
  /// 此方法的内容。
  /// </summary>
  private void InitializeComponent()
  {
   components = new System.ComponentModel.Container();
  }
  #endregion


  protected override void OnPaint(PaintEventArgs e)
  {
   base.OnPaint(e);
   StringFormat style = new StringFormat();
   style.Alignment = StringAlignment.Near;
   switch (alignmentValue)
   {
    case ContentAlignment.MiddleLeft:
     style.Alignment = StringAlignment.Near;
     break;
    case ContentAlignment.MiddleRight:
     style.Alignment = StringAlignment.Far;
     break;
    case ContentAlignment.MiddleCenter:
     style.Alignment = StringAlignment.Center;
     break;
   }

   // Call the DrawString method of the System.Drawing class to write  
   // text. Text and ClientRectangle are properties inherited from
   // Control.
   e.Graphics.DrawString(
    Text,
    Font,
    new SolidBrush(ForeColor),
    ClientRectangle, style);

  }

 }
}

原创粉丝点击