Willkommen bei dotnet-snippets.de! Snippet hinzufügen Login Registrieren
Snippets in der Datenbank: 1563 | Anzahl registrierter User: 1895 | Besucher online: 295
Hauptmenü
Home
Top Ten
Zufälliger Snippet
FAQs
.NET Community
dotnet-forum.de
dotnet-kicks.de
Social

RSS Feeds
Rss Alle Snippets
Rss C#
Rss VB.NET
Rss C++
Rss ASP.NET
Partner
Member of Microsoft Community Leader/Insider Program (CLIP)

SystemIconsImageListWrapper


Autor: bestel
Sprache: C#
Bewertung: 7,4
(1 Bewertung)
Anzahl der Aufrufe: 3897
  
Kick it on dotnet-kicks.de  

Beschreibung:

Diese Klasse ist ein Wrapper für eine ImageList, mit der es möglich ist, Icons für beliebig auf dem System registrierte Dateierweiterungen abzurufen.

Die Klasse cached intern jedes Icon, sodass pro Extension nur einmal das Icon geladen werden muss.

Anwendungsbeispiel:
In einer Form wird der Wrapper als Klaassenvariable instanziiert:
this.SIILW = new SystemIconsImageListWrapper(this.imageList1, 2);


imageList1 ist dabei eine schon vorhandene ImageList, die an Index 2 ein Icon enthält, dass als Default Icon fungiert, sofern für eine Extension kein Icon gefunden wird.

Hier wird dann z. B. einer TreeNode ein Icon anhand einer File Extension zugewiesen:
TreeNode TNToAdd = new TreeNode("Doc Datei");
TNToAdd.ImageIndex = this.SIILW.GetSIImageListIndexForFileExtension(".doc");
this.treeView1.Nodes.Add(TNToAdd);

(Der zur TreeNode zugehörigen TreeView ist die vorhandene und im Wrapper referenziert imageList1 zugeordnet.)
Der int GetSIImageListIndexForFileExtension(string Extension) lad das Icon in die referenzierte ImageList, sofern nicht vorhanden, und gibt den Index zurück.


Abgelegt unter: system, icon, file, extension, image, list, imagelist, wraper, c#, csharp.



C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
using System;
using System.Collections.Generic;
using Microsoft.Win32;
using System.Windows.Forms;
using System.Drawing;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Drawing.Drawing2D;

