科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件定制VB.NET控件编程之拦截击键动作

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

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

在开发定制Windows表单控件时,提供我们自己的下拉框类型编辑器来操作控件的属性常常是非常方便的

作者:朱先忠编译 来源:天极开发 2007年11月9日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
三、 几个关键问题与解案

  为了开发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键。

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章