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

一、简介

首先,本文假定你已经熟悉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参考来改变它。

时间: 2025-01-30 11:13:38

定制VB.NET控件编程拦截击键动作的相关文章

基于AJAX技术的DataGrid控件编程

ajax|datagrid|datagrid控件|编程 简介 在传统的Web开发中,每次DataGrid控件填充或更新都相应于一次到服务器的数据回馈.但是,借助于AJAX技术,我们可以在不进行表单提交(刷新)的情况下即可以填充DataGrid控件. 在本文中,我们通过一个简单示例并借助于一个DropDownList控件的帮助来讨论如何达到这一目的.在这个例子中,我们使用了一个DropDownList控件:一旦改变DropDownList的值,它即用相应的城市名来填充DataGrid控件,在此过程

轻松调整VB.NET控件

控件 轻松调整VB.NET控件 作者: BUILDER.COMWednesday, March 5 2003 10:48 AM Visual Basic .NET使得放置和调整控件的工作比在Visual Basic 6中要容易得多.大多数System.Windows.Forms命名空间里的可视控件是由Control类继承下来的,它可以实现两种属性:Anchor和Dock. Anchor属性可以被设定为Top,Bottom,Left和Right的任何组合.默认设置是Top,Left.这可以保持控件

使用RFT的getProperty和invoke方法测试定制的Java控件

简介:定制的Java 控件(或者没有包含于标准 Java 库中的控件)正在挑战 GUI 自动化测试过程. 本文解释了如何通过 IBM Rational Functional Tester 所提供的两种方法使用这些控件类,用以创建自 动化的处理过程: getProperty 和 invoke. IBM Rational Functional Tester 提供了标准接口,便于操作标准 Java 控件.例如,在 Rational TextGuiTestObject 接口中,您可以很方便的使用getT

vb.net 控件backgroundcolor为半透明时,如何让其它控件也半透明显示?

问题描述 vb.net 控件backgroundcolor为半透明时,如何让其它控件也半透明显示? Label1.BackColor = Color.FromArgb(100 0 0 0) 这样做以后只让窗体的背景图片半透明显示了,而其它控件却被遮盖了.(图片为窗体背景)怎么让控件也半透明地显示出来? 解决方案 http://blog.csdn.net/sxycgxj/article/details/6114798http://download.csdn.net/download/zenas/1

vb-关于VB MSCHART控件画柱状折线图的求助

问题描述 关于VB MSCHART控件画柱状折线图的求助 各位大神,小弟求教如何使用VB 中MSCHART控件画出柱状折线图. 例:柱状显示每月实际销量,折线显示销售目标 解决方案 http://wenku.baidu.com/link?url=4dnfuHhQFd_o4Ms3Mybj_C87iVPKPPuz3TAsNVuhQ2q73fnNoFepsKD1ke3Sb2n_e4C2BNW67uwa7aAwGRsArAL_hsVNwyl3lI9VtGdIwGa http://www.docin.co

windows窗体应用程序-关于c++控件编程往控件中写入文本的问题

问题描述 关于c++控件编程往控件中写入文本的问题 首先我采用vs2010建立了一个windows窗体应用程序,在这个窗体上面加了一个richtextbox控件和一个button控件,我的目的是程序执行时,点击button按钮,这样在richtextbox控件中会显示相应的数据,于是我在button中添加了如下代码: private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { int i,

VB OCX控件的名字和程序的关系

问题描述 VB OCX控件的名字和程序的关系 VB中添加控件对话中会有一个控件的名字,这个名字是放在什么地方的,能不能隐藏起来? 解决方案 这个描述信息是放在ocx控件中的,可以用 exescope 这个工具修改掉. 解决方案二: OCX控件了解

在 C++ Builder中利用串行通信控件编程

摘要:串口是常用的计算机与外部串行设备之间的数据传输通道,由于串行通信方便易行,所以应用广泛.本文介绍了在C++ Builder中如何利用串行通信控件进行串行通信编程. 一.引言 目前,在用计算机进行数据传输时,常用的是串行通信方式.用C++ Builder来编写串行通信程序时,可以调用Windows API函数,也可以利用VB中的MSComm控件. 利用 API函数编写实际应用程序时,往往要考虑多线程的问题,这样编出来的程序不但十分庞大,而且结构比较复杂,继承性差,维护困难.但是使用串行通信控

关于ASP.NET2.0 中的用户控件编程使用

asp.net|编程|控件 今天用了一下2.0中的用户控件,发现使用编程方式使用用户控件,跟1.X 中截然不同. 1.首先,要在所要使用的Page 头部声明引用.如下: <%@ Reference Control="../Controls/AlbumEditor.ascx" %> 2.在后置代码里,从"ASP"空间中就可以找到此控件的类引用了,不过还需要事例一下.-_-! 不明白设计者为什么要这么做,还不如1.1 那样直观.如下:  ASP.Contro