用户登录  |  用户注册
首 页商业源码原创产品编程论坛
当前位置:PB创新网文章中心编程技巧VisualBasic

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

减小字体 增大字体 作者:佚名  来源:本站整理  发布时间:2009-03-16 19:55:30


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] [2] 

Tags:

作者:佚名

文章评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
PB创新网ourmis.com】Copyright © 2000-2009 . All Rights Reserved .
页面执行时间:12,484.38000 毫秒
Email:ourmis@126.com QQ:2322888 蜀ICP备05006790号