Cómo: Agregar iconos personalizados a elementos de barras de herramientas y de menús
En este ejemplo se agrega un icono a un botón de barra de comandos de un menú personalizado de Microsoft Office Outlook. El icono se incluye en los recursos del proyecto. Para obtener más información sobre los recursos de proyectos, vea Adding and Editing Resources (Visual C#) y Cómo: Agregar o quitar recursos.
Se aplica a: la información de este tema se aplica a los proyectos de nivel de aplicación para las siguientes aplicaciones: InfoPath 2007, Outlook 2007, Project 2007 y Visio 2007. Para obtener más información, vea Características disponibles por aplicación y tipo de proyecto de Office.
Aunque este ejemplo es específico de Outlook, la parte de este código que agrega un icono a un botón de la barra de comandos se puede utilizar para agregar iconos a un botón de la barra de comandos en cualquiera de las aplicaciones que figuran anteriormente.
Para agregar iconos personalizados
Agregue código al archivo ThisAddIn.vb o ThisAddIn.cs del proyecto de Outlook para crear controles CommandBarPopup y CommandBarButton, que representan el menú personalizado y el comando de menú. Este código comprueba si el menú existe. Si existe, el código quita el menú. A continuación, agrega el nuevo menú.
Private MenuBar As Office.CommandBar Private newMenuBar As Office.CommandBarPopup Private ButtonOne As Office.CommandBarButton Private menuTag As String = "AUniqueName" Private Sub ThisAddIn_Startup(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Startup RemoveMenubar() AddMenuBar() End Sub Private Sub AddMenuBar() Try MenuBar = Me.Application.ActiveExplorer().CommandBars.ActiveMenuBar newMenuBar = MenuBar.Controls.Add( _ Office.MsoControlType.msoControlPopup, _ Temporary:=False) If newMenuBar IsNot Nothing Then newMenuBar.Caption = "See New Icon" newMenuBar.Tag = menuTag ButtonOne = newMenuBar.Controls.Add( _ Office.MsoControlType.msoControlButton, _ Before:=1, Temporary:=False) With ButtonOne .Style = Office.MsoButtonStyle _ .msoButtonIconAndCaption .Caption = "New Icon" .FaceId = 65 .Tag = "c123" .Picture = getImage() End With newMenuBar.Visible = True End If Catch Ex As Exception MsgBox(Ex.Message) End Try End Sub Private Sub RemoveMenubar() Try ' If the menu already exists, remove it. Dim foundMenu As Office.CommandBarPopup = _ Me.Application.ActiveExplorer().CommandBars.ActiveMenuBar. _ FindControl(Office.MsoControlType.msoControlPopup, _ System.Type.Missing, menuTag, True, True) If foundMenu IsNot Nothing Then foundMenu.Delete(True) End If Catch Ex As Exception MsgBox(Ex.Message) End Try End Sub
private Office.CommandBar menuBar; private Office.CommandBarPopup newMenuBar; private Office.CommandBarButton buttonOne; private string menuTag = "AUniqueTag"; private void ThisAddIn_Startup(object sender, System.EventArgs e) { RemoveMenubar(); AddMenuBar(); } private void AddMenuBar() { try { menuBar = this.Application.ActiveExplorer().CommandBars.ActiveMenuBar; newMenuBar = (Office.CommandBarPopup)menuBar.Controls.Add( Office.MsoControlType.msoControlPopup, missing, missing, missing, false); if (newMenuBar != null) { newMenuBar.Caption = "See New Icon"; newMenuBar.Tag = menuTag; buttonOne = (Office.CommandBarButton) newMenuBar.Controls. Add(Office.MsoControlType.msoControlButton, System. Type.Missing, System.Type.Missing, 1, true); buttonOne.Style = Office.MsoButtonStyle. msoButtonIconAndCaption; buttonOne.Caption = "New Icon"; buttonOne.FaceId = 65; buttonOne.Tag = "c123"; buttonOne.Picture = getImage(); newMenuBar.Visible = true; } } catch (Exception ex) { System.Windows.Forms.MessageBox.Show(ex.Message); } } private void RemoveMenubar() { // If the menu already exists, remove it. try { Office.CommandBarPopup foundMenu = (Office.CommandBarPopup) this.Application.ActiveExplorer().CommandBars.ActiveMenuBar. FindControl(Office.MsoControlType.msoControlPopup, System.Type.Missing, menuTag, true, true); if (foundMenu != null) { foundMenu.Delete(true); } } catch (Exception ex) { System.Windows.Forms.MessageBox.Show(ex.Message); } }
Cree una clase nueva denominada ConvertImage. Esta clase utiliza System.Forms.Axhost para convertir un archivo Image en un tipo de imagen que se puede aplicar al elemento de menú.
<Global.System.Security.Permissions.PermissionSetAttribute _ (Global.System.Security.Permissions.SecurityAction.Demand, Name:="FullTrust")> _ Public Class ConvertImage Inherits System.Windows.Forms.AxHost Public Sub New() MyBase.New("59EE46BA-677D-4d20-BF10-8D8067CB8B32") End Sub Public Shared Function Convert(ByVal Image _ As System.Drawing.Image) As stdole.IPictureDisp Convert = GetIPictureFromPicture(Image) End Function End Class
sealed public class ConvertImage : System.Windows.Forms.AxHost { private ConvertImage() : base(null) { } public static stdole.IPictureDisp Convert (System.Drawing.Image image) { return (stdole.IPictureDisp)System. Windows.Forms.AxHost .GetIPictureDispFromPicture(image); } }
Agregue un método para convertir el archivo de icono en un archivo Image agregándolo a ImageList. Este código envía el archivo Image al método ConvertImage.Convert que se creó y, a continuación, devuelve el archivo al llamador.
Private Function getImage() As stdole.IPictureDisp Dim tempImage As stdole.IPictureDisp = Nothing Try Dim newIcon As System.Drawing.Icon = My.Resources.Icon1 Dim newImageList As New System.Windows.Forms.ImageList newImageList.Images.Add(newIcon) tempImage = ConvertImage.Convert(newImageList.Images(0)) Catch ex As Exception MsgBox(ex.Message) End Try Return tempImage End Function
private stdole.IPictureDisp getImage() { stdole.IPictureDisp tempImage = null; try { System.Drawing.Icon newIcon = Properties.Resources.Icon1; System.Windows.Forms.ImageList newImageList = new System.Windows.Forms.ImageList(); newImageList.Images.Add(newIcon); tempImage = ConvertImage.Convert(newImageList.Images[0]); } catch (Exception ex) { System.Windows.Forms.MessageBox.Show(ex.Message); } return tempImage; }
Compilar el código
Para este ejemplo se necesita:
- Un icono denominado Icon1 en los recursos del proyecto.
Vea también
Tareas
Cómo: Crear barras de herramientas de Office
Cómo: Agregar menús y elementos de menú personalizados a Outlook
Cómo: Agregar o quitar recursos
Cómo: Especificar el icono de una aplicación (Visual Basic, C#)