January 2007 - Posts
Se siete interessati ad alcune novità sulla formattazione condizionale di Excel 2007, guardate l'approfondimento alla pagina: Formattazione condizionale in Excel 2007 e VBA in Excel 2003
E se avete richieste in merito, fatemelo sapere 
Ciao a tutti
Laura
Oggi vorrei completare il post .NET Ribbon con il codice necessario per assegnare ad un comando del Ribbon immagini di vario formato: ico, jpg, bmp, gif, ecc.
Scaricate (se non l'avete già fatto
) l'applicazione allegata al post Assegnare immagini personalizzate ad un comando del Ribbon e, seguendo le istruzioni del post, predisponete tre comandi sul tab personalizzato, e tre file di risorsa per le rispettive immagini (io ho utilizzato un file .ico, un file .gif e un file .bmp)
1. Modificare il file Ribbon1.xlm
Il file Ribbon1.xml dovrebbe avere la seguente struttura:
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" onLoad="OnLoad">
<ribbon>
<tabs>
<tab id="SchedaPersonalizzata"
label ="Laura">
<group id="Immagini"
label="Immagini aziendali"
<toggleButton id="InserisciLogo01"
size="large"
label="Inserisci Logo Ufficiale"
screentip="Inserisce il logo ufficiale in corrispondenza del cursore"
onAction="OnToggleButton"
getImage ="GetMyImage" />
<toggleButton id="InserisciLogo02"
size="large"
label="Inserisci Logo per web"
screentip="Inserisce il logo web in corrispondenza del cursore"
onAction="OnToggleButton"
getImage ="GetMyImage" />
<toggleButton id="InserisciLogo03"
size="large"
label="Inserisci Logo interno"
screentip="Inserisce il logo per la documentazione interna in corrispondenza del cursore"
onAction="OnToggleButton"
getImage ="GetMyImage" />
</group>
</tab>
</tabs>
</ribbon>
</customUI>
2. Modificare la funzione GetMyImage
Modificate la funzione GetMyImage in modo da passare l'immagine corrispondente ad ogni controllo del Ribbon:
public stdole.IPictureDisp GetMyImage(Office.IRibbonControl control)
{
stdole.IPictureDisp pictureDisp = null;
switch (control.Id)
{
case "InserisciLogo01":
pictureDisp =
ImageConverter.Convert(GetResourceBitmap("sqltut.ico"));
break;
case "InserisciLogo02":
pictureDisp =
ImageConverter.Convert(GetResourceBitmap("Logo.bmp"));
break;
case "InserisciLogo03":
pictureDisp =
ImageConverter.Convert(GetResourceBitmap("Diavoletto.gif"));
break;
}
return pictureDisp;
}
3. Modificare la funzione GetResourceBitmap
Modificate la funzione che restituisce l'immagine in modo che gestisca la tipologia di immagini.ico separatamente dalle altre:
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();
switch (extension)
{
case ".ico":
image = new System.Drawing.Icon(stream).ToBitmap();
break;
default:
image = new System.Drawing.Bitmap(stream);
image.MakeTransparent();
break;
}
stream.Close();
break;
}
}
return image;
}
4. Provare per credere
Lanciate l'applicazione e il risultato, con le mie immagini, è il seguente:
Trovate l'applicazione completa in allegato
Chiedo ancora perdono agli utenti di Visual Basic che rimando all'articolo in uscita alla fine del mese (
).
Ciao a tutti
Laura
Avete installato Office 2003 e dovete aprire dei files salvati con la nuova versione?
Niente di più semplice: scaricate il Pacchetto di compatibilità per Office 2007 e siete a posto!
Fate click qui per il download oppure fate doppio click sul file salvato con la nuova versione: sarà Office a comunicarvi che il file è in versione 2007 e vi porterà al sito per il download.
Ciao a tutti
Laura
Questa mattina, ancora in preda all'entusiasmo per la .NET Pizza, ho giocato un pò con il Ribbon e questo è il risultato:

