CONTEXTMENU的Item也是MenuItem啊,这不是一样的么?你能重画一般的菜单 也就能画ContentMenu了.

解决方案 »

  1.   

    但是我要画的图片是属于CONTEXTMENU的,不是属于MENUITEM的。
      

  2.   

    http://www.codeproject.com/cs/menu/MenuExtender.asp
      

  3.   

    不是吧,CONTEXTMENU中的小项内容不也是menuitem吗,一样方法
      

  4.   

    我知道 CONTEXTMENU的Item也是MenuItem,我也重画了每个MENUITEM。
    但是CONTEXTMENU左侧的图片不属于任何一个MENUITEM呀,我的问题是这个图片该怎么画!
      

  5.   

    参考 private void menuItem1_DrawItem_1(object sender, System.Windows.Forms.DrawItemEventArgs e)
    {
    // Create stringFormat object
    StringFormat sf = new StringFormat(); // set the Alignment to center
    sf.LineAlignment = StringAlignment.Center;
    sf.Alignment = StringAlignment.Center; // Draw the text
    e.Graphics.DrawString(mi.Text, 
    Globals.menuFont, 
    new SolidBrush(Globals.TextColor), 
    e.Bounds , 
    sf);
    Rectangle rect1 = new Rectangle(e.Bounds.X, 
    e.Bounds.Y + 1, 
    12, 
    e.Bounds.Height - 1);
    e.Graphics.DrawImage(this.imageList1.Images[1], rect1) ;

    } private void menuItem1_MeasureItem_1(object sender, System.Windows.Forms.MeasureItemEventArgs e)
    {
    MenuItem mi = (MenuItem) sender;
    // if the item is a seperator
    if ( mi.Text == "-" ) 
    {
    e.ItemHeight = 7;

    else 
    {
    // get the item's text size
    SizeF miSize = e.Graphics.MeasureString(mi.Text, Globals.menuFont);
    int scWidth = 0;
    // get the short cut width
    if ( mi.Shortcut != Shortcut.None ) 
    {
    SizeF scSize = e.Graphics.MeasureString(mi.Shortcut.ToString(), Globals.menuFont);
    scWidth = Convert.ToInt32(scSize.Width);
    }
    // set the bounds
    int miHeight = Convert.ToInt32(miSize.Height) + 7;
    if (miHeight < 25) miHeight = Globals.MIN_MENU_HEIGHT;
    e.ItemHeight = miHeight;
    e.ItemWidth = Convert.ToInt32(miSize.Width) + scWidth + (Globals.PIC_AREA_SIZE * 2);
    }

    }
      

  6.   

    this.menuItem1.OwnerDraw = true;
    this.imageList1.Images[1]要求你添加一个图像列表
      

  7.   

    更正
    private void menuItem1_DrawItem_1(object sender, System.Windows.Forms.DrawItemEventArgs e)
    {
    MenuItem mi = (MenuItem) sender;
    // Create stringFormat object
    StringFormat sf = new StringFormat(); // set the Alignment to center
    sf.LineAlignment = StringAlignment.Center;
    sf.Alignment = StringAlignment.Center; // Draw the text
    e.Graphics.DrawString(mi.Text, 
    Globals.menuFont, 
    new SolidBrush(Globals.TextColor), 
    e.Bounds , 
    sf);
    Rectangle rect1 = new Rectangle(e.Bounds.X, 
    e.Bounds.Y + 1, 
    12, 
    e.Bounds.Height - 1);
    e.Graphics.DrawImage(this.imageList1.Images[1], rect1) ;

    } private void menuItem1_MeasureItem_1(object sender, System.Windows.Forms.MeasureItemEventArgs e)
    {
    //MessageBox.Show(sender.ToString());
    MenuItem mi = (MenuItem) sender;
    // if the item is a seperator
    if ( mi.Text == "-" ) 
    {
    e.ItemHeight = 7;

    else 
    {
    // get the item's text size
    SizeF miSize = e.Graphics.MeasureString(mi.Text, Globals.menuFont);
    int scWidth = 0;
    // get the short cut width
    if ( mi.Shortcut != Shortcut.None ) 
    {
    SizeF scSize = e.Graphics.MeasureString(mi.Shortcut.ToString(), Globals.menuFont);
    scWidth = Convert.ToInt32(scSize.Width);
    }
    // set the bounds
    int miHeight = Convert.ToInt32(miSize.Height) + 7;
    if (miHeight < 25) miHeight = Globals.MIN_MENU_HEIGHT;
    e.ItemHeight = miHeight;
    e.ItemWidth = Convert.ToInt32(miSize.Width) + scWidth + (Globals.PIC_AREA_SIZE * 2);
    }
      

  8.   

    添加一个类
    public class Globals
    {
    public static int PIC_AREA_SIZE = 24;
    public static int MIN_MENU_HEIGHT = 22;
    public static Font menuFont = System.Windows.Forms.SystemInformation.MenuFont; 
    public static Color CheckBoxColor = Color.FromArgb(255, 192, 111);
    public static Color UnCheckBoxColor = Color.FromArgb(182,189,250);
    public static Color DarkCheckBoxColor = Color.FromArgb(254, 128, 62);
    public static Color SelectionColor = Color.FromArgb(255,238,194);
    public static Color TextColor = Color.FromKnownColor(KnownColor.MenuText);
    public static Color TextDisabledColor = Color.FromKnownColor(KnownColor.GrayText);
    public static Color MenuBgColor = Color.White;
    public static Color MainColor = Color.FromKnownColor(KnownColor.Control);
    public static Color MenuDarkColor = Color.FromKnownColor(KnownColor.ActiveCaption);
    public static Color MenuDarkColor2 = Color.FromArgb(110, Color.FromKnownColor(KnownColor.ActiveCaption));
    public static Color MenuLightColor = Color.FromKnownColor(KnownColor.InactiveCaption);
    public static Color MenuLightColor2 = Color.FromArgb(50, Color.FromKnownColor(KnownColor.InactiveCaption));
    public static int height = 20; }
      

  9.   

    谢谢楼上的热心,不过您的方法我已经会了。我的问题是画左边的图片!!
    “我知道 CONTEXTMENU的Item也是MenuItem,我也重画了每个MENUITEM。
    但是CONTEXTMENU左侧的图片不属于任何一个MENUITEM呀,我的问题是这个图片该怎么画!”
      

  10.   

    e.Graphics.DrawImage(this.imageList1.Images[0], rect1) ;
    不就是画图片吗?
      

  11.   

    这个画的是每个MENUITEM中的小图片,我要画的是整个CONTEXTMENU左侧的大图片,请您看一下QQ的主菜单,就是左侧“蓝色TENCENT标志”的那一条。
      

  12.   

    强烈推荐
    http://www.codeproject.com/cs/menu/MhOffice2003Menus.asp
    有源码的,你自己好好参考参考
      

  13.   

    Rectangle rect1 = new Rectangle(e.Bounds.X, 
    e.Bounds.Y + 1, 
    Globals.PIC_AREA_SIZE, 
    60);//假设第一个菜单的名字是"第一项",你自己调节好高度,自己节个图片
    if(mi.Text == "第一项")
    {
    Bitmap MyImage = new Bitmap(@"d:\1.bmp");
    e.Graphics.DrawImage(MyImage, rect1) ;
    }
      

  14.   

    private void menuItem1_DrawItem_1(object sender, System.Windows.Forms.DrawItemEventArgs e)
    {
    MenuItem mi = (MenuItem) sender;
    // Create stringFormat object
    StringFormat sf = new StringFormat(); // set the Alignment to center
    sf.LineAlignment = StringAlignment.Center;
    sf.Alignment = StringAlignment.Center; // Draw the text
    e.Graphics.DrawString(mi.Text, 
    Globals.menuFont, 
    new SolidBrush(Globals.TextColor), 
    e.Bounds , 
    sf);
    Rectangle rect1 = new Rectangle(e.Bounds.X, 
    e.Bounds.Y + 1, 
    Globals.PIC_AREA_SIZE, 
    60);
    if(mi.Text == "第一项")
    {
    Bitmap MyImage = new Bitmap(@"d:\1.bmp");
    e.Graphics.DrawImage(MyImage, rect1) ;
    }
    else
    {
    // Bitmap MyImage = new Bitmap(@"d:\1.bmp");
    // e.Graphics.DrawImage(MyImage, rect1) ;
    }

    }
      

  15.   

    再参照
    http://www.codeproject.com/cs/menu/MhOffice2003Menus.asp
    设计好效果
      

  16.   

    我昨天也解决了这个问题,也是把那个大图片截成跟每个MENUITEM一样高度的图片,分别画,这样可以达到那样的效果。但这样做可扩展性太差了,如果要加入一个新的MENUITEM,那图片就又得重画了;如果有个高度不同的MENUITEM,所有图片就又得重截。
    也不知道是不是还有更好的办法?