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
2. Attivare il tab Resources
3. Fare click su Add resources
4. Fare click su Add from existing file






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:
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:

In allegato trovate l'applicaizone in C# (chiedo perdono gli utenti di VB ([:'(]) ma nell'articolo ci saranno esempi con entrambi i linguaggi
)
Che ne dite?
Buon divertimento a tutti!
Ciao
Laura