Die Community zu .NET und Classic VB.
Menü

Einbindung von Ressourcen

 von 

Übersicht 

Ressourcendateien werden vor allem bei grösseren Projekten, die in mehreren verschiedenen Sprachversionen erscheinen, verwendet. Der Hauptvorteil von Ressourcendateien liegt darin, dass z.B. sprachspezifische Elemente (Beschriftungen und Grafiken) nicht im Programmcode, sondern in der Ressourcendatei abgelegt werden. Dadurch reicht es beispielsweise, eine Ressourcendatei mit den Ressourcen einer anderen Sprache mit dem Projekt zu verknüpfen und im kompilierten Programm werden automatisch alle Beschriftungen der Sprache angepasst.

Mit freundlichen Grüßen
Herfried K. Wagner

Wozu Ressourcen einbinden?  

Die Hauptverwendungszwecke von Ressourcendateien sind:

  • Erleichterung der Erstellung und Verwaltung internationaler Anwendungen durch das Laden von Texten und Grafiken aus der Ressourcendatei.
  • Einbinden externer Dateien wie z.B. JPEGs, DLLs, Wave-Dateien, Animationen und Textdateien in die .exe
  • Speichercontainer für Grafik- und Textdaten, die zur Zeit nicht auf den Formularen angezeigt werden. Es könnten beispielsweise die Beschriftungen für mehrere Sprachen über eine Ressourcendatei eingebunden werden und je nach Systemsprache die entsprechenden Beschriftungen geladen werden.

Erstellen von Ressourcendateien, Dateinamenserweiterungen  

Ressourcendateien wurden nicht speziell für Visual Basic entwickelt, sie werden auch in anderen Win32-Programmiersprachen wie z.B. Microsoft Visual C++ verwendet. Im Gegensatz zu Visual C++ unterstützt Visual Basic nur einen kleinen Teil der Funktionen von Ressourcendateien, es können aber über das Win32-API auch Ressourcentypen, die nur anderen Programmiersprachen vorbehalten sind, verwendet werden.

Ressourcendateien können Daten in folgenden Formaten enthalten (die Liste ist unvollständig):

Typ Beschreibung
Accelerator Zugriffstastentabellen
Bitmap Bitmap-Grafiken aller Farbtiefen, keine JPEGs, GIFs etc.
Cursor Cursor-Dateien
Dialog* Verschiedene Dialoge
HTML* HTML-Dokumente
Icon Icon-Dateien
Menu* Menüs
String Table Texttabellen
Toolbar* Werkzeugleisten
Version* Versionsinformation
Custom Benutzerdefinierte Datentypen z.B. "CUSTOM" oder "WAVE"

Tabelle 1 : Auflistung der verschiedenen Resourcentypen

Die mit * gekennzeichneten Typen werden von Visual Basic nicht unterstützt.

Ressourcenscripts können in einem Texteditor wie z.B. Notepad geschrieben werden, allerdings können sie auch mit Visual C++ bequem erstellt und modifiziert werden. Zum Kompilieren dieser Ressourcenscripts wird ein Ressourcen-Compiler verwendet. Unter Visual C++ können Ressourcenscripts kompiliert werden, auf der Visual Basic CD-ROM ist der Windows NT-Ressourcen-Compilier rc.exe (Befehlszeile) enthalten.

Extension Dateityp Beschreibung
.rc Ressourcenscript Enthält Anweisungen, anhand derer ein Ressourcen-Compiler die Daten lokalisiert, die einkompiliert werden sollen. Es sind Verweise zu externen Dateien und/oder Tabellen für bestimmte Ressourcentypen enthalten, es können auch die Daten direkt im Ressourcenscript abgelegt sein.
.res Comp. Ressource Diese Dateien sind Windows 32-Bit Ressourcendateien. Sie enthalten Daten, die von einer 32-Bit Windows-Anwendung geladen und verwendet werden können. Diese Dateien werden beispielsweise in ein Projekt für eine Anwendung etc. eingebunden und anschliessend direkt in die ausführbare Datei einkompiliert. Daher muss diese Datei nicht mit dem fertigen Projekt ausgeliefert werden. Wenn ein Ressourcenscript (.rc) zu einer Ressourcendatei (.res) kompiliert wurde, dürfen die Dateien, auf die vom Ressourcenscript verwiesen wird, nicht gelöscht werden, da sie beim erneuten Kompilieren des Ressourcenscripts wieder benötigt werden.

