
Certain d'entre-vous ont surement tenté de créer des AddIns pour Visual Studio ou encore pour Office. Une des premières choses qu'on fait quand on créé un AddIn, c'est bien d'ajouter ses barres d'outils et ses menus. Pour ce faire, l'exemple donné par le projet minimal d'AddIn de Visual Studio fonctionne parfaitement :
Command command = commands.AddNamedCommand2(
_addInInstance,
"MyAddin1", "MyAddin1", "Executes the command for MyAddin1", true, 59, ref contextGUIDS,(int)vsCommandStatus.vsCommandStatusSupported+(int)vsCommandStatus.vsCommandStatusEnabled,
(int)vsCommandStyle.vsCommandStylePictAndText, vsCommandControlType.vsCommandControlTypeButton);
En s'appuyant sur la documentation, on apprend que le "59" est le paramètres Bitmap. On aurait pu s'attendre à devoir passer un objet de type Bitmap, mais non, il s'agit là d'un entier identifiant l'image (Sur cette méthode le paramètres est typé en object, sur d'autres il est typé en int, en tout les cas, pour utiliser un FaceId il faut passer un entier). Mais alors comment savoir quelle icône va apparaitre en fonction de quel numéro ? Hé bien Microsoft n'a rien communiqué sur le sujet, du moins à ma connaissance (et j'ai cherché longtemps).
J'ai bien trouvé un site qui en liste un grand nombre, mais il extrait les images à la mains. Son astuce consiste à créer des barres d'outils avec une centaine d'icônes dessus, puis de faire un imprime écran et de les découper une à une...
J'ai bien essayé de le contacté pour lui donner ma solution, mais sans succès.
Voilà donc ma méthode. Bien que pas très propre et largement améliorable, elle permet d'extraire en quelques minutes la quasi totalité si ce n'est la totalité des icônes. Je ne suis pas certain de les avoir toutes dans le sens où j'ai stoppé l'extraction après l'icône numéro 13 000 (et quelques) voyant que je n'obtenait plus que des icônes vides depuis la 10 025. J'ai utilisé FreeImage pour la simple et bonne raison que je n'ai obtenu que des images pourries avec les méthodes présentes de base dans le DotNet (fond noir ou magenta, perte de couleurs, ou image baveuse).
bool running = true;
int faceid = 0;
string basefolder = Environment.GetFolderPath(Environment.SpecialFolder.MyPictures) + "\\VS_FACE_ID";
if(System.IO.Directory.Exists(basefolder) == false)
System.IO.Directory.CreateDirectory(basefolder);
while (running)
{Command command = null;
CommandBarButton control = null;
try { //Ajoute une commande à la collection Commands :command = _commands.AddNamedCommand2(
_addInInstance, "VSEN2", "VSEN2", "Executes the command for VSEN2",
true, faceid, ref contextGUIDS,
(int)vsCommandStatus.vsCommandStatusSupported + (int)vsCommandStatus.vsCommandStatusEnabled,
(int)vsCommandStyle.vsCommandStylePictAndText, vsCommandControlType.vsCommandControlTypeButton);
//Ajoute un contrôle pour la commande au menu tools :if ((command != null) && (toolsPopup != null))
control = command.AddControl(toolsPopup.CommandBar, 1) as CommandBarButton;
try { // Obtient l'imagestdole.Picture pict = control.Picture;
IntPtr handle = new IntPtr(pict.Handle);
bool generated = false;
try {FreeImageAPI.FreeImageBitmap bmp = FreeImageAPI.FreeImageBitmap.FromHbitmap(handle);
bmp.Save(basefolder + "\\" + faceid + ".png", FreeImageAPI.FREE_IMAGE_FORMAT.FIF_PNG);
bmp.Dispose();
bmp = null;
generated = true;
}catch { }
}catch(Exception ex)
{if(MessageBox.Show("Erreur : " + Environment.NewLine + ex.Message + Environment.NewLine + "Voulez-vous continuer ?", "Erreur", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No)
running = false;
} // Supprime le controlecontrol.Delete(false);
// Supprime la commandecommand.Delete();
// Incrémente le numéro de l'image faceid++; }catch (Exception ex)
{MessageBox.Show("Erreur :" + Environment.NewLine + ex.Message);
running = false;
} finally {if (control != null)
{try { control.Delete(false); }
catch { }
}if (command != null)
{try { command.Delete(); }
catch { }
} }}Vous pouvez télécharger le pack complet ici : vs_face_id.tar.bz2
Et consulter les icônes directement en ligne via ces liens :
Commentaires
Poster un nouveau commentaire