OVH Cloud OVH Cloud

Image dans un menu contextuel

4 réponses
Avatar
Thierry
Bonjour,

Savez-vous s'il est possible d'associer une image à un élément d'un menu
contextuel (genre le premier) ?
Après avoir regardé, je n'ai pas l'impression.... :o(
J'utilise le framework .Net 1.1.

Merci
Bonne journée
-Thierry-

4 réponses

Avatar
Delf
Thierry wrote:

Savez-vous s'il est possible d'associer une image à un élément d'un menu
contextuel (genre le premier) ?



Après avoir regardé, je n'ai pas l'impression.... :o(
J'utilise le framework .Net 1.1.



Sous 1.1 jamais regardé mais dans la version 2005 beta2 oui c'est possible.

--
Delf
Avatar
Thierry
Et concrètement, sais tu comment il est possible de le faire ?

Merci
Bonne journée
-Thierry-

"Delf" a écrit dans le message de news:
42afd296$0$11331$
Thierry wrote:

Savez-vous s'il est possible d'associer une image à un élément d'un menu
contextuel (genre le premier) ?



Après avoir regardé, je n'ai pas l'impression.... :o(
J'utilise le framework .Net 1.1.



Sous 1.1 jamais regardé mais dans la version 2005 beta2 oui c'est
possible.

--
Delf


Avatar
Zoury
Salut Thierry ! :O)

Tu dois les dessiner toi même en implémentant l'événement MenuItemDrawItem.

Je t'ai fais un petit exemple. Ouvre un nouveau project de type Application
Windows et colle ce code dedans :
//***
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;

namespace IconAndMenuItemProject
{
public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.ContextMenu contextMenu1;
private System.Windows.Forms.MenuItem menuItem1;
private System.Windows.Forms.MenuItem menuItem2;
private System.Windows.Forms.MenuItem menuItem3;
private System.ComponentModel.Container components = null;
private Icon _icon;

public Form1()
{
InitializeComponent();
}

protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}


#region Code généré par le Concepteur Windows Form
/// <summary>
/// Méthode requise pour la prise en charge du concepteur - ne modifiez
pas
/// le contenu de cette méthode avec l'éditeur de code.
/// </summary>
private void InitializeComponent()
{
this.contextMenu1 = new System.Windows.Forms.ContextMenu();
this.menuItem1 = new System.Windows.Forms.MenuItem();
this.menuItem2 = new System.Windows.Forms.MenuItem();
this.menuItem3 = new System.Windows.Forms.MenuItem();
//
// contextMenu1
//
this.contextMenu1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[]
{
this.menuItem1,
this.menuItem2,
this.menuItem3});
//
// menuItem1
//
this.menuItem1.Index = 0;
this.menuItem1.Text = "MenuItem 1";
//
// menuItem2
//
this.menuItem2.Index = 1;
this.menuItem2.Text = "MenuItem 2";
//
// menuItem3
//
this.menuItem3.Index = 2;
this.menuItem3.Text = "MenuItem 3";
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(292, 266);
this.Name = "Form1";
this.Text = "Form1";
this.Load += new System.EventHandler(this.Form1_Load);
this.MouseUp += new
System.Windows.Forms.MouseEventHandler(this.Form1_MouseUp);
this.Closed += new System.EventHandler(this.Form1_Closed);

}
#endregion

/// <summary>
/// Point d'entrée principal de l'application.
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new Form1());
}

private void Form1_Load(object sender, System.EventArgs e)
{
_icon = new Icon(new Icon(@"c:my_icon.ico"), new Size(16, 16));
InitMenuItems();
}

private void Form1_MouseUp(object sender,
System.Windows.Forms.MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
contextMenu1.Show(this, new Point(e.X, e.Y));
}

private void MenuItem_MeasureItem(object sender, MeasureItemEventArgs e)
{

SizeF size = e.Graphics.MeasureString(((MenuItem)sender).Text,
this.Font);
//largeur = icône (16 x 16) + texte
e.ItemWidth = (Int32)size.Width + _icon.Width;
e.ItemHeight = (Int32)size.Height;
}

private void MenuItem_DrawItem(object sender, DrawItemEventArgs e)
{
Brush backBrush;
Brush foreBrush;

// on test l'état modifie les couleurs en conséquence
if ((e.State & DrawItemState.Selected) == DrawItemState.Selected)
{
backBrush = SystemBrushes.Highlight;
foreBrush = SystemBrushes.HighlightText;
}
else
{
backBrush = SystemBrushes.Menu;
foreBrush = SystemBrushes.ControlText;
}
// dessine le background
e.Graphics.FillRectangle(backBrush, e.Bounds);

// on test l'index et place une icône à l'index 0 et 2
if (e.Index == 0 || e.Index == 2)
e.Graphics.DrawIcon(_icon, e.Bounds.X, e.Bounds.Y);

// dessine le texte
e.Graphics.DrawString(((MenuItem)sender).Text, this.Font, foreBrush,
(Single)(e.Bounds.X + _icon.Width), (Single)e.Bounds.Y);
}

private void Form1_Closed(object sender, System.EventArgs e)
{
CleanUpMenuItems();
}

private void InitMenuItems()
{
foreach (MenuItem mi in contextMenu1.MenuItems)
{
mi.OwnerDraw = true;
mi.MeasureItem += new MeasureItemEventHandler(MenuItem_MeasureItem);
mi.DrawItem += new DrawItemEventHandler(MenuItem_DrawItem);
}
}

private void CleanUpMenuItems()
{
foreach (MenuItem mi in contextMenu1.MenuItems)
{
mi.MeasureItem -= new MeasureItemEventHandler(MenuItem_MeasureItem);
mi.DrawItem -= new DrawItemEventHandler(MenuItem_DrawItem);
}
}
}
}
//***