Tabelle 2

Unter Microsoft Visual Basic 6.0 ist ein Ressourceneditor als Add-In verfügbar, er kann über den Dialog zum Hinzufügen von Add-Ins geladen/entladen werden. Dieser Editor wurde speziell auf die von VB unterstützten Ressourcentypen ausgelegt. Dieses Add-In erstellt kein Ressourcenscript sondern schreibt direkt die Ressourcendatei.

Wenn von einem Ressourcen-Projekt nur mehr die kompilierte Ressourcendatei vorhanden ist, weil das Ressourcenscript und die damit verknüpften Dateien gelöscht wurden, so kann die Ressourcendatei mit Microsoft Visual C++ dekompiliert werden, d.h. es werden die Dateien extrahiert und das Ressourcenscript wiederhergestellt.

Aufbau eines Ressourcenscripts [.rc] und VB  

Ladeattribute

Die Ladeattribute geben an, wann eine Ressource geladen werden soll. Als Ladeparameter muss einer der folgenden Parameter verwendet werden:

Parameter Beschreibung
PRELOAD Ignoriert. Unter 16-Bit Windows wird die Ressource mit der Anwendungsdatei geladen
LOADONCALL Ignoriert, Unter 16-Bit Windows wird die Ressource geladen, wenn sie aufgerufen wird

Tabelle 3 : Ladeattribute

Speicherattribute

Die Speicherattribute geben an, ob eine Ressource an einer festen Position im Speicher abgelegt ist, beweglich ist oder ob sie geleert werden kann oder ob es sich um eine reine Ressource handelt. Als Speicher-Parameter können einer oder mehrere der folgenden Werte verwendet werden:

Parameter Beschreibung
FIXED Ignoriert. Unter 16-Bit Windows bleibt die Ressource an einer bestimmten Speicherposition
MOVEABLE Ignoriert. Unter 16-Bit Windows kann die Ressource verschoben werden, um den Speicher zusammenzufassen
DISCARDABLE Die Ressource kann geleert werden, wenn sie nicht mehr länger gebraucht wird.
PURE Ignoriert. Erwartet für die Kompatibilität mit existierenden Ressourcenscripts
IMPURE Ignoriert. Erwartet für die Kompatibilität mit existierenden Ressourcenscripts

Tabelle 4 : Speicherattribute

Für Cursor, Icons und Schriftartenressourcen ist DISCARDABLE Voreinstellung.

ICON Ressource  

nameID ICON [load-mem] filename

Die ICON Ressourcendefinition gibt eine Bitmap (Icon) an, welche in der Anwendung als Icon verwendet werden kann.

Die ICON Ressource mit der niedrigsten Ressourcen-ID wird als Anwendungssymbol verwendet, wenn unter Microsoft Visual Basic ein Formular-Icon als Anwendungssymbol eingestellt wurde, wird dieses nicht verwendet, sondern das Icon aus der Ressourcendatei.

Anwend.Symb. der winpopup.exe Icon mit der niedrigsten Ressourcen-ID in der iexplore.exe

Icons können Bilder für mehrere Grössen und Auflösungen enthalten. Es wird empfohlen, als Anwendungssymbol ein Icon zu verwenden, dass, wie die iexplore.exe, Bilder für die Grössen 16 x 16 Pixel (small), 32 x 32 Pixel (normal) und 48 x 48 Pixel (large) in 16 und 256 Farben enthält.

Parameter

Parameter Beschreibung
nameID Gibt entweder einen eindeutigen Namen oder eine 16-Bit Ganzzahl (Integer) an, der die Ressource definiert.
load-mem Gibt Lade- und Speicherattribute der Ressource an.
filename Gibt den Dateinamen der Datei an, die die Ressource enthält. Der Name muss ein gültiger Dateiname sein, der gesamte Pfad, wenn die Datei sich nicht im Arbeitsverzeichnis befindet. Der Pfad kann in Anführungszeichen gesetzt werden oder nicht.

