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

      我本人不是专业的控件开发人员,只是在平常的工作中,需要自己开发一些控件。在自己开发 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工程,命名为CustomControlSample,VS会自动为我们创建一个solution与这个工程同名,然后删掉自动生成的Class1.cs文件,最后在Solution explorer里右键点击CustomControlSample工程选择Add->Classes…添加一个新类,将文件的名称命名为FirstControl。下边是代码:
      
None.gif using  System;
None.gif
using  System.Collections.Generic;
None.gif
using  System.Text;
None.gif
using  System.Windows.Forms;
None.gif
using  System.ComponentModel;
None.gif
using  System.Drawing;
None.gif
None.gif
namespace  CustomControlSample
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
public class FirstControl : Control
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif
InBlock.gif        
public FirstControl()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
// ContentAlignment is an enumeration defined in the System.Drawing
InBlock.gif        
// namespace that specifies the alignment of content on a drawing 
InBlock.gif        
// surface.
InBlock.gif
        private ContentAlignment alignmentValue = ContentAlignment.MiddleLeft;
InBlock.gif
InBlock.gif        [
InBlock.gif        Category(
"Alignment"),
InBlock.gif        Description(
"Specifies the alignment of text.")
InBlock.gif        ]
InBlock.gif        
public ContentAlignment TextAlignment
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif
InBlock.gif            
get
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
return alignmentValue;
ExpandedSubBlockEnd.gif            }

InBlock.gif            
set
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                alignmentValue 
= value;
InBlock.gif
InBlock.gif                
// The Invalidate method invokes the OnPaint method described 
InBlock.gif                
// in step 3.
InBlock.gif
                Invalidate();
ExpandedSubBlockEnd.gif            }

ExpandedSubBlockEnd.gif        }

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

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

ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

None.gif

   晚了,今天写到这里,下一篇文章介绍怎样使用我们写好的控件。


      
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值