--
Cordialement
Yanick
MVP pour Visual Basic
"Thierry" a écrit dans le message de
news:
Bonjour,

Savez-vous s'il est possible d'associer une image à un élément d'un menu
contextuel (genre le premier) ?
Après avoir regardé, je n'ai pas l'impression.... :o(
J'utilise le framework .Net 1.1.

Merci
Bonne journée
-Thierry-




Avatar
Thierry
Oki, merci beaucoup, je vais de ce pas mettre tout ca en oeuvre ;o)

Merci
-Thierry-

"Zoury" <yanick_lefebvre at hotmail dot com> a écrit dans le message de
news:
Salut Thierry ! :O)

Tu dois les dessiner toi même en implémentant l'événement
MenuItemDrawItem.

Je t'ai fais un petit exemple. Ouvre un nouveau project de type
Application
Windows et colle ce code dedans :
//***
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;

namespace IconAndMenuItemProject
{
public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.ContextMenu contextMenu1;
private System.Windows.Forms.MenuItem menuItem1;
private System.Windows.Forms.MenuItem menuItem2;
private System.Windows.Forms.MenuItem menuItem3;
private System.ComponentModel.Container components = null;
private Icon _icon;

public Form1()
{
InitializeComponent();
}

protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}


#region Code généré par le Concepteur Windows Form
/// <summary>
/// Méthode requise pour la prise en charge du concepteur - ne modifiez
pas
/// le contenu de cette méthode avec l'éditeur de code.
/// </summary>
private void InitializeComponent()
{
this.contextMenu1 = new System.Windows.Forms.ContextMenu();
this.menuItem1 = new System.Windows.Forms.MenuItem();
this.menuItem2 = new System.Windows.Forms.MenuItem();
this.menuItem3 = new System.Windows.Forms.MenuItem();
//
// contextMenu1
//
this.contextMenu1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[]
{
this.menuItem1,
this.menuItem2,
this.menuItem3});
//
// menuItem1
//
this.menuItem1.Index = 0;
this.menuItem1.Text = "MenuItem 1";
//
// menuItem2
//
this.menuItem2.Index = 1;
this.menuItem2.Text = "MenuItem 2";
//
// menuItem3
//
this.menuItem3.Index = 2;
this.menuItem3.Text = "MenuItem 3";
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(292, 266);
this.Name = "Form1";
this.Text = "Form1";
this.Load += new System.EventHandler(this.Form1_Load);
this.MouseUp += new
System.Windows.Forms.MouseEventHandler(this.Form1_MouseUp);
this.Closed += new System.EventHandler(this.Form1_Closed);

}
#endregion

/// <summary>
/// Point d'entrée principal de l'application.
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new Form1());
}

private void Form1_Load(object sender, System.EventArgs e)
{
_icon = new Icon(new Icon(@"c:my_icon.ico"), new Size(16, 16));
InitMenuItems();
}

private void Form1_MouseUp(object sender,
System.Windows.Forms.MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
contextMenu1.Show(this, new Point(e.X, e.Y));
}

private void MenuItem_MeasureItem(object sender, MeasureItemEventArgs e)
{

SizeF size = e.Graphics.MeasureString(((MenuItem)sender).Text,
this.Font);
//largeur = icône (16 x 16) + texte
e.ItemWidth = (Int32)size.Width + _icon.Width;
e.ItemHeight = (Int32)size.Height;
}

private void MenuItem_DrawItem(object sender, DrawItemEventArgs e)
{
Brush backBrush;
Brush foreBrush;

// on test l'état modifie les couleurs en conséquence
if ((e.State & DrawItemState.Selected) == DrawItemState.Selected)
{
backBrush = SystemBrushes.Highlight;
foreBrush = SystemBrushes.HighlightText;
}
else
{
backBrush = SystemBrushes.Menu;
foreBrush = SystemBrushes.ControlText;
}
// dessine le background
e.Graphics.FillRectangle(backBrush, e.Bounds);

// on test l'index et place une icône à l'index 0 et 2
if (e.Index == 0 || e.Index == 2)
e.Graphics.DrawIcon(_icon, e.Bounds.X, e.Bounds.Y);

// dessine le texte
e.Graphics.DrawString(((MenuItem)sender).Text, this.Font, foreBrush,
(Single)(e.Bounds.X + _icon.Width), (Single)e.Bounds.Y);
}

private void Form1_Closed(object sender, System.EventArgs e)
{
CleanUpMenuItems();
}

private void InitMenuItems()
{
foreach (MenuItem mi in contextMenu1.MenuItems)
{
mi.OwnerDraw = true;
mi.MeasureItem += new MeasureItemEventHandler(MenuItem_MeasureItem);
mi.DrawItem += new DrawItemEventHandler(MenuItem_DrawItem);
}
}

private void CleanUpMenuItems()
{
foreach (MenuItem mi in contextMenu1.MenuItems)
{
mi.MeasureItem -= new MeasureItemEventHandler(MenuItem_MeasureItem);
mi.DrawItem -= new DrawItemEventHandler(MenuItem_DrawItem);
}
}
}
}
//***

--
Cordialement
Yanick
MVP pour Visual Basic
"Thierry" a écrit dans le message de
news:
Bonjour,

Savez-vous s'il est possible d'associer une image à un élément d'un menu
contextuel (genre le premier) ?
Après avoir regardé, je n'ai pas l'impression.... :o(
J'utilise le framework .Net 1.1.

Merci
Bonne journée
-Thierry-