Tabelle 5

Icon- und Cursorressourcen können mehr als ein Bild enthalten. Wenn die Ressource als PRELOAD markiert ist, lädt Windows alle Bilder in der Ressource, wenn die Anwendung ausgeführt wird.

Das folgende Beispiel gibt 2 Icon-Ressourcen an:

desk1   ICON desk.ico
11      ICON DISCARDABLE custom.ico

MENU Ressource  

menuID MENU [load-mem] [optional-statements]
BEGIN
  item-definitions
  ...
END

Die MENU Ressourcendefinition gibt den Inhalt einer Menü-Ressource an, Ein Menü ist eine Sammlung von Informationen, die das Aussehen und die Funktion des Anwendungsmenüs bestimmen. Ein Menü ist ein spezielles Eingabewerkzeug, das dem Benutzer erlaubt, Befehle aus einer Liste von Befehlsnamen zu wählen.


Abbildung 1: Beispiel für ein typisches Win32-Menü

Parameter

Parameter Beschreibung
menuID Identifiziert das Menü. Dieser Wert ist entweder ein eindeutiger Name oder eine 16-Bit Ganzzahl (Integer) im Bereich von 1 bis 65535
load-mem Gibt Lade- und Speicherattribute der Ressource an.
optional-statements Keines oder mehrere der in der folgenden Tabelle aufgeführten Anweisungen

Tabelle 6

Anweisungen für optional-statements

Anweisung Datentyp Beschreibung
CHARACTERISTICS dWord Benutzerdefinierte Information über eine Ressource, die von Werkzeugen verwendet werden kann, die Ressourcendateien lesen und schreiben
LANGUAGE lang., sublang. Gibt die Sprache für die Ressource an. Die Parameter sind Konstanten aus WINNLS.H
VERSION dWord Benutzerdefinierte Versionsnummer der Ressource, die von Werkzeugen verwendet werden kann, die Ressourcendateien lesen und schreiben

Tabelle 7

Das folgende Beispiel zeigt eine komplette MENU Ressourcendefinition:

sample MENU
BEGIN
     MENUITEM "&Soup", 100
     MENUITEM "S&alad", 101
     POPUP "&Entree"
     BEGIN
          MENUITEM "&Fish", 200
          MENUITEM "&Chicken", 201, CHECKED
          POPUP "&Beef"
          BEGIN
               MENUITEM "&Steak", 301
               MENUITEM "&Prime Rib", 302
          END
     END
     MENUITEM "&Dessert", 103
END

STRINGTABLE Ressource  

STRINGTABLE [load-mem]
[optional-statements]
BEGIN
  stringID string
  ...
END

Die MENU Ressourcendefinition gibt eine oder mehrere String-Ressourcen für eine Anwendung an, String-Ressourcen sind nullterminiert. Es handelt sich dabei um eindeutige Strings, die mit der LoadString API-Funktion geladen werden können, wenn sie von der Anwendungsdatei benötigt werden. Unter Visual Basic wird dazu die LoadResString-Funktion verwendet.

Parameter

Parameter Beschreibung
load-mem Gibt Lade- und Speicherattribute der Ressource an.
stringID Gibt eine 16-Bit Ganzzahl (Integer) an, die die Ressource identifiziert.
string Gibt einen oder mehrere Texte an, die zwischen doppelten Anführungszeichen stehen. Der Text darf höchstens 255 Zeichen lang sein und darf nur eine Zeile Code im Ressourcenscript (.rc) ausmachen. Um einen Wagenrücklauf zum Text hinzuzufügen, wird folgende Zeichensequenz verwendet: \012. Beispielsweise, "Line one\012Line two" würde einen Text definieren, der folgendermassen dargestellt wird:
Line one
Line two
optional-statements Keines oder mehrere der in der folgenden Tabelle aufgeführten Anweisungen

Tabelle 8

Anweisungen für optional-statements

