Web Analytics Assegnare immagini personalizzate ad un comando del Ribbon - Blog di Laura Ciccarese

Blog di Laura Ciccarese

Office: un mondo da scoprire! Approfondimenti, Automation, VBA e altro ancora...

Assegnare immagini personalizzate ad un comando del Ribbon

Oggi rispondo ad un quesito che sicuramente interessa molti: assegnare un’icona personalizzata ad un comando nel Ribbon.

Maggiori chiarimenti e dettagli saranno disponibili prossimamente in un articolo che sto preparando sul Ribbon, nel quale si analizza un caso studio completo; per il momento vi darò solo le indicazioni necessarie a rispondere velocemente a quanti hanno la necessità di risolvere il problema delle immagini non Office.

Supponiamo allora di voler assegnare l’icona “sqltut.ico” (o una qualsiasi, naturalmente) al comando “Insersci Logo” di una scheda personalizzata.

Operazioni da eseguire

1. indicare al Ribbon che l’icona da utilizzare per il nostro comando non è un’icona di Office;

2. convertire la nostra icona in un oggetto di tipo IPictureDisp, utilizzato dal Ribbon per assegnare immagini esterne.

Procedimento

Modifica del file Ribbon.xml

Oltre a correggere l’id e l’etichetta del tab e del gruppo di comandi, è necessario sostituire l’attributo relativo all’immagine statica:

imageMso="HappyFace"

con l’attributo che recupera l’immagine mediante la funzione GetMyImage:

getImage ="GetMyImage"

Il risultato sarà il seguente:

 

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" onLoad="OnLoad">

<ribbon>

<tabs>

<tab id="SchedaPersonalizzata"

label ="Scheda Personalizzata">

<group id="Immagini"

label="Immagini aziendali">

<toggleButton id="InserisciLogo"

size="large"

label="Inserisci Logo"

screentip="Inserisce il logo aziendale nell’intestazione di pagina"

onAction="OnToggleButton"

getImage ="GetMyImage" />

</group>

</tab>

</tabs>

</ribbon>

</customUI>

 

Il Ribbon utilizzerà la funzione (callback) GetMyImage per passare l’id del comando e riceverne l’IPictureDisp da utilizzare per l’icona.

L'icona da utilizzare deve esssere inserita come risorsa nel progetto.

Caricamento dell’icona nelle risorse del progetto di Visual Studio

1. Doppio click su Proprietà nel Solution Explorer

CustomIcon01

2. Attivare il tab Resources

3. Fare click su Add resources

4. Fare click su Add from existing file

CustomIcon03CustomIcon02CustomIcon03CustomIcon02CustomIcon03CustomIcon02

5. Chiudere la finestra delle risorse e fare click destro sul file corrispondente all’icona

6. Nella proprietà Build Action selezionare Embedded Resource (in tal modo, se si modifica nell’editor di Visual Studio, le modifiche saranno apportate istantaneamente)

L’icona viene aggiunta alle risorse del progetto:

CustomIcon04

Callback GetMyImage

Posizionare la funzione GetMyImage nella sezione callbacks del file Ribbon.cs, dopo la callback OnToggleButton:

VB

Public Function GetMyImage (ByVal control As Office.IRibbonControl) As stdole.IPictureDisp

Dim pictureDisp As stdole.IPictureDisp

pictureDisp = Nothing

Select Case control.Id

Case " InserisciLogo "

pictureDisp = ImageConverter.Convert(GetResourceBitmap("sqltut.ico"))

End Select

Return pictureDisp

End Function

C#

public stdole.IPictureDisp GetMyImage(Office.IRibbonControl control)

{

stdole.IPictureDisp pictureDisp = null;

switch (control.Id)

{

case "InserisciLogo":

pictureDisp =

ImageConverter.Convert(GetResourceBitmap("sqltut.ico"));

break;

}

return pictureDisp;

}

Funzioni per la conversione dell’immagine

Aggiungere il metodo GetResourceBitmap nella regione helper del Ribbon.cs

VB

Public Shared Function GetResourceBitmap(ByVal resourceName As String) As System.Drawing.Bitmap

Dim asm As Assembly

Dim resources As String()

Dim image As System.Drawing.Bitmap

asm = Assembly.GetExecutingAssembly()

resources = asm.GetManifestResourceNames()

image = Nothing

For Each resource As String In resources

If (resource.EndsWith(resourceName)) Then

Dim stream As System.IO.Stream

stream = asm.GetManifestResourceStream(resource)

If (stream Is Nothing) Then

Exit For

End If

Dim extension As String

extension = System.IO.Path.GetExtension(resourceName).ToLower()

image = New System.Drawing.Icon(stream).ToBitmap()

stream.Close()

Exit For

End If

Next

Return image

End Function

C#

public static System.Drawing.Bitmap GetResourceBitmap(string resourceName)

{

Assembly asm = Assembly.GetExecutingAssembly();

string[] resources = asm.GetManifestResourceNames();

System.Drawing.Bitmap image = null;

foreach (string resource in resources)

{

if (resource.EndsWith(resourceName))

{

System.IO.Stream stream =

asm.GetManifestResourceStream(resource);

if (stream == null)

{

break;

}

string extension =

System.IO.Path.GetExtension(resourceName).ToLower();

image = new System.Drawing.Icon(stream).ToBitmap();

stream.Close();

break;

}

}

return image;

}

Aggiungere la classe ImageConverter alla fine del Ribbon.cs

VB

Friend Class ImageConverter

Inherits System.Windows.Forms.AxHost

Sub New()

MyBase.New(Nothing)

End Sub

Public Shared Function Convert(ByVal image As System.Drawing.Image) As stdole.IPictureDisp

Return AxHost.GetIPictureDispFromPicture(image)

End Function

End Class

C#

internal class ImageConverter : System.Windows.Forms.AxHost

{

private ImageConverter()

: base(null)

{

}

public static stdole.IPictureDisp Convert(System.Drawing.Image image)

{

return (stdole.IPictureDisp)

AxHost.GetIPictureDispFromPicture(image);

}

}

E, infine, non resta che compilare e lanciare l’applicazione:

CustomIcon05

In allegato trovate l'applicaizone in C# (chiedo perdono gli utenti di VB ([:'(]) ma nell'articolo ci saranno esempi con entrambi i linguaggi Big Smile)

Che ne dite?

Buon divertimento a tutti!

 

Ciao

Laura

Comments

Blog di Laura Ciccarese said:

Oggi vorrei completare il post .NET Ribboncon il codice necessarioper assegnare ad un comando del Ribbonimmagini

# January 25, 2007 3:00 PM