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

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

menuItem_MeasureItem事件处理方法定义如下:

private void menuItem_MeasureItem(object sender, System.Windows.Forms.MeasureItemEventArgs e)
{
先取得要进行消息处理的MenuItem对象(MenuItem item = (MenuItem) sender;)。
if (item为seperator ) { e.ItemHeight = 7;}
else {
获取item的文字宽度,如果有快捷键,还要获取item中的快捷键所占用的宽度。
设置item的边界:e.ItemHeight = 文字高度+7; e.ItemWidth = 文字宽度 + 快捷键的宽度 + 图标宽度*2;
}
}


  menuItem_DrawItem的实现如下:

private void menuItem_DrawItem(object sender, System.Windows.Forms.DrawItemEventArgs e)
{
MenuItemDrawing.DrawMenuItem(e, (MenuItem) sender);
}


  该函数只是简单地调用了类MenuItemDrawing中的静态方法DrawMenuItem。
  Start中为主菜单的子菜单添加事件处理的mainMenuItem_MeasureItem和mainMenuItem_DrawItem的定义如下:

private void mainMenuItem_MeasureItem(object sender, System.Windows.Forms.MeasureItemEventArgs e)
{
MenuItem mi = (MenuItem) sender;//获得菜单项对象
SizeF miSize = e.Graphics.MeasureString(mi.Text, Globals.menuFont);
//由于顶级菜单(如文件菜单)无快捷键和图标,所以绘制的宽度为文字的宽度。
e.ItemWidth = Convert.ToInt32(miSize.Width);
}

private void mainMenuItem_DrawItem(object sender, System.Windows.Forms.DrawItemEventArgs e)
{
MainMenuItemDrawing.DrawMenuItem(e, (MenuItem) sender);
}


  该方法只是调用了类MainMenuItemDrawing中的静态方法DrawMenuItem进行菜单绘制。
  其它方法如AddPicture和GetItemPicture的定义如下:

public void AddPicture(MenuItem mi, int index)
{
//将菜单项的句柄转化为字符串与图标的索引一一对应添加到picDetails集合中。
picDetails.Add(mi.Handle.ToString(), index.ToString());
}
public static Bitmap GetItemPicture(MenuItem mi)
{
if ( _imageList == null )
return null;
//将菜单项的句柄作为键查找该键对应的值,返回值为图标索引
string [] picIndex = picDetails.GetValues(mi.Handle.ToString());
if ( picIndex == null )
return null;
else
//根据索引取出位图对象并返回
return (Bitmap)_imageList.Images[Convert.ToInt32(picIndex[0])];
}


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

关注我们

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