2008-11-13 8 views
11

Remarque: La question Using 256 x 256 Vista icon in application traite de l'utilisation d'une icône «Vista» en tant qu'icône de l'application. Cette question concerne la peinture manuelle d'une icône Vista.Windows Forms .NET 2.0: Comment dessiner une icône PNG?

Remarque: La question WinForms .NET 2.0: How to paint the proper sized icon? traite de la peinture d'une icône Vista chargée à partir d'un fichier. Cette question concerne la peinture d'une icône Vista chargée depuis un .resource.


J'ai inclus une icône dans mon projet Visual Studio qui a différents formats:

  • 16x16
  • 32x32
  • 48x48
  • 256x256 (compressé PNG)

Maintenant, vous voulez dessiner la version 256x256. Aucune des choses suivantes que j'ai essayé de travailler.

Le suivant dessine le format de 32x32 étiré 256x256:

Icon ico = Properties.Resources.TestIconThatHasA256PNGFormat; 
e.Graphics.DrawIcon(ico, new Rectangle(0, 0, 256, 256)); 

Ce qui suit tire le format 32x32 non étiré:

Icon ico = Properties.Resources.TestIconThatHasA256PNGFormat; 
e.Graphics.DrawIconUnstretched(ico, new Rectangle(0, 0, 256, 256)); 

Ce qui suit tire le format de 32x32 étiré 256x256 :

Icon ico = Properties.Resources.TestIconThatHasA256PNGFormat; 
e.Graphics.DrawImage(ico.ToBitmap(), new Rectangle(0, 0, 256, 256)); 

Le suivant dessine le format 48x48 étiré 256x256:

Icon ico = Properties.Resources.TestIconThatHasA256PNGFormat; 
e.Graphics.DrawIcon(
     new Icon(ico, new Size(256, 256)), 
     new Rectangle(0, 0, 256, 256)); 

Comment puis-je dessiner l'icône de format 256x256?


Notes:

  1. L'icône ne vient pas d'un fichier, si PInvoking LoadImage() ne va pas aider. L'icône n'est pas l'icône associée à un fichier, alors PInvoking SHGetFileInfo() will ne vous aide pas. Pas plus using Icon.ExtractAssociatedIcon. Je n'essaie pas non plus d'écrire des icônes avec un format de 256x256 à l'exécution, donc libraries designed to do that ne va pas aider.

    2: Question WinForms .NET 2.0: How to paint the proper sized icon?

+0

rouverte - le « double 'thread n'a pas de réponse acceptée/correcte à cette question spécifique –

+0

C'est une question différente. Cela concerne l'utilisation d'une icône Vista comme icône de l'application. Cela concerne le dessin d'une icône Vista dans un graphique. –

+0

Pouvez-vous pastebin (slexy.org fonctionne) un exemple 256^2 PNG icône resx fichier afin que je puisse pirater à cela (ou dites-moi comment en faire un facilement) – TheSoftwareJedi

Répondre

0

J'ai posé une question similaire il y a un certain temps, mais avec pas beaucoup de chance. Certaines des réponses dans mon post peuvent vous aider, il y avait un moyen, mais il semble assez difficile.Lien vers mon message here

+0

Les réponses sont utilisées pour extraire l'icône associée à un fichier; ce qui ne vous donnerait une icône Vista si vous étiez sur Vista. Cela nécessite également que vous récupériez l'icône d'un fichier. C'est une icône que j'ai créée. –

3

Le ResourceManager charge l'icône en fonction des bits stockés dans les ressources. Cependant, la façon dont il gère le chargement ne vous permettra pas d'accéder à l'icône 256x256 (cette information ne se retrouve pas dans le System.Drawing.Icon que vous récupérez).

Je suis désolé de vous décevoir, mais le seul moyen qui fonctionne que je sache est de charger l'icône via un P/Invoke de LoadImage et de travailler avec un fichier (oui, je sais, ce n'est pas ce que vous étiez à la recherche de). La nouvelle question devrait donc être: comment puis-je extraire les bits d'une ressource donnée pour pouvoir les stocker dans un fichier? Je crains que cela ne soit pas possible non plus, ayant fait quelques pas à travers System.Resources.ResourceReader, car les données de ressource semblent être une collection d'objets .NET sérialisés.

Quoi qu'il en soit, pour ceux qui peuvent se permettre de charger l'icône d'un fichier .ICO (et pour moi-même, comme une référence future sur la façon de charger 256x256 icônes), appelez IconConverter.LoadIcon:

using System.Runtime.InteropServices; 

static class IconConverter 
{ 
    public static System.Drawing.Icon LoadIcon(string path, int width, int height) 
    { 
     System.IntPtr hIcon; 
     hIcon = LoadImage (System.IntPtr.Zero, path, IMAGE_ICON, width, height, 
          LR_LOADFROMFILE); 
     if (hIcon == System.IntPtr.Zero) 
     { 
      return null; 
     } 
     return System.Drawing.Icon.FromHandle (hIcon); 
    } 

    const int IMAGE_ICON = 1; 
    const int LR_LOADFROMFILE = 0x0010; 

    [DllImport ("user32.dll", SetLastError=true, CharSet=CharSet.Auto)] 
    static extern System.IntPtr LoadImage(System.IntPtr hInstance, 
              string lpszName, uint uType, 
              int cxDesired, int cyDesired, 
              uint fuLoad); 
} 

Une fois que vous avez le System.Drawing.Icon dans la taille attendue, il suffit de peindre en utilisant graphics.DrawIconUnstretched.

0

Aujourd'hui, j'ai fait une très belle fonction pour en extrayant les Bitmaps 256x256 des icônes Vista.

Je l'utilise pour afficher la grande icône en tant que bitmap dans la boîte "About".

Cette fonction prend l'objet Icon comme paramètre. Ainsi, vous pouvez l'utiliser avec toutes les icônes - à partir des ressources, à partir de fichiers, de flux, etc. Il fonctionne sur tout système d'exploitation , car il ne pas utiliser une API Win32, il est le code managé 100% :-)

Bitmap ExtractVistaIcon(Icon icoIcon) 

Je posté ma fonction ici: ExtractVistaIcon()

Questions connexes