Ma è inutile che premiate il bottone: per avere un pezzo di .NET Torta dovrete venire alla prossima .NET Pizza con noi!!!!
PS La torta della foto l'ho fatta io!
Ciao
Laura
Un evento veramente "istruttivo": tra sigle di ogni genere, antipasti, pizze e dolci (offerti da Michele
, non dimentichiamolo), ho avuto modo di conoscere delle persone simpatiche e divertenti, al di fuori degli schemi.
Un grazie a Michele per l'organizzazione, a Tiziana che mi ha "trascinata" nella community, e a tutti gli altri che mi hanno fatto sentire parte di essa.
Ciao e....a presto 
Laura
Vi piacerebbe avere la vostra scheda personalizzata in prima posizione nel Ribbon (lo so, non pensate ad altro, non mangiate, non ci dormite la notte....
)
Ma adesso, la soluzione al vostro problema c'è: inserite l'attributo insertBeforeMso ="TabHome" al tag Tab nel file Ribbon.xml:
<tab id="SchedaPersonalizzata" label="Scheda Personalizzata" insertBeforeMso ="TabHome">
et voilà! (En français, s’il vous plait!)
La vostra "Scheda Personalizzata" si trova al primo posto!!!!

Alla prossima
Ciao a tutti
Laura
Vi segnalo un interessante editor per file xml all'indirizzo:
http://www.microsoft.com/downloads/details.aspx?FamilyID=72D6AA49-787D-4118-BA5F-4F30FE913628&displaylang=en
Se preferite visualizzare la struttura del file sottoforma di albero cui aggiungere o eliminare voci, rinominare, ecc; può essere utile.
Dopo averlo installato, è possibile fare click destro su un file xml e utilizzare il nuovo editor:
Questo è quello che vi si presenta:
E' possibile aggiungere elementi e assegnarne i valori; visualizzare il risultato in modalità standard (XLS output), ecc.
Ad esempio, io ho aggiunto gli elementi e i valori relativi ad un nuovo comando per il ribbon:
e, dopo aver salvato, aprendo Excel, il ribbon risulta così modificato:
Un'altra funzionalità che può essere interessante (e che gli utenti di Word conoscono bene) è la possibilità di confrontare due file xml per visualizzarne le differenze, evidenziate con colori diversi descritti in una legneda:
Ciao a tutti
Laura
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
Supponiamo che siate degli accaniti utilizzatori di icone: create comandi personalizzati a "go-go" e, di conseguenza, volete assegnare delle icone adeguate.
Che fate?
Avete due possibilità:
- utilizzate l'elenco dei controlli che vi ho indicato nel post Elenco dei controlli del ribbon, cercate l'IdMso corrispondente al comando di Office la cui icona vi sembra adeguata, lo utilizzate incrociando le dita!!! (e si, perchè come già si è capito, non tutti i comandi dispongono di un'icona, anche se dispongono di un controlID!!!!
- al 2° o 3° tentativo, volete prendere Office e buttarlo nel cestino (di Windows, si intende!), oppure volete linciare me che vi ho indicato questa strada (e questo già è peggio, almeno per me). Allora utilizzate il metodo descritto nel post Ribbon: creare comandi personalizzati utilizzando icone di comandi esistenti consistente nella visualizzazione del comando nella finestra Personalizza e della lettura del relativo nome. E' vero, dovete appuntarvi il nome del controllo ma almeno siete sicuri che l'icona ci sia!!!!
Diciamo, però, che nonostante questi due sistemi possano essere accettabili, sarebbe molto meglio poter visualizzare le icone disponibili in un'unica finestra, e magari non solo le icone dei comandi di Excel, ma tutte quelle di office, a prescindere dal comando cui sono associate perchè, dopotutto, a voi importa poco del comando, A VOI SERVE SOLO L'ICONA!!!!
E qui interviene la Icon Gallery che, non per niente, è il titolo di questo post!
Scaricate l'AddIn dal sito di MSDN
http://www.microsoft.com/downloads/details.aspx?familyid=12b99325-93e8-4ed4-8385-74d0f7661318&displaylang=en
e installatelo: durante la procedura vi si chiederà una posizione per il file che contiene le galleries: indicategliene una comoda.
Successivamente, aprite il file Office2007IconsGallery.xlsm che è stato inserito nella suddetta cartella, e apritelo:come per incanto, nella scheda Sviluppo vedrete apparire ben 9 Galleries contenenti decine e decine di icone!!!!!
(Se la scheda Sviluppo non è visualizzata (e non lo è per default!!), spuntate il flag sulla voce "Mostra barra sviluppo sulla scheda multifunzione" nella finestra Office > Opzioni > Impostazioni Generali).
GUARDATE E STUPITE!!!!!
Aprite una gallery
Fate click su quella che vi piace e vi apparirà una finestra con l'idMso: prendetene nota e utilizzatelo.
Ma qualche utente esigente potrebbe dire: "perchè devo prenderne nota, non potremmo, invece, fare in modo che l'idMso venga salvato negli appunti, così da poterlo utilizzare dove mi pare?"
Possiamo dargli torto?
Sicuramente no!!
Allora ho provveduto ad apportare una piccola modifica al codice del progetto VBA del file excel e, per la precisione, nel modulo RibbonX, che riporta le seguenti righe:
Originale
Sub OnAction(control As IRibbonControl, id As String, index As Integer)
If (control.Tag = "large") Then
id = Strings.Mid(id, 3)
End If
Dim form As New ControlInfoForm
form.nameX.Caption = "imageMso: " & id
Set form.Image1.Picture = Application.CommandBars.GetImageMso(id, 16, 16)
Set form.Image2.Picture = Application.CommandBars.GetImageMso(id, 32, 32) form.Show
End Sub
Aggiungendo le righe in rosso:
Modificato
Sub OnAction(control As IRibbonControl, id As String, index As Integer)
If (control.Tag = "large") Then
id = Strings.Mid(id, 3)
End If
Dim form As New ControlInfoForm
form.nameX.Caption = "imageMso: " & id
Set form.Image1.Picture = Application.CommandBars.GetImageMso(id, 16, 16)
Set form.Image2.Picture = Application.CommandBars.GetImageMso(id, 32, 32)
'codice per memorizzare l'id negli appunti di Office
Dim doId As DataObject
Set doId = New DataObject
doId.SetText id
doId.PutInClipboard
form.Show
End Sub
Se adesso provate a scegliere un'icona e, successivamente, aprite un nuovo file di excel o di word o di quello che volete voi, e incollate: ecco apparire l'agognato IdMso:
Direi che per ora può andare, no???
(Lo so, mi diverto con poco!
)
Alla prossima
Ciao
Laura
Da qualche giorno ho installato la versione di prova di Office 2007 Italiano, disponibile nel post Download Microsoft Office 2007 Enterprise 2007 trial in versione italiana di Emanuele Mattei, oppure la versione definitva disponibile per gli MSDN Subscribers sul sito: http://msdn2.microsoft.com/en-us/subscriptions/default.aspx.
Per quanto riguarda l'interfaccia, ho notato qualche piccola modifica apportata alla Barra di accesso rapido (Quick Access Toolbar), che adesso riporta:
- un set di comandi "a portata di flag" (quelli di utilizzo più comune): Nuovo, Apri, Stampa Immediata, Anteprima di stampa, ecc.;
- la voce Altri comandi, che permette di accedere alla solita finestra di personalizzazione;
- il comando per ridurre ad icona il Ribbon (in italiano, Barra Multifunzione), cosa che, comunque, si può continuare a fare con doppio click su un qualsiasi menù (che adesso si chiamano Schede).

Inoltre, sono state apportate alcune modfiche ai menù (che in italiano si chiamano Schede). Ad esempio, il gruppo Forme (Shapes), del menù Inserisci di Excel, è stato eliminato e la voce Forme è stata integrata nel gruppo Illustrazioni (illustrations):

Quindi, se non trovate qualcosa, guardatevi in giro e scoprite le differenze!!
Per quanto riguarda la personalizzazione del Ribbon, ricordate l'icona PasteValues che ho utilizzato nel mio precedente post?
Ebbene, ho lanciato l'AddIn che la impostava e, nella versione italiana di Excel, l'icona non c'era più!!!!! Naturalmente ho pensato che fosse cambiato l'IdMso dell'immagine, ma, no, per fortuna (
), semplicemente è stata eliminata l'icona dal comando!!!!
Guardare per credere:
Verione inglese

Versione italiano
Peccato, era un'icona tanto carina!!!!!! 
Ciao a tutti
Laura