public sealed class SystemIconsImageListWrapper : Object
    {
        public SystemIconsImageListWrapper()
        {
            this.SIImageList = new ImageList();
            this.ExtensionSIImageListIndexZuordnung = new Dictionary<string, int>();
        }

        public SystemIconsImageListWrapper(ImageList IL, int DefaultIconIndex)
        {
            this.SIImageList = IL;
            this.ExtensionSIImageListIndexZuordnung = new Dictionary<string, int>();
            this.DefaultIconIndex = DefaultIconIndex;
        }

        public ImageList SIImageList { get; set; }
        private Dictionary<string, int> ExtensionSIImageListIndexZuordnung;
        private int DefaultIconIndex = 0;

        public int GetSIImageListIndexForFileExtension(string Extension)
        {
            try
            {
                int RValue = 0;

                if (!Extension.StartsWith("."))
                    Extension = "." + Extension;

                if (this.ExtensionSIImageListIndexZuordnung.ContainsKey(Extension))
                    this.ExtensionSIImageListIndexZuordnung.TryGetValue(Extension, out RValue);
                else //noch nicht vorhanden -> laden
                {
                    this.SIImageList.Images.Add(this.GetIconForFileExtension(Extension));

                    this.ExtensionSIImageListIndexZuordnung.Add(Extension, this.SIImageList.Images.Count - 1);

                    this.ExtensionSIImageListIndexZuordnung.TryGetValue(Extension, out RValue);
                }

                return RValue;
            }
            catch (Exception ex) //Bei Fehler einfach DefaultIconIndex zurückgeben
            {
                ex.ToString(); //Suppress Visual Studio unused variable warning
                return this.DefaultIconIndex;
            }
        }

        private Icon GetIconForFileExtension(string Extension)
        {
            if (!Extension.StartsWith("."))
                Extension = "." + Extension;

            KeyValuePair<string, int> QryRS = this.GetIconPathForExtension(Extension);

            if (!string.IsNullOrEmpty(QryRS.Key))
                return this.GetIconFromDLL(QryRS.Key, QryRS.Value);
            else //Icon nicht gefunden oder Fehler -> Default Icon verwenden
                return this.ImageToIcon(this.SIImageList.Images[this.DefaultIconIndex]);
        }

        private KeyValuePair<string, int> GetIconPathForExtension(string Extension)
        {
            if (!Extension.StartsWith("."))
                Extension = "." + Extension;

            KeyValuePair<string, int> RValue = new KeyValuePair<string, int>(string.Empty, 0);

            try
            {
                RegistryKey ClassRootKey = Registry.ClassesRoot;
                string FileExtSubKeyName = ClassRootKey.OpenSubKey(Extension).GetValue("").ToString(); //Default Value

                string IconPathRaw = ClassRootKey.OpenSubKey(FileExtSubKeyName).OpenSubKey("DefaultIcon").GetValue("").ToString(); //Default Value

                RValue = new KeyValuePair<string, int>(IconPathRaw.Split(',')[0], int.Parse(IconPathRaw.Split(',')[1]));
            }
            catch (Exception ex)
            {
                ex.ToString(); //Suppress Visual Studio unused variable warning
            }

            return RValue;
        }

        private Icon GetIconFromDLL(string PathToDLL, int IconIndex)
        {
            IntPtr EigenesProzessHandle = Process.GetCurrentProcess().Handle;

            IntPtr DLLIconPointer = ExtractIcon(EigenesProzessHandle, PathToDLL, IconIndex);

            return Icon.FromHandle(DLLIconPointer);
        }

        [DllImport("shell32.dll")]
        private static extern IntPtr ExtractIcon(IntPtr hInst, string lpszExeFileName, int nIconIndex);

        private Icon ImageToIcon(Image img)
        {
            int size = 24;
            using (Bitmap square = new Bitmap(size, size))
            {
                Graphics g = Graphics.FromImage(square);
                int x;
                int y;
                int w;
                int h;
                float r = (float)img.Width / (float)img.Height;
                if (r > 1)
                {
                    w = size;
                    h = (int)((float)size / r);
                    x = 0;
                    y = (size - h) / 2;
                }
                else
                {
                    w = (int)((float)size * r);
                    h = size;
                    y = 0;
                    x = (size - w) / 2;
                }
                g.InterpolationMode = InterpolationMode.HighQualityBicubic;
                g.DrawImage(img, x, y, w, h);
                g.Flush();
                return Icon.FromHandle(square.GetHicon());
            }
        }
    }
Sie haben Fragen zu diesem Snippet oder brauchen Hilfe bei der .NET Entwicklung?
Freundliche und kompetente Entwickler helfen Ihnen gern weiter im Forum für .NET Entwicklung.



Kommentare:
(Zum Schreiben von Kommentaren bitte anmelden.)

10110010 schrieb am:  26.03.2012 11:55:31

Das ist eine elegante Lösung.
Ich bin auch diesen Weg gegangen, allerding hat diese Ausführung noch einen Haken!
Die Icons, die Versionsbedingt in der Registry angegeben sind, werden hier nicht gefunden.
Dazu gehören z.B. die PDF Icons.

Um auch diese zu erhallten, sollte vorher abgefragt werden ob der Schlüssen DefaultIcon enthalten ist. Ist dies nicht der fall, existiert eigentlich immer ein Schlüssen "CurVer" in der der Verweis auf den Korekten Schlüssel enthalten ist.
Zum anderen ist der Split auf das "," nicht optimal gewählt, da Verzeichnisse auch Kommas enthalten können und so eine Exception verursacht werden würde.
Hier ist es optimaler sich den Index des letzten Kommas geben zu lassen "IconPathRaw.LastIndexOf(",")".

Das hier ist wie gesagt ansonsten eine schöne Lösung.
Thomas Schoch schrieb am:  26.03.2012 14:51:55

Es kann auch sein, dass IconPathRaw kein "," enthält. In diesem Fall muss vermutlich 0 als Index für das Icon verwendet werden. Dies passiert z.B. auf einem Windows 7 Rechner für die Extension ".zip", falls kein WinZip oder so installiert ist.

