WEB开发网
开发学院软件开发VC .NET中的自绘机制 阅读

.NET中的自绘机制

 2006-07-18 11:26:21 来源:WEB开发网   
核心提示: 在一个 Windows 窗体应用程序中,你可以创建多个上下文菜单,.NET中的自绘机制(10),然后通过各个控制的ContextMenu属性将这些菜单绑定到这些控制上,各个上下文菜单对象必须先用GraphicMenu对象的Init方法进行预处理,作者简介:Dino Esposito 是意大

在一个 Windows 窗体应用程序中,你可以创建多个上下文菜单,然后通过各个控制的ContextMenu属性将这些菜单绑定到这些控制上。各个上下文菜单对象必须先用GraphicMenu对象的Init方法进行预处理,以确定其自定义外观。Figure 10即是一个示例,这个按钮绑定到了一个带有缺省项 Order 的上下文菜单上。

Figure 10 创建上下文菜单

文本框是W indows 窗体中唯一提供了内建上下文菜单的控制。这个控制提供了一个ContextMenu 属性,但是当你右击它时却不会返回一个当前显示的上下文菜单的实例对象。为什么会这样?因为文本框的上下文菜单的相关代码属于Win32平台的固有API。特 别是这个上下文菜单在每次用户右击时才生成,在用户选择后又被释放并销毁。你可以通过设置ContextMenu属性,用自己的菜单替换这个菜单,但这也意味着你将无法再操纵原来的那个菜单。因为这个菜单是如此的短命(并且不受控),那么如何才能轻易地将其子类化并让它实现自绘呢?

我找到的最简单的办法如下:创建一个 TextboxContextMenu 类,对应包含了标准的文本框上下文菜单项(Undo、Cut、Copy之类)的自定义上下文菜单。实现这些方法的代码可以相当轻易地从 MSDN 文档中获得。一旦你获得了这样一个类似文本框标准上下文菜单的受控类后,你先要设置其为自绘方式,然后象下面这样将其绑定到任何一个你希望使用的文本框上即可: Dim txtMenu As New TextBoxContextMenu
gMenu.AddIcon(txtMenu.MenuItemCut, "..\images\cut.bmp")
gMenu.AddIcon(txtMenu.MenuItemCopy, "..\images\copy.bmp")
gMenu.AddIcon(txtMenu.MenuItemPaste, "..\images\paste.bmp")
gMenu.AddIcon(txtMenu.MenuItemDelete, "..\images\delete.bmp")
TextBox1.ContextMenu = txtMenu
gMenu.Init(TextBox1.ContextMenu)   
  TextBoxContextMenu 类与 GraphicMenu 类一同被封装在一个程序集中。因此你必须注意自绘菜单在一个NotifyIcon组件上将不能正常工作。关于这个问题,请参考“Knowledge Base article 827043”。

无缝地使用图形化的菜单

.NET框架支持通过一个封装了Win32自绘机制的编程接口使用图形化的菜单。这些受控的API进行了一定的抽象,但并没有重新设计底层模型。这意味着,图形化菜单只能象本文中所示一样通过自编的代码进行使用。是否有一种方法使这种处理自动化,使我们只需要在IDE(集成开发环境)中设置属性而不必编写代码呢?目前至少需要在父窗口被装载时初始化 GraphicMenu。一种完全隐藏它的方法是创建一个包含了GraphicMenu对象的 窗体类,然后在Load事件中设置主菜单为自绘方式。如果你将这个类加入窗体类的继承体系,那么当你将一个菜单添加到这种窗体上时,它就能自动地获得并显示自定义的外观。自己试试吧! 

译者注

本人一直在使用 C++ 和 C# 编程,对VB一窍不通,因此对于本文VB代码中的注释也没有翻译。整个的翻译过程,只是生硬地逐句翻译,许多词汇的翻译形式也主要参考了.NET Framework SDK中的译法。限于个人翻译水平,只能做到这样了,希望大家能读懂它,呵呵。

作者简介:Dino Esposito 是意大利罗马的一个讲师、顾问。 他是《Programming ASP.NET》(Microsoft Press, 2003)一书的作者,他主要教授和举办 ADO.NET 和 ASP.NET方面的讲座。Email:cutting@microsoft.com .

上一页  5 6 7 8 9 10 

Tags:NET 机制

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接