正在阅读:用C#实现office2003风格的菜单组件用C#实现office2003风格的菜单组件

2005-08-24 09:49 出处: 作者:cp(阿才翻译) 责任编辑:moningfeng

  组件的实现方法及原理

  组件由三个类实现,这三个类分别为OfficeMenus,MainMenuItemDrawing和MenuItemDrawing,都位于命名空间Dev4Arabs中。由于实现代码较长,所以在此只给出了组件实现的思路。
组件实现的第一步是从System.ComponentModel.Component类派生类OfficeMenus。定义如下:

public class OfficeMenus : System.ComponentModel.Component


  然后在类中定义两静态变量:

//图像列表用来存储菜单中用到的图标
static ImageList _imageList;
// 存储图片细节的一个名称集合,NameValueCollection的详细说明请查阅MSDN,该类主要用来使每个菜单的句柄与每个图标形成一一对应的关系,以便后面绘制菜单顶的图标时快速地找到某个菜单所对应的图标。 static NameValueCollection picDetails = new NameValueCollection();


  接下来定义公共接口方法start和End。
  公共接口方法Start的实现原理如下:

public void Start(Form form)
{
先从Start传入的参数中获得该窗口的主菜单。接下来为每一个主菜单下的MenuItem添加MeasureItem事件
处理mainMenuItem_MeasureItem和DrawItem事件处理mainMenuItem_DrawItem,
将MenuItem的OwnerDraw属性设置为true,并使用InitMenuItem(Menu mi)方法对每个MenuItem应用改变。
然后再从form参数中获取该窗口的上下文菜单对象,对其调用InitMenuItem(Menu mi)应用改变。
最后循环查找窗口中包含的每个子控件的上下文菜单,对其应用改变。


System.Windows.Forms.MainMenu menu = form.Menu;
foreach ( MenuItem mi in menu.MenuItems )
{
mi.MeasureItem += new System.Windows.Forms.MeasureItemEventHandler(mainMenuItem_MeasureItem);
mi.DrawItem += new System.Windows.Forms.DrawItemEventHandler(mainMenuItem_DrawItem);
mi.OwnerDraw = true;
InitMenuItem(mi);
}
ContextMenu cmenu = form.ContextMenu;
if ( cmenu != null ) {InitMenuItem(cmenu);}
foreach ( Control c in form.Controls ) {
if ( c.ContextMenu != null )
InitMenuItem(c.ContextMenu);}
catch {}
}



  End方法与这类似,只须将InitMenuItem换为UninitMenuItem,这里就不再举出了。具体实现代码请到http://www.codeproject.com/cs/menu/MhOffice2003Menus.asp下载。
  为每个菜单应用改变的InitMenuItem方法的实现如下:

private void InitMenuItem(Menu mi)
{
循环查找mi中的每个MenuItem,为其添加MeasureItem事件处理menuItem_MeasureItem和
DrawItem事件处理menuItem_DrawItem(注意,此处的事件处理方法名称与Start中对
主菜单的事件处理方法名称不同),并将OwnerDraw属性设置为true。使用递归调用对每个查找
到的MenuItem调用InitMenuItem方法,这样便可以对菜单项下的所有级别的子菜单项都应用到改变。
}


UninitMenuItem的定义与此类似。

键盘也能翻页,试试“← →”键

关注我们

最新资讯离线随时看 聊天吐槽赢奖品