Ansonsten klappt das wunderbar.


Diese Snippets könnten für Sie interessant sein:
[VB.NET] System aktualisieren
[C#] Runde Form mit Windows.Forms
[C#] Der * Operator mal anders...
[VB.NET] Bildschirmaktualisierungsrate ermitten
[VB.NET] Angemeldeter User
[VB.NET] Uptime eines Computers ermitteln
[VB.NET] Ermitteln des Ländercodes per WMI
[VB.NET] Ermitteln der Zeitzone per WMI
[VB.NET] Modelltyp des Rechners per WMI ermitteln
[VB.NET] Hersteller ermitteln per WMI
[ASP.net] Favorite Icon
[C#] Form als Tray Icon ablegen (Notifyicon)
[C#] Programm im Tray verstecken
[VB.NET] Icon aus DLL laden
[C#] Workaround für den MDIChild-Icon Bug
[VB.NET] Abstände der Desktop Icons ermitteln
[VB.NET] Anzahl der Desktop Icons ermitteln
[C#] Bitmap in Icon konvertieren
[C#] Vorlage für Tray-/NotifyIcon-Anwendung
[C#] Öffnet den Windows Info Dialog.
[C#] ExtractAssociatedIcon
[VB.NET] Prüfen ob Datei gerade benutzt wird
[C#] Abfragen ob eine Datei existiert
[VB.NET] Sich selbst löschende Anwendung
[C#] Datei umbenennen
[C#] File Owner / File Besitzer
[VB.NET] File Owner / File Besitzer
[C#] Generisches, komprimiertes, deserialisieren von Objekten
[VB.NET] Klasse für Dateisuche
[C#] LogWriter klasse
[C#] Datei-Eigenschaften zeigen (Eigenschaften-Fenster)
[C#] Prüfen, ob eine Datei ausfürbar ist (.exe, .bat, etc.)
[C#] eindeutigen Dateinamen ermitteln
[C#] Loads an embedded resource file of the calling assembly.
[ASP.net] Message in Logfile schreiben
[C#] Dateien und Ordner rekursiv löschen
[C#] Herausfinden welches Programm ein bestimmtes Dokument öffnet
[VB.NET] Gibt das Bytearray einer Datei zurück
[VB.NET] Erstellt aus einem Bytearray eine Temporäre Datei
[VB.NET] Klasse für SimpleFileVerification (SFV)
[C#] Laden und speichern von komprimierten Binärdaten
[C#] Datei im Windows-Explorer anzeigen und markieren
[C#] Dateilisten kopieren
[C#] File Container
[C#] PDF Dateien erstellen
[VB.NET] File List
[C#] Temporäre Datei mit using einfach nutzen/verwalten
[C#] Texteditor als for-Schleife verpackt
[C#] Alle Dateien und Verzeichnisse in einem Ordner löschen
[C#] Datei/Ordner durch Erweiterungsmethoden abfragen
[C#] Programmpfad mittels Erweiterung ermitteln
[C#] Invoke Beispiel mittels Erweiterungs Methoden.
[C#] DateTime Extensions liefern TimeStamp
[C#] Komplette Exception Message (inkl. InnerExceptions) ausgeben
[VB.NET] Programmpfad mittels Erweiterung ermitteln in VB
[C#] LINQ-Erweiterung für eindeutige Liste
[C#] Type Color serialisieren und deserialisieren
[C#] Controls gleichen Typs von einem Container in Winform holen
[C#] Extension in einem Dateinamen/Pfad ändern
[C#] Threadsicherer Codeaufruf im Control-Kontext (Invoking)
[C#] Selektieren eines gekapselten Eintrags aus der ComboBox
[C#] Color Extension-Methods
[C#] IsNull and IsNullOrEmpty Extension-Methods become Lazy
[C#] Enum-Extension - Flag in einem Bitfeld gesetzt?
[C#] Anzahl der Monate zwischen 2 DateTime-Objekten (Extension)
[C#] "for" mal anders
[C#] Generische Event Args -> EventArgs
[C#] Lazy Serialization-Extensions including Compression
[C#] Wie ToString() welche mit null-Strings umgehen kann
[VB.NET] Invert Colors from Image
[VB.NET] Resize image to fit in picturebox
[C#] Bild beim Zeichnen invertieren
[C#] Square Thumbnail generieren
[ASP.net] Datei nach Bildupload prüfen
[C#] Change PixelFormat
[VB.NET] Durschnittsfarbe eines Bildes ermitteln
[C#] Image in IPictureDisp umwandeln
[C#] Bild drehen (nach Winkelangabe)
[C#] Image zu Base64 konvertieren und zurück
[C#] Image in string wandeln und zurück
[C#] Bildgröße im Verhältnis verändern (Interpoliert)
[C#] Bild von einem Control oder Panel
[VB.NET] Bildausschnitt auslesen
[VB.NET] Bildgröße im Verhältnis verändern (Interpoliert)
[VB.NET] Bildgröße prozentual verändern (Interpoliert)
[VB.NET] Bildgröße in beiden Dimensionen verändern (Interpoliert)
[C#] base64 codierten String in eine Bitmap umwandeln
[C#] Bitmap in base64 codierten String wandeln
[C#] Image aus URL laden
[C#] Bilder verkleinern, beschneiden und beides gleichzeitig
[VB.NET] Bytearray to Image / Image to Bytearray
[C#] Bild splitten
[C#] Text2Bitmap (String in Bild umwandeln)
[C#] Hintergrundfarbe Transparenter Bilder (z.B. PNG) ändern
[C#] Größe eines Bildes mit mit gleichem Seitenverhältniss ändern
[C#] WPF: Image aus dem Web in Image-Element anzeigen
[C#] Bitmap schneller in Graustufen wandeln
[C#] ISO-Abbild von einer CD/DVD erstellen
[VB.NET] Let your image glow - Bild glühen lassen
[C#] old Windows Forms Image to new WPF Image
[C#] Duplikate aus einer IEnumerable entfernen
[VB.NET] Doppelte Arrayeinträge mit linearem Aufwand entfernen
[C#] Zufallszahlen, die sich nicht wiederholen
[VB.NET] Listen, Arrays, Strings konvertieren
[C#] SortableBindingList
[C#] Einträge in ListView verschieben
[VB.NET] List all controls by using the name of the controls
[C#] Liste mit int array zu Liste mit string array
[VB.NET] Berechnet den Durchschnittswert von grossen Zahlenlisten
[C#] Geschachtelte Methode zur String-Bearbeitung
[C#] Liste durchsuchen
[C#] WatchedList
[C#] C# Ordner auslesen und in Liste speichern "rekursiv"
[C#] SortingHelper - MoveUpInList & MoveDownInList
[VB.NET] ImageList dynamisch aus dem ResourceManager erstellen
[C#] Ein kleiner Konsolen Taschenrechner
[C#] Prüft Zeitformat auf 24 Stunden
[C#] GetCharts
[C#] XML in DataTable laden
[C#] Generische Between Methode
[ASP.net] Formularelement fokusieren auf Ajax Seiten
[C#] Quadratwurzel ziehen
[C#] Cast to Enum
[C#] ASP.NET: Metatags und Titel zur Laufzeit setzen
[C#] Aufrufenden Typ identifizieren
[C#] Kaufmännisches Runden in Decimal
[C#] WMI Getter
[C#] Sql Server Instanzen finden
[C#] Quoted Printable Encoder
[C#] URL auslesen
[C#] User-Verwaltung in eine ASP.NET Website einbauen
[C#] GUID des aktuellen Assembly ermitteln
[C#] Windows Forms Anwendungs-Sessions verwalten
[C#] User-Management für WPF Smart Client Anwendung
[C#] Silverlight Anwendung erstellen
[C#] User-Verwaltung in eine WinForm einbauen
[C#] Java WebService aus einem WinForms-Client aufrufen
[C#] C# Ist ein POINT zwischen ... und ...
[C#] NumTextBox (Kurzversion)
[C#] Another Bin-Watch (Console)
[C#] Datenbankverbindung herstellen
[C#] Einfache Ini Klasse
[C#] Youtube Download Klasse für C#
[C#] InputBox WPF C#
[C#] C# XOR Crypt
[C#] Velleman k8055 csharp dll import

schlecht sehr gut
1 2 3 4 5 6 7 8 9 10
Nur angemeldete User können Snippets bewerten.