Anweisung Datentyp Beschreibung
CHARACTERISTICS dWord Benutzerdefinierte Information über eine Ressource, die von Werkzeugen verwendet werden kann, die Ressourcendateien lesen und schreiben
LANGUAGE lang., sublang. Gibt die Sprache für die Ressource an. Die Parameter sind Konstanten aus WINNLS.H
VERSION dWord Benutzerdefinierte Versionsnummer der Ressource, die von Werkzeugen verwendet werden kann, die Ressourcendateien lesen und schreiben

Tabelle 9

Gruppieren von Texten (Strings) in einer separaten Sektion erlaubt es, alle eingebundenen Texte auf einmal zu lesen und zu leeren. Wenn möglich, sollte eine Anwendung die Tabelle movable und discardable machen. RC (rc.exe) gruppiert 16 Texte pro Sektion und verwendet die Identifikationsnummer um festzustellen, welche Sektion den gewünschten Text enthält. Texte mit den gleichen "oberen"-12 Bits in ihren Identifikationsnummern sind in der selben Sektion plaziert.

Folgendes Beispiel demonstriert die Verwendung der STRINGTABLE-Anweisung:

#define IDS_HELLO    1
#define IDS_GOODBYE  2

STRINGTABLE
BEGIN
    IDS_HELLO,   "Hello"
    IDS_GOODBYE, "Goodbye"
END

CUSTOM Ressource  

nameID typeID [load-mem] filename

Der Dateiname gibt den Namen einer Datei an, die die Binärdaten der Ressource angibt. Der Inhalt der Datei ist als Ressource enthalten. Der Ressourcen-Compiler RC (rc.exe) interpretiert die binären Daten nicht, daher liegt es in der Verantwortung des Programmierers, dass die Daten optimal für die Architektur des Zielcomputers angepasst sind.

Eine benutzerdefinierte Ressource kann auch vollständig im Ressourcenscript definiert werden, indem folgende Syntax verwendet wird:

nameID typeID [load-mem]
BEGIN
  raw-data
END

Eine benutzerdefinierte Ressourcenanweisung gibt eine Ressource an, die anwendungs-spezifische Daten enthält. Die Daten können jedes Format haben und können auch als der Inhalt einer gegebenen Datei definiert werden (wenn der filename-Parameter angegeben wird), oder als eine Serie von Nummern und Texten (Strings) (wenn der raw-data-Block angegeben wurde).

Parameter

Parameter Beschreibung
load-mem Gibt Lade- und Speicherattribute der Ressource an.
nameID Gibt entweder einen eindeutigen Namen oder eine 16-Bit Ganzzahl (Integer) an, die die Ressource identifiziert
typeID Gibt entweder einen eindeutigen Namen oder eine 16-Bit Ganzzahl (Integer) an, die den Ressourcentyp identifiziert. Wenn eine Nummer angegeben wurde muss diese grösser als 255 sein. Die Nummern von 1 bis 255 sind für bereits existierende oder zukünftige Ressourcentypen reserviert
filename Gibt den Namen der Datei an, die die Ressourcendaten enthält. Der Name muss ein gültiger Dateiname sein; wenn sich die Datei nicht im Arbeitsverzeichnis befindet, muss der volle Pfad der Datei angegeben werden
raw-data Gibt Rohdaten an, die aus einer oder mehreren Ganzzahlen oder Texten aus Zeichen besteht. Ganzzahlen (Integers) können in Dezimal-, Oktal-, oder Hexadezimalformat angegeben werden. Der Ressourcen-Compiler fügt einem String nicht automatisch ein abschliessendes Nullchar hinzu. Der String ist eine Folge von ANSI (Byte) Zeichen, Strings in allen Ressourcen ausser RCDATA und benutzerdefinierten Ressourcen sind Unicode-Strings. Es ist die Aufgabe des Programmierers, die Daten optimal auf die Architektur des Zielcomputers anzupassen.

Tabelle 10

Folgendes Beispiel zeigt verschiedene benutzerdefinierte Anweisungen:

array   MYRES   data.res
14      300     custom.res
18 MYRES2BEGIN
  "Here is a data string\0", /* A string, null-terminated */
  1024,                      /* int        */
  0x029a,                    /* hex int    */
  0o733,                     /* octal int  */
  "\07"                      /* octal byte */
