| |
用C#实现office2003风格的菜单组件 |
出处:CP |
|
| [ 2005-08-24 09:49:07
] |
作者:cp(阿才翻译)
|
责任编辑:moningfeng |
类MainMenuItemDrawing主要负责主菜单的一级子菜单(如常见的文件菜单)的绘制。 实现如下:
public class MainMenuItemDrawing { //静态方法,实现菜单项的绘制 public static void DrawMenuItem(System.Windows.Forms.DrawItemEventArgs e, MenuItem mi) { 首先检查menuItem的状态,如为鼠标悬浮在其上的状态,则调用DrawHoverRect绘制并填充悬浮矩形; 如为选定态,则调用DrawSelectionRect绘制并填充相应的选定态时的矩形; 如两者都不是,则用控件的填充色绘制并填充矩形。 最后利用e.Graphics.DrawString方法绘制菜单文字。 } …… } 类MenuItemDrawing负责主菜单的子菜单和上下文菜单的绘制。
public class MenuItemDrawing { //静态方法,实现菜单项的绘制 public static void DrawMenuItem(System.Windows.Forms.DrawItemEventArgs e, MenuItem mi) { 检查菜单顶是否被选中,如被选中,则调用DrawSelectionRect绘制并填充选中后的矩形, 否则只用背景色绘制空白区域并调用DrawPictureArea绘制图片区域。 调用DrawCheckBox绘制复合框如果该菜单项被选中。 调用DrawMenuText绘制菜单项文字。最后调用DrawItemPicture绘制图标。 } …… } 你对源码有兴趣。可以下载本文提供的源代码也可以从http://www.codeproject.com/cs/menu/MhOffice2003Menus.asp下载。
由于绘制的代码比较长,不宜在文中全部给出,所以具体的绘制代码将省去。文中只是给出了实现该组件的思路。
结束语:由于.net中使用了GDI+,所以组件的绘制工作比以前在MFC或者Win32API模式下绘制要容易地多。组件的开发最重要的一点就是当菜单项被置为自绘方式后,用户需要激活两个事件来定制菜单的显示。第一个事件对应Win32的WM_MEASUREITEM消息。窗口收到这个消息时,它就会触发一个 MeasureItem 事件给所有的自绘 MenuItem 对象。这个事件代理(Delegate)是一个名为MeasureItemEventHandler的类,与此事件相关的信息都被存储在一个MeasureItemEventArgs 对象中并被传递到事件处理函数(文中为mainMenuItem_MeasureItem或者menuItem_MeasureItem)。第二个事件与 Win32 的WM_DRAWITEM消息对应,并给每个注册了的事件处理函数传递一个 DrawItemEventArgs 对象。这个事件代理是一个名为DrawItemEventHandler的类。个人认为组件实现的难点和重点就是在两事件处理函数中根据菜单的不同状态所要进行的不同绘制工作。
|