2008-11-13 9 views
11

Hinweis: Die Frage Using 256 x 256 Vista icon in application befasst sich mit der Verwendung eines "Vista" -Symbols als Anwendungssymbol. Diese Frage bezieht sich auf das manuelle Zeichnen eines Vista-Symbols.Windows Forms .NET 2.0: Wie zeichne ein PNG-Symbol?

Hinweis: Frage WinForms .NET 2.0: How to paint the proper sized icon? beschäftigt sich mit dem Bemalen eines Vista-Symbols aus einer Datei geladen. Diese Frage bezieht sich auf das Zeichnen eines Vista-Symbols, das von einer Resource geladen wird.


Ich habe ein Symbol in meinem Visual Studio-Projekt enthalten, die verschiedene Formate hat:

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

Jetzt möchten Sie die 256x256 Version zeichnen. Keines der folgenden Dinge habe ich ausprobiert.

Nachfolgend zieht das 32x32-Format zu 256x256 gereckt:

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

Nachfolgend zieht das 32x32-Format ungestreckten:

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

Nachfolgend zieht das 32x32-Format zu 256x256 gestreckt :

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

Nachfolgend zieht das 48x48-Format 256x256 gestreckt:

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

Wie kann ich das 256x256-Format Symbol ziehen?


Hinweise:

  1. Das Symbol kommt nicht aus einer Datei, so PInvoking Loadimage() wird nicht helfen.

  2. Das Symbol ist nicht das Symbol mit einer Datei verbunden, so PInvoking SHGetFileInfo() will nicht helfen. Noch wird using Icon.ExtractAssociatedIcon.

  3. Ich versuche auch nicht Symbole mit einem 256x256-Format zur Laufzeit zu erstellen, so libraries designed to do that wird nicht helfen.

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

+0

wieder eröffnet - das ‚Duplikat 'Thread hat keine akzeptierte/richtige Antwort auf diese spezielle Frage –

+0

Es ist eine andere Frage. Das betrifft die Verwendung eines Vista-Symbols als das Anwendungssymbol. Dies betrifft das Zeichnen eines Vista-Symbols in einer Grafik. –

+0

Kannst du pastebin (slexy.org) ein Beispiel 256^2 PNG Symbol ResX - Datei, so dass ich hacken kann (oder mir sagen, wie man leicht zu machen) – TheSoftwareJedi

Antwort

0

fragte ich eine ähnliche Frage vor einer Weile, aber mit nicht viel Glück. Einige der Antworten in meinem Beitrag können Ihnen helfen, es gab einen Weg, aber es sieht ziemlich hart aus.Link zu meinem Beitrag here

+0

Antworten dort werden verwendet, um das zugehörige Symbol für eine Datei zu extrahieren; Das würde Ihnen nur ein Vista-Symbol geben, wenn Sie auf der Aussicht waren. Es erfordert auch, dass Sie das Symbol aus einer Datei erhalten. Dies ist ein Icon, das ich geschrieben habe. –

3

Die ResourceManager lädt das Symbol basierend auf den Bits in den Ressourcen gespeichert. Die Handhabung des Ladevorgangs lässt jedoch keinen Zugriff auf das 256x256-Symbol zu (diese Informationen werden nicht in die System.Drawing.Icon-Datei übernommen, die Sie zurück erhalten).

Es tut mir leid, Sie zu enttäuschen, aber der einzige Weg, der mir bekannt ist, ist das Symbol über eine P/Invoke von LoadImage laden und mit einer Datei arbeiten (ja, ich weiß, das war nicht das, was Sie waren Auf der Suche nach). Die neue Frage sollte also lauten: Wie extrahiere ich die Bits einer bestimmten Ressource, damit ich sie in einer Datei speichern kann? Ich befürchte, dass dies auch nicht möglich ist, nachdem ich einige Schritte durch System.Resources.ResourceReader durchgeführt habe, da die Ressourcendaten eine Sammlung serialisierter .NET-Objekte zu sein scheinen.

Wie auch immer, für diejenigen, die das Symbol aus einer ICO-Datei (und für sie als zukünftige Referenz auf wie 256x256 Icons laden) zu laden leisten können, rufen 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); 
} 

Sobald Sie die System.Drawing.Icon in der erwarteten Größe, nur malen Sie es mit graphics.DrawIconUnstretched.

0

Heute habe ich eine sehr nette Funktion für Entpacken der 256x256 Bitmaps von Vista Icons gemacht.

Ich verwende es, um das große Symbol als Bitmap in "Über" anzeigen.

Diese Funktion übernimmt das Icon-Objekt als Parameter. So können Sie es mit beliebigen Symbolen verwenden - von Ressourcen, von Dateien, von Streams und so weiter. Es läuft auf jedes Betriebssystem, weil es tut nicht jeden Win32-API verwendet, ist es 100% Managed Code ist :-)

Bitmap ExtractVistaIcon(Icon icoIcon) 

ich hier meine Funktion geschrieben: ExtractVistaIcon()

Verwandte Themen