END

CURSOR Ressource  

nameID CURSOR [load-mem] filename

Die CURSOR Ressourcendefinition gibt eine Bitmap (Cursor) an, die die Form des Cursors auf dem Bildschirm bestimmt.

Parameter

Parameter Beschreibung
load-mem Gibt Lade- und Speicherattribute der Ressource an.
nameID Gibt entweder einen eindeutigen Namen oder eine 16-Bit Ganzzahl (Integer) an, die die Ressource identifiziert.
filename Gibt den Namen der Datei an, die die Ressource enthält. Der Name muss ein gültiger Dateiname sein; wenn sich die Datei nicht im Arbeitsverzeichnis befindet, muss der volle Pfad der Datei angegeben werden. Der Pfad kann optional zwsichen Anführungszeichen gestellt werden.

Tabelle 11

Icon- und Cursorressourcen können mehr als ein Bild enthalten. Wenn die Ressource als PRELOAD markiert ist, lädt Windows alle Bilder in der Ressource, wenn die Anwendung ausgeführt wird.

Folgendes Beispiel gibt 2 Cursor-Ressourcen an; eine mit dem Namen (cursor1) und die andere über eine Nummer (2):

cursor1 CURSOR bullseye.cur
2       CURSOR "d:\\cursor\\arrow.cur"

Cursor werden unter Visual Basic mit der LoadResPicture-Funktion unter Angabe der Ressourcen-ID und des Parameters vbResCursor geladen.

BITMAP Ressource  

nameID BITMAP [load-mem] filename

Die BITMAP Ressourcendefinition-Anweisung bestimmt eine Bitmap, die von einer Anwendung für die Bildschirmdarstellung oder als Teil eines Menüs oder Steuerelements verwendet wird.

Parameter

Parameter Beschreibung
load-mem Gibt Lade- und Speicherattribute der Ressource an.
Gibt Lade- und Speicherattribute der Ressource an Gibt entweder einen eindeutigen Namen oder eine 16-Bit Ganzzahl (Integer) an, die die Ressource identifiziert.
filename Gibt den Namen der Datei an, die die Ressource enthält. Der Name muss ein gültiger Dateiname sein; wenn sich die Datei nicht im Arbeitsverzeichnis befindet, muss der volle Pfad der Datei angegeben werden. Der Pfad kann optional in Anführungszeichen gestellt werden

Tabelle 12

Folgendes Beispiel definiert 2 Bitmap-Ressourcen:

disk1   BITMAP disk.bmp
12      BITMAP PRELOAD diskette.bmp

Bitmaps können in einer Anwendung mit der Funktion LoadBitmap geladen werden, unter Visual Basic wird dazu die LoadResPicture-Funktion in Verbindung mit dem vbResBitmap-Parameter verwendet.

Ressourcen in Visual Basic  

LoadResString-Funktion

Diese Funktion Lädt eine Zeichenfolge aus einer Ressourcendatei (.res). Der Index erforderlich und muß eine Ganzzahl sein, die die Kennung (ID) der Daten in der Ressourcendatei angibt. Die Ressource mit der ID 1 ist für das Anwendungssymbol reserviert.

Syntax: LoadResString(Index)

Sie können die LoadResString-Funktion anstelle von Zeichenfolgenkonstanten in Ihrem Code verwenden. Das Speichern langer Zeichenfolgen mit Daten und der Zugriff auf diese Elemente aus Ressourcendateien verkürzt die Ladezeit, da Sie die Elemente einzeln bei Bedarf aus der Ressourcendatei laden können und nicht alle gleichzeitig laden müssen, wenn ein Form-Objekt geladen wird.

LoadResPicture-Funktion

Diese Funktion lädt eine Bitmap, ein Symbol (Icon) oder einen Cursor aus einer Ressourcendatei (.res).

Syntax: LoadResPicture(Index, Format)

Der Index ist erforderlich und muß eine Ganzzahl oder Zeichenfolge sein, die die Kennung (ID) der Daten in der Ressourcendatei angibt. Die Ressource mit der ID 1 ist für das Anwendungssymbol reserviert. Für Format muß ein Wert oder Konstante eingesetzt werden, der/die das Format der zurückgegebenen Daten angibt, wie in folgender Tabelle erläutert.

