如何开发一个Windows控件
2009-11-18 14:18
267 查看
本文是基于Windows平台下的dot
Net环境上的Form程序,思想可能也适用于其他场合。算是对过去开发经验的总结,保不齐有些内容是胡扯,勿怪。
一.背景介绍
很多时候做winForm程序时,标准控件不能完全满足要求,第三方可能也不太合适,比如收费,这个时候往往需要自己开发一个控件。牛人可能会有所不同,
但我想大多数人的做法无外乎两种:
1.继承已有标准控件类(诸如ListView等),然后增删其功能,使之符合预期(本文重点介绍),称之为拓展控件。
2.直接继承UserControl/Control类,在其上修改,使之满足自己的需要,这个呢大部分应该是追加新机能,称之为复合控件;
下面主要结合例子详细介绍一下第一种做法,即在原有控件上二次开发,特别是List类型控件中增加其他控件,比如TextBox等。
第二种做法较费功夫,复杂度要高一些,应是第一种方法行不通后再选择。
二.科学原理
其实整个WinForm程序的开发,无外乎控件的显示和控制,具体来说就是先追加到Form里去(this.Controls.Add(new
控件);),然后设置其显示属性,主要是Location和Size,在就是告诉显示时机(什么时候显示,比如一开始隐藏),以及进行事件的绑定,再接着
是显示前给控件加载数据(有些控件的价值可能不在这个,但大多数控件不处理数据是没有应用价值的),然后就是Show。
继承标准控件进行二次开发的过程跟这个类似,下面以ListView为例(给ListView中增加一个TextBox,当点击某Cell区域时显示该部
分内容,编辑后反应到ListView中去)来做说明。
三.实现步骤
1.继承标准控件,增加TextBox,比如
public partial class ListViewEx : System.Windows.Forms.ListView
{
TextBox editText = null;
public ListViewEx()
{
InitializeComponent();
editText = new TextBox();
editText.Visible = false;
editText.Visible = false;
this.Controls.Add(editText);
}
}
public
partial class ListViewEx : System.Windows.Forms.ListView {
TextBox editText = null; public ListViewEx() {
InitializeComponent(); editText = new TextBox();
editText.Visible = false;editText.Visible = false;
this.Controls.Add(editText); } }
2.显示属性的设置
主要是设置textBox的显示大小和显示位置,这个大多是在触发显示发生的事件里设定,一般是MouseUp事件。具体到ListView控件的话,有
一个问题比较难——确定当前Cell的Bound,这得借助API来实现(可能有其他更好的办法,不过我是没找到)。
四.
这块主要是根据实际需求一些特别的操作,比如
屏蔽右键,禁止粘贴啥的,也是最费功 夫的地方,可能重写窗口处理函数WndProc,键盘处理函数 ProcessCmdKey等,甚至Windows
API,Hook技术等等。估计除了业务逻辑处理,大多就是做这些“细枝末节”的事了,有些可能还是解决不了,至少解决起来很费劲,比如ListView
的GridLine在XP(SP2)环境下,当单击ScrollBar的上下按钮式,可能出现错位的现象,这是个MS的Bug。
五.
为了性能起见,资源处理函数最好增加处理,即在Dispose函数中增减关于TextBox的处理,主要是卸载事件和清理对象,防止内存泄露等情况出现。
六.其他说明
具体的例子网上很多(eg1
),
在此就不贴自己的了。
七.扩展阅读
1.各种自定义控件
(http://msdn.microsoft.com/zh-cn/office/ms171725%28VS.80%29.aspx)
Net环境上的Form程序,思想可能也适用于其他场合。算是对过去开发经验的总结,保不齐有些内容是胡扯,勿怪。
一.背景介绍
很多时候做winForm程序时,标准控件不能完全满足要求,第三方可能也不太合适,比如收费,这个时候往往需要自己开发一个控件。牛人可能会有所不同,但我想大多数人的做法无外乎两种:
1.继承已有标准控件类(诸如ListView等),然后增删其功能,使之符合预期(本文重点介绍),称之为拓展控件。
2.直接继承UserControl/Control类,在其上修改,使之满足自己的需要,这个呢大部分应该是追加新机能,称之为复合控件;
下面主要结合例子详细介绍一下第一种做法,即在原有控件上二次开发,特别是List类型控件中增加其他控件,比如TextBox等。
第二种做法较费功夫,复杂度要高一些,应是第一种方法行不通后再选择。
二.科学原理
其实整个WinForm程序的开发,无外乎控件的显示和控制,具体来说就是先追加到Form里去(this.Controls.Add(new控件);),然后设置其显示属性,主要是Location和Size,在就是告诉显示时机(什么时候显示,比如一开始隐藏),以及进行事件的绑定,再接着
是显示前给控件加载数据(有些控件的价值可能不在这个,但大多数控件不处理数据是没有应用价值的),然后就是Show。
继承标准控件进行二次开发的过程跟这个类似,下面以ListView为例(给ListView中增加一个TextBox,当点击某Cell区域时显示该部
分内容,编辑后反应到ListView中去)来做说明。
三.实现步骤
1.继承标准控件,增加TextBox,比如public partial class ListViewEx : System.Windows.Forms.ListView
{
TextBox editText = null;
public ListViewEx()
{
InitializeComponent();
editText = new TextBox();
editText.Visible = false;
editText.Visible = false;
this.Controls.Add(editText);
}
}
public
partial class ListViewEx : System.Windows.Forms.ListView {
TextBox editText = null; public ListViewEx() {
InitializeComponent(); editText = new TextBox();
editText.Visible = false;editText.Visible = false;
this.Controls.Add(editText); } }
2.显示属性的设置
主要是设置textBox的显示大小和显示位置,这个大多是在触发显示发生的事件里设定,一般是MouseUp事件。具体到ListView控件的话,有
一个问题比较难——确定当前Cell的Bound,这得借助API来实现(可能有其他更好的办法,不过我是没找到)。
四.
细节完善
这块主要是根据实际需求一些特别的操作,比如屏蔽右键,禁止粘贴啥的,也是最费功 夫的地方,可能重写窗口处理函数WndProc,键盘处理函数 ProcessCmdKey等,甚至Windows
API,Hook技术等等。估计除了业务逻辑处理,大多就是做这些“细枝末节”的事了,有些可能还是解决不了,至少解决起来很费劲,比如ListView
的GridLine在XP(SP2)环境下,当单击ScrollBar的上下按钮式,可能出现错位的现象,这是个MS的Bug。
五.
需要注意的地方
为了性能起见,资源处理函数最好增加处理,即在Dispose函数中增减关于TextBox的处理,主要是卸载事件和清理对象,防止内存泄露等情况出现。六.其他说明
具体的例子网上很多(eg1),
在此就不贴自己的了。
七.扩展阅读
1.各种自定义控件(http://msdn.microsoft.com/zh-cn/office/ms171725%28VS.80%29.aspx)
相关文章推荐
- 如何在VB 6.0 sp6 中使用WindowsMediaPlayer控件?编写一个属于自己的多媒体播放器?
- 讲述如何开发一个控件,很有价值(七)
- windows 8 metro 风格开发(7)-发布一个常用控件类库
- windows客户端开发--如何测量一个字符串显示的物理长度
- 讲述如何开发一个控件,很有价值(六)
- iOS开发如何在一个透明视图上添加不透明的子控件
- windows客户端开发--如何测量一个字符串显示的物理长度
- 讲述如何开发一个控件,很有价值
- 如何配置一个绿色化的 Qt for Windows 开发环境(有.bat脚本,亲测好用) good
- 讲述如何开发一个控件,很有价值
- 讲述如何开发一个控件,很有价值(三)
- 讲述如何开发一个控件,很有价值(二)
- 讲述如何开发一个控件,很有价值(五)
- 如何开发一个Qt工具箱内的控件
- VB.NET 开发的WINDOWS 界面控件如何应用在网页中
- 讲述如何开发一个控件,很有价值(四)
- 以太坊开发:如何在Windows下开发一个简易Dapp
- 如何配置一个绿色化的 Qt for Windows 开发环境
- android开发中如何定义一个不规则边界的控件
- 讲述如何开发一个控件,很有价值(六)