Phantastische Icons ...

… und wo sie zu finden sind.

Während es heute ein Volkssport ist, dass jede noch so unnötige App ihre eigenen Grafiken designed um möglichst viel Individualität vorzuheucheln, gab es früher mal die Idee, dass Benutzer sich leicht zurecht finden sollen.

Grafische Elemente sollte das Betriebssystem “zeichnen” und das UI dadurch einheitlich gestalten.

Die Frage ist nur … wo findet man das heute noch?


Um Dateien zu erstellen, öffnen, speichern und kopieren zu können, haben sich Symbole etabliert, die jeder “im Augenblick” mit der richtigen Funktion assoziieren und darauf klicken kann.
Dass bis heute eine Disketten Bild als “Speichern” interpretiert wird, ist teilweise kurios, aber dennoch schlüssig.

Dumm ist nur, wenn heute Designer versuchen, solche Symbole selbst zu zeichnen und so werden lustige “Platten-Kreise” sogar zu “Bleistifte” in “Corporate-Colors” hingepixelt, und ich sitze dann vor einem UI und versuche mühsam zu erraten, was das Gebilde jetzt auslösen wird, wenn ich es anklicke.

Stock-Icons und -Bitmaps

Windows hatte von Anfang an (also zumindest ab Win95/NT4) Grafiken für “übliche” Symbole in seinen Innereien integriert und die großen X11-Toolkits unter Linux taten das gleiche.

Wer also Menüfunktionen für “Neu”, “Öffnen”, “Speichern”, “Drucken” integrieren wollte, konnte dafür eben diese “Standardsymbole” laden und seinen UI Elementen hinzufügen, anstatt auf nachgezeichnete Eigenfabrikate zu setzen.

Dadurch wird die “EXE” kleiner und das Programm erhält auch noch stets die neuesten Grafiken mit jedem neuen OS oder Toolkit Release.

WinAPI

Microsoft hat es aber leider auch hier wieder geschafft eine gute Idee möglichst schlecht umzusetzen.

Globale Bitmaps

Einige wenige Icons und Bitmaps kann man aus einem globalen Pool laden und dann als HICON und HBITMAP völlig frei benutzen. Man nutzt einfach den HINSTANCE Parameter mit NULL und dann eine Resource-ID aus den WinAPI Headern. Doch diese helfen einem wenig, weil es nur Pfeile oder Warnung- und Stoppsymbole sind.

1HBITMAP hbmp = LoadBitmap(NULL, OBM_LFARROW);
2HICON hicon = LoadIcon(NULL, IDI_ERROR);

Spezialfall Toolbar

Das Toolbar Control aus den Common-Controls hingegen arbeitet mit einer internen “ImageList” und diese kann man veranlassen, dass sie ein Set von Standard-Image lädt. Danach kann man mit vordefinierten Grafik-Indices übliche Symbole also Toolbar-Buttons anzeigen lassen.

1HIMAGELIST imglist = ImageList_Create(16, 16, ILC_COLOR16 | ILC_MASK, 0, 0);
2SendMessage(hwnd_toolbar, TB_SETIMAGELIST, (WPARAM)0, (LPARAM)imglist);
3SendMessage(hwnd_toolbar, TB_LOADIMAGES, (WPARAM)IDB_STD_SMALL_COLOR, (LPARAM)HINST_COMMCTRL);

Beim Hinzufügen von Toolbar-Buttons kann man dann Index-Konstanten wie IDM_NEW, IDM_OPEN, IDM_SAVE nutzen, um Icons für “Neu”, “Öffnen” und “Speichern” anzuzeigen. Die vollständige Liste ist natürlich in der Dokumentation; und ein Beispiel für die Erstellung von Toolbar Buttons ist auch im Netz.

Shell32.dll als ICON-Resource

Ich nutze im GATE Framework unter anderem auch Icons aus der shell32.dll. Es gibt zwar keinen dokumentierten Standard dazu, doch Microsoft hat seit NT4 in dieser DLL immer nur neue Symbole hinzugefügt, aber bestehende Indices immer mit den gleichen Grafiken versorgt.

ExtractIconEx() heißt die Funktion, die aus einer EXE oder DLL Icons herausziehen kann, und mit den Zahlen für die wichtigsten Symbole, kann man auch so die “aktuellen” Grafiken erhalten.

GTK

GTK definiert in seinen Headern bzw. in der Doku eine Reihe von Strings, die zu Grafiken eines Themes verweisen. Mit der Funktion gtk_icon_theme_lookup_icon() lassen sich dann Icon-namen wie document-save, edit-copy oder folder-open laden und in Controls anzeigen.

Das ist eigentlich eine sehr elegante Lösung … wenn sie nicht instabil wäre. Denn wenn das Theme eine entsprechende Grafikdatei nicht beinhaltet, kann es zum Crash kommen. Offenbar fehlt hier die Fehlerbehandlung.

Mir ist das unter Linux am Raspberry PI leider untergekommen, wo nach der GTK-3 Installation das Thema nicht korrekt installiert war.

Silk Icons

Und weil man sich eben weder unter Windows noch unter Linux wirklich darauf verlassen kann, dass alle notwendigen Icons wirklich da sind, habe ich mich dazu entschieden, einige PNGs der Silk Icons in Pixmaps umzuwandeln und als C-Header dem GATE Projekt beigelegt.

Denn diese Icons können dann auf jeder Plattform in das eigene Binary integriert und zur Laufzeit geladen werden.

Diese unter der Creative Commons stehende Bildersammlung benötigt nur eine Erwähnung des Authors und ist ansonsten kostenfrei für alle Zwecke nutzbar.
Empfohlen wurde sie mir vor vielen Jahren mal von einem Open-Source-Officer, der sie als “sicher” qualifiziert hatte, gegenüber anderen Bildchen aus dem Netz.

Und wer schon mehrere Softwarepakete ausprobiert hat, wird feststellen, dass die Silk Icons in zahlreichen freien Desktop-Projekten integriert sind.

Fazit

Eigentlich wünsche ich mir, dass Icons großteils vom Betriebssystem und dessen aktuellem Theme kommen. Und deshalb bedauere ich sehr, dass der kleinste gemeinsame Nenner an “bedeutungsgleichen” Icons zwischen Windows und Linux leider ein sehr kleiner ist, und dass man auf Non-standards angewiesen ist, diese Icons dann zu laden.

Zwar habe ich im GATE Framework einen solche Stock-Icon-Teilmenge definiert, doch wegen der Crashes unter Linux, habe ich am Ende dann doch wieder die Silk-Icons eingesetzt.

Aber auch ein noch so kleines Set an “eindeutigen” Icons ist immer noch besser, als der klägliche Versuch mancher Herstelle, ihre eigenen Icons zu designen.