构建一个弹出式图象按钮
日期:2003年10月8日 作者:清风网络学院 查看:[大字体 中字体 小字体]-
构建Windows控件并不是一件特别复杂的事情。我曾在以前的文章中讲过如何通过最专业的技术来构建复杂的控件,但这并不意味着构建所有控件都是那么复杂。本文我将用一种曾在我的工作中遇到的简单方法来解决一个真实领域中的问题。就算你只有一些或者完全没有什么构建控件的经验,你也可以用它来实现在你的桌面应用程序中加入复杂的功能。
我需要一个带有不同图象的弹出式按钮,用于实现常规的、mouse-hover和mouse-down状态。我可以用一个常规的WinForm按钮来实现大多数我想要的效果,但却不能实现给边框加上颜色。我还想要让图象移到按钮的右边缘,就象菜单按钮那样。确切地说,我是需要一个能够代表其本身功能的菜单按钮。
你可以用大约150行的代码来构建这个控件;最长的过程包含约25行代码。这个方法是一个很好的起点;你可以给它添加许多性能并可以将它当作一个其他类型控件的模式。该过程的属性或许是这个项目中最为复杂的一个地方了――对.NET提供的经过深思熟虑的基类的一个确实的证明。
基本的方法是以一个已经存在的控件开始并通过继承来添加或改变其行为。控件的Paint事件允许你在窗体中进行随意绘制。对listbox或treeview来说,完成这个功能可能需要做很多工作,但对按钮来说,只需用图象作为表面就可以了。你可以通过从Button类中派生出你所需要的ImageButton类,用一个Button控件的Paint事件来绘制出适当的图象。然而,对于一个弹出式按钮来说,象Image、FlatStyle和AutoSize这样的Button属性是没有意义的。作为替代,你可以从Control基类中派生它并自己为它加上边框。这样做并不需要你编写额外的代码,它会生成一个更有效的控件和一个用于构建其他控件窗体的通用模板。
一个弹出式按钮的行为是很简单的。它有三种状态,每种状态都带有一个边框和一个图象。Control基类支持一组可以被覆盖(override)的Mouse过程,以及Paint程序。你可以通过简单地从Windows.Forms.Control派生来开始一个程序。奇怪的是,Control基类不是一个“必须继承类”(通常被成为抽象类),就是说以该类为基类进行派生时,你无需覆盖任何方法。覆盖是指Windows和.NET允许你在某人或某个东西(即系统)调用了基类的方法时执行你自己的代码。这一点非常有用。
在绘制时进行选择
当一个终端用户切换到另一个页面时, ImageButton、Windows以及.NET会通知Control类。Control类将Windows的信息传递给继承者的OnPaint程序。在编写覆盖程序时你可以运行自己的代码,而不需要完全按照基类的做法。尽管Control类不是一个抽象基类,但它自己并不完成任何绘制。然而,在你需要继承一个类时,――比如Button或Label类,通常你会取代基类的painting,而不是将它添加到你的程序中。OnPaint 覆盖中包括一个对MyBase的调用,这不是因为基类需要进行处理来实现绘制,而是为了给用户提供一个自己的Paint事件。继承类不会直接代表其基类来触发事件,对MyBase.OnPaint的调用导致基类触发客户端Paint事件。
这一点会对你将来构建控件有所影响,因此为了让你有更全面的了解我将从另一个角度对它进行讲述。如果你通过覆盖一个OnPaint 来支持你自己的作品(就是说用于一个标准的Button基类),而且你不仅仅想要实现基类所完成绘制,那么你的OnPaint覆盖中就不应该包含MyBase.OnPaint调用。在这个场景中,如果你还想为使用派生控件的开发人员提供一个Paint事件,则必须在基类中提供一个Paint事件声明。如果基类中已存在了一个Paint事件,你则必须用Shadows关键字来声明你自己的事件从而将基类的事件隐藏起来。不要轻易尝试使用Shadows,因为它容易让使用该控件的开发人员搞糊涂,虽然在一个事件中使用这种方法看起来似乎更安全。 - [1] [2] [3] 下一页
-
- 构建一个弹出式图象按钮 相关文章:
- ·构建一个弹出式图象按钮
- 构建一个弹出式图象按钮 相关软件
- 特别声明:本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作
- 者.文章版权归文章原始作者所有.对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转
- 载的文章有版权问题请联系编辑人员,我们尽快予以更正. 转载请注明来源:http://www.hackhome.com
下一篇:随时随地打开常用文件夹
精品推荐
热点TOP10
- ·Community Server专题三:HttpModule
- ·根据选择的树形节点用asp.net结合dw和js动态生成可移动可展开的层
- ·如何在上传的图片上加上版权文字
- ·ASP.Net2.0 GridView 多列排序,显示排序图标,分页
- ·在 ASP.NET 2.0 中上载文件
- ·通过webservices上传下载文件
- ·让ASP.NET简便使用SCRIPT
- ·CMPP SP端 C# 实例
- ·生成 ContentRotator ASP.NET 服务器控件
- ·揭开ASP.NET中Cookie编程的奥秘
- ·ASP.NET上传和下载文件的代码
- ·ASP.NET实现FTP文件上载类
- ·生成静态文件的新闻系统核心代码(.net C#)
- ·ASP.Net2.0 GridView 多列排序 显示排序图标,分页
- ·ASP.NET技巧:用MasterPage 代替 PageBase
- ·ASP.NET2.0数据操作之母板页和站点导航
- ·C#捕捉摄相头的数据流
- ·理解并扩展 ASP.NET 2.0 中的站点导航系统
- ·Community Server专题四:HttpHandler
- ·上传图片以二进制插入到数据库,且读取显示
特别推荐
- ·.net基础知识错误注意二十二点知识
- ·asp.net2.0学习历程 菜鸟到中级程序员的飞跃
- ·.NET基础知识-什么是.NET
- ·初学C#+ASP.NET+Oracle时积累的备忘点滴
- ·专家详解:复杂表达式的执行步骤
- ·asp.net中的加密方法
- ·DataGrid常见关注问题解决方案
- ·学习笔记 ASP.NET 5种页面转向法
- ·ASP.NET网络编程中经常会用到的27个函数集
- ·ASP.NET之上传文件管理策略
- ·专家:用.NET动态创建类的实例讲解
- ·ASP.NET WEB服务和Flash打造MP3播放器
- ·精通ASP.NET中弹出窗口技术
- ·asp.net常用代码
- ·asp.net创建文件夹的IO类的问题
- ·Asp.Net函数集
- ·Asp.net cache 简述
- ·如何最大限度提高.NET的性能 (续)
- ·.NET编程规范
- ·Asp.net1.1升级到2.0遇到的一些问题总结
