信息发布软件,b2b软件,广告发布软件

标题: 您有所不知道VB.NET可以拦截某种神秘的点击动作了 [打印本页]

作者: 群发软件    时间: 2017-5-23 23:33
标题: 您有所不知道VB.NET可以拦截某种神秘的点击动作了
本帖最后由 群发软件 于 2017-5-23 23:34 编辑

 一、 简介

  首先,本文假定你已经熟悉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

  三、 几个关键问题与解案

  为了开发ResourceImageEditor,我创建了一个重载Image属性的MyPictureBox(派生自System.Windows.Forms.PictureBox),以便把ResourceImageEditor指定为该Image属性的类型编辑器。然后,我编译这个控件的代码。之后,就可以把该MyPictureBox控件放到一个

  表单上并且调用下拉框用户接口......

  鼠标接口工作得很好。然而,当我使用键盘选择一项然后按下回车键时,该下拉列表框消失,而且我的选定内容丢失了(也就是说,前一个选择图像并没有改变)。我很快发现,当按下回车键时,该ListBox并没有生成KeyDown事件。

  尽管ESC键也产生KeyDown事件,但这不是一个问题;因为该下拉列表框会被自动关闭,而且我不必处理当前选择项。

  很明显,在ListBox控件能够处理它们之前,这个属性格“屏蔽”了ENTER和ESC键。

  为了简化而且还要解决问题,我要使用ProcessDialogKey方法。在消息预处理期间(处理对话字符,例如TAB、RETURN、ESCAPE和箭头键)时,调用这个方法。这个方法是在System.Windows.Forms.Control类内声明的—它简单地把该调用代理给该控件的父级(如果有的话)。我已经子类化该ListBox控件,并且重载了ProcessDialogKey方法来拦截回车键,如下所示:

  Protected Overrides Function ProcessDialogKey(ByVal keyData As Keys) As Boolean

 If keyData = System.Windows.Forms.Keys.Return Then

  RaiseEvent EntERPressed(Me, EventArgs.Empty)

  Return True 'True意味着我们已经处理了相应的键

 Else

  Return MyBase.ProcessDialogKey(keyData)

 End If

End Function

  不是从ProcessDialogKey实现内部生成KeyDown事件,我决定使用一种更为直接的方式:EnterPressed事件。为了,我修改了ResourceImageEditor.EditValue的实现以处理这一事件(而不是KeyDown事件),而且一切都非常顺利。

  你可以使用这一技术来拦截任何Control派生的类

  (你使用它来实现你的类型编辑器中的下拉UI)中的ENTER键。

换一个方法:
1)把KeyPreview=True。
2)
Public Class Form1    '人为添加人工按钮    Dim WithEvents mb As New MyButton    ''' <summary>    ''' 自定义按钮    ''' </summary>    Public Class MyButton        Inherits Button         Protected Overrides Function ProcessCmdKey(ByRef msg As Message, keyData As Keys) As Boolean            Return keyData <> Keys.Enter        End Function    End Class     Public Sub New()         ' 此调用是设计器所必需的。        InitializeComponent()         '手动添加按钮        mb.Parent = Me        mb.Width = 100        mb.Height = 100        mb.Name = "myButton"        mb.Text = "我的按钮"    End Sub     Private Sub mb_Click(sender As Object, e As EventArgs)        MsgBox("")    End SubEnd Class

Click For donating:Free Rice For the poor
For spamming-sender issues, you can either report it at Microsoft Spamming Issue, or just find "Report Spam Here+Number" at Forum Issue;You can also find "Verify Your Account+Number" at "Forum Issue", where you can submit to be confirmed to paste links or images.
For more things to talk about? StackOverFlow is your choice.

如果你多个项目需要用到Button,可以选择类库,直接写入以下代码:
''' <summary>    ''' 自定义按钮    ''' </summary>    Public Class MyButton        Inherits Button         Protected Overrides Function ProcessCmdKey(ByRef msg As Message, keyData As Keys) As Boolean            Return keyData <> Keys.Enter        End Function    End Class
然后导出为DLL,这样就可以像其它控件一样直接把DLL拖拽到工具箱中就可以随意拖拽到WinForm上就可以使用啦!
另外有问题希望直接在此处讨论,不要发送冗余帖子,谢谢配合!


Click For donating:Free Rice For the poor
For spamming-sender issues, you can either report it at Microsoft Spamming Issue, or just find "Report Spam Here+Number" at Forum Issue;You can also find "Verify Your Account+Number" at "Forum Issue", where you can submit to be confirmed to paste links or images.
For more things to talk about? StackOverFlow is your choice.

作者: anleeycn    时间: 2017-5-26 22:57
就按要求完成了!力荐!!
作者: jzgsjt    时间: 2017-5-29 10:13
及时做出评价,系统默认好评!
作者: asz111    时间: 2017-5-29 18:55
,风格很赞,系统很稳定。很好。
作者: 694012770    时间: 2017-5-29 22:34
论坛数据库真厉害,很快就搞定,修复云平台更厉害哦
作者: aluoting    时间: 2017-5-30 16:52
看帖回帖是美德!
作者: jingtai001    时间: 2017-6-2 04:27
买家,有你这样的买家是我的荣幸,希望下次再光临本店哦!谢谢!东西很漂亮,卖家服务态度很好,下次还来。东西很满意速度很快有机会我还会再来的呵呵合作愉快哦!
作者: 小白    时间: 2017-6-2 06:07
,看样子好不错给个好评,已经习惯了
作者: chenzhanhua    时间: 2017-6-8 10:46
都满足不了我对店家的评价!!!非常满意模板真心的不错显示工整完美大方使用简单方便之前用的是淘宝基础版枯燥不堪用了这模板后看自己的铺面心情都不样呵呵!店家的服务也非常周到有问必答而且非常有耐心省时省事省心。
作者: brt02    时间: 2017-6-10 15:15
学习了,谢谢分享、、、
作者: lalajie    时间: 2017-6-14 04:38
了。帮忙处理了好多问题。谢谢了
作者: 武器    时间: 2017-6-18 07:01
推荐!
作者: 694012770    时间: 2017-6-19 11:00
术不错。。。整的巴适。。。
作者: q117971371    时间: 2017-6-22 20:21
富,操作简单方便,很实用,服务态度很好。满意。
作者: aluoting    时间: 2017-6-22 23:24
了,服务很周到,及时,相信你们会越来越好,加油!!




欢迎光临 信息发布软件,b2b软件,广告发布软件 (http://postbbs.com/) Powered by Discuz! X3.2