Werte für Format

Konstante Wert Beschreibung
vbResBitmap 0 Bitmap-Ressource
vbResIcon 1 Symbolressource
vbResCursor 2 Cursor-Ressource

Tabelle 13

Sie können die LoadResPicture-Funktion verwenden, anstatt sich auf Grafiken zu beziehen, die in der Picture-Eigenschaft eines Form-Objekts oder eines Steuerelements gespeichert sind.

Das Speichern von Bitmaps, Symbolen und Cursor-Abbildungen in Ressourcendateien und der Zugriff auf diese Elemente aus Ressourcendateien verkürzt die Ladezeit, da Sie die Elemente einzeln bei Bedarf aus der Ressourcendatei laden können und nicht alle gleichzeitig laden müssen, wenn ein Form-Objekt geladen wird.

LoadResData-Funktion

Diese Funktion lädt Daten aus mehreren möglichen Typen von Ressourcendateien (.res) und gibt ein Byte-Datenfeld zurück.

Syntax: LoadResData(Index, Format)

Der Index ist erforderlich und muß eine Ganzzahl oder Zeichenfolge sein, die die Kennung (ID) der Daten in der Ressourcedatei angibt. Die Ressource mit der ID 1 ist für das Anwendungssymbol reserviert. Format gibt den Wert, des Originalformats der zurückgegebenen Daten, an, wie unter Einstellungen beschrieben. Der Wert kann auch der Zeichenfolgenname einer benutzerdefinierten Ressource sein.

Werte für Format

Typ Beschreibung
Accelerator Zugriffstastentabellen
Bitmap Bitmap-Grafiken aller Farbtiefen, keine JPEGs, GIFs etc.
Cursor Cursor-Dateien
Dialog* Verschiedene Dialoge
HTML* HTML-Dokumente
Icon Icon-Dateien
Menu* Menüs
String Table Texttabellen
Toolbar* Werkzeugleisten
Version* Versionsinformation
Custom Benutzerdefinierte Datentypen z.B. "CUSTOM" oder "WAVE"

Tabelle 14 : Die mit * markierten Typen werden von Visual Basic nicht unterstützt.

Die von LoadResData aus der Ressourcedatei geladenen Daten können maximal 64 KB umfassen. Bei Verwendung von LoadResData mit einer Bitmap-, Symbol- oder Cursor-Ressource wird eine Zeichenfolge zurückgegeben, die die eigentlichen Bits in der Ressource enthält. Wenn Sie diese Bitmap, Ressource oder dieses Symbol einsetzen möchten, verwenden Sie die LoadResPicture-Funktion.

LoadResData kann beim Lokalisieren einer Visual Basic-Anwendung sinnvoll eingesetzt werden, da die Ressourcen, die übersetzt werden müssen, in einer Ressourcendatei zusammengefasst sind. Es ist nicht notwendig, auf den Quell-Code zuzugreifen oder die Anwendung neu zu kompilieren.

Beispiele zur Verwendung von Ressourcen  

ResDemo

Einfaches Beispiel zur Verwendung der gängigen Ressourcentypen in Visual Basic.

Projekt als Download [5200 Bytes]

LoadResFile

JPEGs, GIFs, DLLs, Anwendungen etc. können über Ressourcendateien in die .exe einkompiliert werden. Die maximale Grösse pro eingebundener Datei ist 64 KB.

Projekt als Download [36600 Bytes]

PlayResWave

Waves können in die .exe einkompiliert und wiedergegeben werden.

Projekt als Download [8800 Bytes]

VBResDLL

Eine Anwendung lädt die Beschriftungen und Grafiken aus einer ActiveX-DLL. So könnte je nach Sprache immer eine andere ActiveX-DLL verwendet werden, wobei die gleiche .exe verwendet wird.

Projekt als Download [8000 Bytes]

DesktopForm

Anwendungsicon aus der Ressourcendatei.

Projekt als Download [17600 Bytes]

Ihre Meinung  

Falls Sie Fragen zu diesem Tutorial haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.