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])]; }
|