转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 软件开发 >> VB.NET程序 >> 正文
定制VB.NET控件编程之拦截击键动作         ★★★★

定制VB.NET控件编程之拦截击键动作

作者:闵涛 文章来源:闵涛的学习笔记 点击数:1963 更新时间:2009/4/23 19:02:01
作者:朱先忠编译

  一、 简介

  首先,本文假定你已经熟悉VB.NET和Visual Studio.NET Windows表单设计器。

  在开发定制Windows表单控件时,提供我们自己的下拉框类型编辑器来操作控件的属性常常是非常方便的。定制的类型编辑器不仅可以提供更为丰富的设计时刻体验,而且可能成为用户是否喜欢你的控件的决定因素。

  如果你决定创建你自己的下拉式类型编辑器,那么它应该遵循与内置的下拉框类型编辑器相类似的模式。让我们以Anchor属性为例。一种典型的操作该属性的设计时刻用户交互描述如下:

  · 用户选择属性格子中的Anchor属性并且点击属性格右边的下拉按钮。

  · 一种良好的图形控件是下拉框,它能够允许用户使用鼠标点击边缘或者使用箭头键来高亮某个边缘并使用空格键选择/取消选择它。

  · 用户可以通过按下ENTER键或点击下拉控件的外部来接收变化。为了取消这一变化,用户可以按下ESC键。

  下面,让我们来讨论具体的实现技术。

  二、 实现

  首先,让我们构建一个ResourceImageEditor类型编辑器,它允许从当前文件系统中选择一个图像文件(就象内置的ImageEditor类一样)或者从一个程序集的manifest文件中选择一个图像资源。而且,在用户体验方面,该ResourceImageEditor的行为应该类似于系统内置的类型编辑器。下面是对我们要求的概述:

  1. 当用户从属性格子中选择一个属性时,该格子就会显示出来—以一个下拉框UI形式显示可以编辑的属性。

  2. 当点击下拉按钮时,当前程序集中的所有图像资源将显示出来。

  3. 当用户选择一个图像资源项,相应的图像即可以从程序集中进行加载。

  4. 允许选择一个图像文件,并且在下拉列表框中的最后一项将标记为“Browse...”。当用户点按“Browse...”项,将显示经典的打开文件对话框,用户能够从中选择一个图像文件。

  5. 通过单击鼠标或使用箭头键高亮某项并按回车键实际选择它从而允许用户从该下拉列表框中选择一项。这个下拉选择可以通过按下ESC键取消。

  ResourceImageEditor是一个类型编辑器,因此它直接或间接地派生自System.Drawing.Design.UITypeEditor类。我决定从内置的System.Drawing.Design.ImageEditor类进行派生是因为它已经实现了图像文件选择功能。也就是说,ImageEditor.EditValue实现将显示一个文件打开对话框以允许用户从文件系统中选择一个图像文件。然后,从我的派生类中调用这一功能只需要简单地调用MyBase.EditValue即可。

  为了实现上面第一个要求(在属性格子中显示下拉箭头按钮),我必须重载GetEditStyle方法以从UITypeEditorEditStyle枚举中返回适当的常数:

Public Overloads Overrides Function GetEditStyle( _
ByVal context As ITypeDescriptorContext) As UITypeEditorEditStyle
 Return UITypeEditorEditStyle.DropDown
End Function
  为了显示图像资源列表,我必须列举一个给定程序集中的所有资源并且仅在列表中显示图像资源。为了简化,我决定使用一种简单的约定:当一个资源名以一个有效图像文件扩展名(.bmp,.jpg,.gif...)结束时,我们就认为这是一种图像资源,并且把它包括到该下拉列表框中。而且,我使用图像资源名的集合来填充这个下拉ListBox控件,后面详预以详述。

  开始时,被枚举以查询图像资源的程序集就是包含ResourceImageEditor类的程序集。然而,我们可以通过把ResourceImageEditor.ResourceAssembly属性设置为任何有效的System.Reflection.Assembly参考来改变它。

  当用户从列表框中选择一个图像资源名时,该图像应该即可从给定的程序集中的manifest文件中加载。这是在LoadResourceImage方法内实现的:

Private Function LoadResourceImage(ByVal resourceName As String) As Image
Debug.Assert(Not resourceName Is Nothing)
 Dim ImageStream As System.IO.Stream = Me.ResourceAssembly.GetManifestResourceStream(resourceName)
 Return System.Drawing.Bitmap.FromStream(ImageStream)
End Function
  下拉用户接口是通过在重载的EditValue方法内动态地创建和填充一个ListBox控件实现的。编辑器也处理由ListBox生成的Click和KeyDown事件,因为这是拦截ENTER和ESC键所必需的。下列伪码显示了在EditValue方法中的实现逻辑:

Public Overloads Overrides Function EditValue(...)
'存储上下文信息以用于下拉ListBox事件处理器。
'创建并使用可用的图像资源名填充该ListBox。
'添加我们的特殊“Browse...”项。
'绑定ListBox事件。
'在一个下拉窗口中显示该ListBox。
End Function


[C语言系列]C# 线程调用主线程中的控件  [C语言系列]c#使用webbrowser控件触发按钮点击事件
[Web开发]asp编程中优化数据库方法详解  [办公软件]如何在PowerPoint中使用(插入)Media Player控件播…
[Web开发]动态添加控件、设置控件属性并获得控件属性值  [Web开发]设置GridView控件表头背景图片(前台设置)
[Web开发]设置GridView控件表头背景图片  [Web开发]word文档(带控件)转成htm文件源代码示例-2
[Web开发]word文档(带控件)转成htm文件源代码示例-1  [Web开发]长篇大论—图文解说DridView、DataList、DetailsV…
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · C语言系列  · VB.NET程序
    · JAVA开发  · Delphi程序
    · 脚本语言
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台