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工程,命名为CustomControlSampleVS会自动为我们创建一个solution与这个工程同名,然后删掉自动生成的Class1.cs文件,最后在Solution explorer里右键点击CustomControlSample工程选择Add->Classes…添加一个新类,将文件的名称命名为FirstControl。下边是代码:
      
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.ComponentModel;
using System.Drawing;

namespace CustomControlSample
{
    
public class FirstControl : Control
    
{

        
public FirstControl()
        
{

        }


        
// 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();
            }

        }



        
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);

        }

    }

}

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


      

posted on 2006-12-04 23:03 纶巾客 阅读(19282) 评论(39) 编辑 收藏

评论

#1楼 2006-12-04 23:21 木野狐      

虽然我不是专门做 winform, 关注一下。  回复 引用 查看   

#2楼 2006-12-04 23:46 Justin      

个人对开发控件比较感兴趣,支持一下!  回复 引用 查看   

#3楼[楼主] 2006-12-04 23:56 纶巾客      

多谢各位支持,我会继续努力。  回复 引用 查看   

#4楼 2006-12-05 01:28 航天奇侠

加油~~~~~

感觉只有自己写控件,才能真正掌握ui.

请留意一下,关于窗体的自动适应功能是怎么回事。
 回复 引用   

#5楼 2006-12-05 10:07 scotoma      

关注期待您的下一篇文章.  回复 引用 查看   

#6楼 2006-12-05 11:06 white.wu      

Good , Go on  回复 引用 查看   

#7楼 2006-12-05 12:44 牧野      


期待续篇.

 回复 引用 查看   

#8楼 2006-12-05 13:35 新型报表工具 xdesigner      

顶,支持,.NET不是只能用来开发WEB程序的。  回复 引用 查看   

#9楼 2007-01-11 07:48 二手的程序员      

Mark  回复 引用 查看   

#10楼 2007-01-12 13:40 网上飘[未注册用户]

楼主,谢谢,引用你的文章  回复 引用   

#11楼 2007-02-14 22:27 Bention      

写得不错,让俺想起了以前vb6时代的自定义控件
[quote] 3. 暴露出一组属性和方法供开发人员使用。
4. 暴露出一组事件供开发人员使用。
[/quote]

:),嘿嘿,这里的暴露让俺想歪了,原来是提供的意思
 回复 引用 查看   

#12楼 2007-03-08 10:47 Spencer[未注册用户]

如果早两三个月看到你的文章就好了
那时我刚开始学习怎么写控件
一开始公司就让我写一个ListBox
之前对控件开发就是一无所知
经过一个月的努力终于是写出来了
 回复 引用   

#13楼 2007-04-03 14:28 gislqy[未注册用户]

谢谢楼主,楼主继续!!!  回复 引用   

#14楼 2007-05-22 09:42 a[未注册用户]

好像编译出错啊.  回复 引用   

#15楼 2007-07-16 15:31 snowounce[未注册用户]

请问我按照楼主的办法建立了classlibrary后,引用了System.Windows.Forms和System.Drawing 编译后说无法启动"带有类库输出类型"的项目.
后来我又加了一个应用程序的solution,可以编译了,但是在把生成的dll加入toolbox的时候却说没有可放置在toolbox上的组件,

是为什么请楼主,和各位大虾帮忙!
 回复 引用   

#16楼 2007-08-07 14:24 jimfire[未注册用户]

http://www.cnblogs.com/guanjinke/archive/2006/12/04/582084.html

通过学习你的文章。我根本没有办法把你的dll放到toolbox上。
 回复 引用   

#17楼 2007-08-07 16:16 jimfire[未注册用户]

明白了,原来没有在class前面加public关键字。  回复 引用   

#18楼 2007-09-12 10:47 IAmPeter[未注册用户]

这个东西要顶!!  回复 引用   

#19楼 2007-10-24 07:59 scotoma      

楼主真强悍呵呵..........

谢谢楼主的共享精神
 回复 引用 查看   

#20楼 2008-07-23 09:10 蓝海豚[未注册用户]

谢谢,支持一下.  回复 引用   

#21楼 2008-08-07 16:30 w_wuqihua[未注册用户]

谢谢 老兄的发这篇文章  回复 引用   

#22楼 2008-08-16 10:50 winform[未注册用户]

楼主 下一篇呢? 学习中呀  回复 引用   

#23楼 2008-11-24 07:27 yy3318[未注册用户]

不得呀 我在.net2005中public ContentAlignment alignmentValue = ContentAlignment.MiddleLeft; 这句中的“ContentAlignment ”无法成功 提示
错误1 应输入 class、delegate、enum、interface 或 struct
 回复 引用   

#24楼 2008-12-04 14:26 jinkunaier[未注册用户]

真是个好东西啊,神啊,爱你了!努力!  回复 引用   

#25楼 2008-12-21 21:17 zhima[未注册用户]

谢谢LZ的文章,我去转载  回复 引用   

#26楼 2009-05-23 01:34 masterfy      

为什么那个对齐属性用ContentAlignment类型,而不用StringAlignment类型呢?这样还需要switch (alignmentValue)转换。
是不是因为ContentAlignment的枚举值是MiddleLeft这些值,方便用户设置。
 回复 引用 查看   

#27楼 2009-09-09 15:18 minide      

来看了
但是
我用 的VS2008
但是我就 问题
初来啊
 回复 引用 查看   

#28楼 2009-09-09 17:58 minide      

谢谢你
带我
入门
 回复 引用 查看   

#29楼 2009-11-28 09:17 鹤冲天      

最的也做这方面工作,楼主的文章写的很详细  回复 引用 查看   

#30楼 2010-01-05 09:32 Devbar      

收藏了  回复 引用 查看   

#31楼 2010-07-27 16:49 永恒的☆      

编译不通过啊  回复 引用 查看   

#32楼 2010-07-27 16:56 永恒的☆      

要自己添加引用..  回复 引用 查看   

#33楼 2010-08-12 22:13 帅哥的杯具      

LZ 谢谢你了 你QQ号码是多少 能加下我吗 我的是407262053  回复 引用 查看   

#34楼 2010-11-17 11:44 拉拉叟      

非常深入浅出 顶  回复 引用 查看   

公告

本博客上的所有文章如非特别说明均为原创,如果要转载请注明文章出处。
昵称:纶巾客
园龄:6年3个月
粉丝:48
关注:0

导航

<2012年2月>
2930311234
567891011
12131415161718
19202122232425
26272829123
45678910

统计

  • 随笔 - 48
  • 文章 - 0
  • 评论 - 384
  • 引用 - 116

搜索

 
 

常用链接

我的标签

随笔分类(44)

随笔档案(48)

文章分类

联系我

友情链接

积分与排名

  • 积分 - 265322
  • 排名 - 280

最新评论

阅读排行榜

评论排行榜

推荐排行榜