Die Datei enthält Makros, die eine WMF erzeugen oder einlesen können. Der Browser kann meckern, dass die Datei möglicherweise Viren enthalten können. Beim Öffnen wird auch vor eventuell schädlichem Code gewarnt. Mit VBA kann man tatsächlich auch Viren schreiben. Z.B. gab es mal eine Exceltabelle, die hat seinen Code beim Speichern in die letzten 4 geöffneten Tabellen geschrieben und in jeder Zelle den Wert mit einer einprozentigen Wahrscheinlichkeit um 5% erhöht oder verringert.
Solltest du misstrausch sein, dann gibt es diese Möglichkeiten:
Makros deaktivieren klicken und sich mit ALT F11 den Code durchlesen, ob dieser was schlimmes macht. Wirst du nach einem Passwort gefragt, damit du den Code lesen kannst, dann ist da möglicherweise ein Virus drin.
Aber der sichtbare Nutzcode kann doch von dem Virus ablenken? Woher weiß ich denn, dass da im Hintergrund nicht doch ein passwortgeschützes Geheimnis versteckt ist, dass heimlich eine unsichtbare Email an WoT-WMF mit den letzten geöffneten Worddokumenten schickt?
Abhilfe schafft da folgender Lösungsweg: Man kopiert den sichtbaren Code in eine Textdatei und speichert die Datei als XLSX. Im Dateiformat XLSX können keine Makros gespeichert werden. Excel schließen und die XLSX öffnen. Beim WMFzerleger steht in Zeile O25 #NAME?, weil die Makros fehlen. Dann drückt man ALT F11 und kopiert die Makros aus der Textdatei rein und speichert als XLSB oder XLSM. Nun sollte die Exceltabelle wieder funxionieren - Tabellen mit Geheimnis würden hingegen fehlerhaft arbeiten. Die Tastenkürzel STRG+L und STRG+J müssen nachträglich wieder zugewiesen werden.
Außerdem immer schön das Internetkabel ziehen. Meckert Excel, dass das Internet nicht geht, dann die Datei sofort in den Müll werfen.
Mit dieser Exceltabelle ist es möglich WMF-Dateien auf Byteebene zu bearbeiten
Die Exceldatei ist in mehrere Blätter unterteilt, die folgende Funxion haben
WMF: WMF Datei zusammensetzten oder einlesen
WMF2: WMF Datei einlesen oder zusammensetzen. WMF2 kann mit WMF verglichen werden
Bedienungsanleitung:
Dateien: Sehr viele Beispieldatein aus der Kampfkrafttheorie. Hier kann nachvollzogen werden, wie eine WMF funxioniert
WMFobjekte: Hier steht drin, wie man welches Byte zu füllen hat
3Ddiagramm: Hier kann man anhand von Zahlen ein 3D-Diagramm erstellen
EMF: EMF-Dateien einlesen. EMF zusammensetzen habe ich noch nicht programmiert, da ich EMF nicht so schön finde
EMFobjekte: Eine Liste der EMF-Objekte laut Dateispezifikation
Die EMF-Tabellen werden für die Bedienung nicht benötigt.
WMF-Grundwissen
Eine WMF-datei besteht auf einen Preader, dann einen Header und danach einem Hauptteil
Der Preader beschreibt, in welcher Größe die WMF erscheint und beginnt mit dem Schlüssel: 52695;39622
Der Header beinhaltet Informationen zur Datei
Der Hauptteil besteht aus WMFobjekte
Header und Preader sind 42 Byte groß. Auf dem Preader kann verzichtet werden
Ein Objekt wird in der Dateispezifikation Rekord genannt. Rekord und Objekt sind Wörter für das selbe
Ein Objekt besteht aus 4 Byte für die Objektlänge, dann 2 Byte für den Objekttyp und der Rest beschreibt den Inhalt
WMF-Darstellung in dieser Exceltabelle
Der Preader
Der Preader wird in Zeile 25 dargestellt und beginnt in Spalte E
was man eintragen muss |
52695 |
39622 |
0 |
0Re |
0ch |
te X |
ck Y |
Inch 96(1=1Pixel) |
0 |
0 |
Checksumme |
Beispiel |
52695 |
39622 |
0 |
0 |
0 |
1300 |
1024 |
1920 |
0 |
0 |
20869 |
Jede Zelle in Excel beinhaltet ein Doppelbyte
Die Zellen werden von links nach rechts gelesen
Die WMF-datei beginnt mit dem Preader und das erste Doppelbyte der Datei ist ein Teil des Schlüssels. Der Wert muss 52695 sein.
Die Zelle rechts davon setzt den Schlüssel fort 39622
Dann kommt eine 0
Die nächsten 4 Doppelbyte beschreiben den Bereich der WMF, der angezeigt werden soll. Dies sind die Koordinaten eines Rechteckes.
Da der Ausschnitt im Koordinatenursprung beginnen soll, sind die ersten beiden Werte 0.
Die anderen beiden Werte sind die X- und Y-koordinate, die den Ausschnitt festlegen.
Natürlich kann man die weißen Ränder einer Grafik auch in Word abschneiden. Aber wenn was fehlt, dann muss man es hier machen.
Das achte Doppelbyte ist sehr wichtig. Es beschreibt, wie groß der Inhalt angezeigt wird. Je größer der Wert, desto kleiner ist die Anzeige.
Dabei bedeutet 96, dass eine Einheit ein Pixel groß ist.
Eine Linie, die 4000 lang ist, wird beim Wert 96 genau 4000 Pixel lang sein. Zoomt man in Word, bleibt die Linie natürlich weiterhin glatt.
Da der Bildschirm meist keine 4000 Pixel hat, sollte man die Grafik verkleinern. Nimmt man den Wert 960, dann wird die Linie nur noch 400 Pixel groß angezeigt.
Natürlich kann man die Grafik auch in Word vergrößern und verkleinern. Bei zu winzigen und zu riesigen Skalierfaktoren wird Word allerdings zickig.
Das neunte und zehnte Doppelbyte ist 0
Das letzte Doppelbyte des Preaders ist eine Checksumme. Diese muss stimmen, sonst funxioniert der Preader nicht.
Ändert man die Koordinaten des Anzeigerechtecks, so ändert sich die Checksumme. In dieser Zelle muss also die Formel drinstehen.
Der Header
Im Header steht, wie groß die Datei ist, wieviele Objekte dadrin sind und wie lang das länste ist.
Ist der Header falsch, so weigern sich einige Programme wie z.B. Irfanview, die Datei an zu zeigen
Word zeigt korrupte WMF-datein ohne irgendwelches Meckern an.
Der Header wird in der Exceltabelle nicht angezeigt. Der wird vom Makro automatisch korrekt berechnet.
Um den Header braucht man sich nicht zu kümmern
Die Objekte
Obwohl zwischen Hauptteil und Preader noch der Header liegt, geht es in der nächsten Zeile schon mit dem Inhalt los.
Der Inhalt startet ab Zeile 26
Jede Zeile beinhaltet ein Objekt
Die Zeile wird von links nach rechts gelesen.
In Spalte D befindet sich die Objektlänge
In Spalte E befindet sich der Objekttyp. Objekttyp heißt in der Dateispezifikation "recordfunction"
Jede Zelle beinhaltet 2 Byte
Aber die Objektlänge wird doch mit 4 Byte angegeben. Wo befinden sich zwischen Spalte D und E die restlichen 2 Byte?
Die fehlenden 2 Byte sind 0 und werden vom Makro ergänzt. Die Tabelle bleibt eine Spalte voller Nullen erspart. Ich bin davon ausgegangen, dass niemals ein Mensch ein Objekt mit
mehr als 65536 Byte manuell erstellen wird.
In Spalte E wird die Zahl des Objektes eingetragen. 1313 bedeutet, dass dieses Objekt einen Text darstellt.
Da es so schwer ist, sich die ganzen Zahlen für die Objekte zu merken, ist es auch Möglich, dass man den Name des Objektes dort einträgt.
Das Makro wandelt den Name in die passende Zahl um. Polylinie bedeutet also 805.
Ab Spalte F beginnen die Objektinhalte
Beim WMF-Koordinatensystem geht die X-Axe nach rechts und die Y-Axe nach UNTEN!
Ist eine Zelle in Spalte D leer, dann bedeutet dies das Dateiende
Eine WMF-Datei muss ein Textobjekt enthalten, da sonst Excel sich weigert sie korrekt zu lesen
Beispiel Polylinie
Eine dicke Polylinie soll von (3;8) nach (20;50) gezeichnet werden.
Man schaut in das Blatt WMFobjekte.
Dort gibt es das Objekt Polylinie
Man sieht 7 Zellen, in denen was steht.
In Spalte E steht Polylinie, denn eine Polylinie soll ja auch gezeichnet werden.
Die Spalte D bedeutet die Objektlänge und da steht #WERT! drin.
Excel berechnet die korrekte Objektlänge, denn die Objektlänge ist bei Polylinien von der Anzahl der Punkte abhängig.
In Spalte F wird die Anzahl der Punkte verlangt. Bei dieser Polylinie sind es 2 Punkte.
Die Zellen rechts davon beschreiben, welche Koordinaten man einsetzen muss. Jeweils 2 Zellen sind immer ein Punkt.
Achtung: Genau hinkucken! Bei der Polylinie muss zuerst die X-Koordinate des Punktes eingesetzt werden, dann die Y-Koordinate. Beim Text ist dies umgekehrt!
Die Linie sieht dann so aus
#WERT! |
Polylinie |
Anzahl der Punkte |
x |
y |
x |
y |
8 |
Polylinie |
2 |
3 |
8 |
20 |
50 |
Aber die Polylinie ist ja garnicht dick!
Beispiel Text
Ein Text "Hello World" soll geschrieben werden. Er soll an der Stelle (40,80) und 90° gedreht sein
Man schaut in das Blatt WMFobjekte.
Dort gibt es das Objekt Text
Spalte D ist wie immer die Objektlänge und Spalte E der Objekttyp
Spalte F beinhaltet die Länge des Textes und wird automatisch berechnet
Die Objektlänge in Spalte D ist von der Länge des Textes abhängig. Man muss hier nichts manuell berechnen
Achtung: Hat man eine WMF Datei eingelesen, dann stehen hier keine Formeln hinter. Wird der Text geändert, aber die Textlänge und Objektlänge nicht neu berechnet, dann crasht die
WMF-Datei.
Zeile G hat eine Besonderteit. Hier wird keine Zahl eingetragen. Es wäre furchbar, wenn man den Text, den man Tippen will, erst mühevoll in mehrere Doppelbytes umrechnen
muss.
Deshalb wird speziell für das Textobjekt in Spalte G der Text eingetragen, den man haben will - und keine Zahlenfolge.
Danach werden die Koordinaten des Textes eingegeben
Achtung: Genau hinkucken! Bei dem Text muss zuerst die Y-Koordinate des Punktes eingesetzt werden, dann die X-Koordinate.
Der Text sieht dann so aus
8 |
Text |
4 |
Text |
Y |
X |
12 |
Text |
11 |
Hello World |
80 |
40 |
Aber der Text ist ja garnicht um 90° gedreht!
Beispiel Kreis
Ein roter Kreis soll gezeichnet werden. Er soll an den Punkt (20;20) und hat einen Radius von 10
Dazu holt man sich den Kreis aud dem Blatt WMFobjekte
Es gibt eine Ellipse. Sie wird durch das umschließende Rechteck beschrieben.
Man stellt sich die Ellipse also wie ein Rechteck vor und tippt die Koordinaten eines Rechtecks ein.
Leider kann man die Wunschwerte des Kreises nicht direkt eintragen. Man muss also rechnen.
Die Ellipse beginnt bei x=10 und endet bei x=30. Und sie beginnt bei y=10 und endet bei y=30.
Große Y-Koordinaten sind unten und nicht oben
Deshalb trägt man folgendes ein
7 |
Ellipse |
Y untenrechts |
X untenrechts |
Y obenlinks |
X obenlinks |
7 |
Ellipse |
30 |
10 |
10 |
30 |
Aber der Kreis ist ja garnicht rot.
WMF Malobjekte
Für dicke Polylinien, gedrehte Texte und rote Kreise benötigt man Eigenschaften
Eine dicke Linie wird mit einem dicken Füller gezeichnet.
Ein Text wird schräg, wenn man die Schreibmaschine dreht.
Und einen Kreis malt man mit einem roten Pinsel aus.
So einfach ist das.
Die dafür benötigten WMF-Malobjekte heißen Füller, Font und Pinsel. Es gibt 3 Objekte, mit denen gemalt wird.
8 |
Füller |
Füllerstil |
Dicke |
0 |
Farbe |
Farbe |
|
|
|
|
|
28 |
Font |
Höhe |
0 |
0 |
Winkel in Zehntelgrad |
Breite 400=Normal 700=Fett |
0 |
0 |
0 |
0 |
Schriftart(32String) |
7 |
Pinsel |
Stil=0 |
Farbe |
Farbe |
|
|
|
|
|
|
|
Und so werden die Objekte korrekt erstellt
Der Füller
Der Füller hat eine Farbe und eine Dicke. Außerdem hat er einen Stil
Beim Stil bedeutet, dass er bei 0 durchgeht und bei 5 unsichtbar ist.
8 |
Füller |
0 |
2 |
0 |
0 |
0 |
Dieser dargestellte Füller zeichnet eine schwarze Linie der Dicke 2.
8 |
Füller |
5 |
10 |
0 |
255 |
0 |
Und dieser Füller zeichnet eine rote Linie der Dicke 10 und ist unsichtbar.
Unsichtbar macht Sinn, wenn man einen roten Kreis will, der nicht schwarz umrandet ist.
Die Farbe wird durch 2 Doppelbyte beschrieben und zwar nach dem RGB-Modell
Zuerst kommt Rot, dann Grün, dann Blau und zuletzt noch eine 0
Farben:
rot |
255 |
0 |
gelb |
65535 |
0 |
grün |
65280 |
0 |
cyan |
65280 |
255 |
blau |
0 |
255 |
magenta |
255 |
255 |
schwarz |
0 |
0 |
weiß |
-1 |
255 |
Bei Zahlen größer als 32768 darf der Wert um 65536 vermindert werden. -1= 65535
Der Pinsel
Der Pinsel hat eine Farbe und kann auch unsichtbar sein.
Unsichtbar macht Sinn, wenn man ein durchsichtiges schwarz umrandetes Rechteck zeichnen will.
7 |
Pinsel |
0 |
0 |
255 |
Dieser Pinsel ist blau
Der Font
Im Font kann man sehr viel einstellen. Das Unwichtige wird erstmal auf 0 gesetzt, weil man das nicht braucht.
Wichtig ist die Schriftgröße, die Textdrehung und die Schriftart.
Die Textdrehung wird in Zehntel Grad angegeben und ein rechter Winkel hat also 900.
28 |
Font |
Höhe |
0 |
0 |
Winkel in Zehntelgrad |
400 |
0 |
0 |
0 |
0 |
Schriftart(32String) |
28 |
Font |
12 |
0 |
0 |
1800 |
400 |
0 |
0 |
0 |
0 |
Times New Roman |
Diese Schreibmaschine schreibt die Schriftart "Times New Roman" auf dem Kopf in der Schriftgröße 12
Wichtig für Texte: Es sind nur ASCII-Zeichen erlaubt. Ä,Ö,Ü, ß sind erlaubt, griechische Buchstaben nicht!
Für griechische Buchstaben muss man einen Font nehmen, der griechische Buchstaben hat. Z.B. Symbol
WMF Malobjekte benutzen
Es reicht nicht, wenn man einen Pinsel und einen Füller hat. Man muss ihn erst in die Hand nehmen, um damit zu malen.
Ein Objekt nimmt man in die Hand, indem man das Objekt wählt.
4 |
ObjektWählen |
Objektnummer |
Man kann nur Malobjekte wie Füller, Pinsel oder Font in die Hand nehmen. Mit einem Rechteck kann man nicht malen.
Etwas kompliziert wird es bei der Objektnummer
Das erste Malobjekt, das erstellt wird, bekommt die Nummer 0.
Jedes weitere Objekt füllt den nächsten freien Platz.
Erstellt man einen Pinsel, dann noch einen und dann einen Füller,
dann haben die beiden Pinsel die Nummer 0 und 1 und der Füller liegt auf dem zweiten Platz.
In der WMF-Hand kann ein Füller, ein Pinsel und ein Font genommen werden.
Wird ein neuer Füller in die Hand genommen, so wird der alte Füller bei Seite gelegt. Man kann ihn später wieder aufheben.
Malobjekte, die man nicht mehr braucht, kann man auch löschen. Doch irgendwie macht dies überhaupt keinen Sinn.
Beispiel zum Malobjekte nutzen
Es soll ein rot umranderer gelber Kreis schwarz durchgestrichen werden.
Bevor man den Kreis und die Linie zeichnet, braucht man erst die richtigen Hilfsmittel.
Dazu erstellt man einen roten Füller. Dieser liegt auf Platz 0
Dann erstellt man einen schwarzen Füller. Dieser liegt auf Platz 1
Zuletzt erstellt man einen gelben Pinsel. Dieser liegt auf Platz 2
Jetzt soll der Kreis gezeichnet werden. Dazu braucht man den roten Füller und den gelben Pinsel
4 |
ObjektWählen |
0 |
4 |
ObjektWählen |
2 |
Der Kreis wird gemalt. Für die schwarze Linie braucht man den schwarzen Füller.
4 |
ObjektWählen |
1 |
Das Malobjekt 1 ist nun anstelle des Malobjektes 0 aktiv.
Zusätzliche Objekte
In der Exceltabelle habe ich zusätzliche Objekte eingeführt, die es in der WMF-Datei nicht gibt.
18 |
Pfeil |
Pfeilgröße |
x |
y |
x |
y |
|
|
|
|
|
|
|
|
44 |
Maßkette |
Pfeilgröße |
x |
y |
x |
y |
|
|
|
|
|
|
|
|
64 |
BiMaßkette |
Pfeilgröße |
x |
y |
x |
y |
x |
y |
|
|
|
|
|
|
|
Diagramm |
Pfeilgröße |
x |
y |
x |
y |
X Text |
Y Text |
Farbe 0= farblos |
X Teilungen |
Y Teilungen |
Anzahl der Punkte |
X Werte- array |
X Werte- array |
|
|
|
|
|
|
|
|
|
|
|
|
|
Y Werte- array |
Y Werte- array |
Diese Objekte werden in der Kampfkraftteorie exzessiv verwendet.
Diese Objekte sind Pfeile, Maßketten und Diagramme.
Der Pfeil besteht aus einem Dreieck als Pfeilspitze und einer Linie.
Die Maßkette besteht aus einem 3 Linien und 2 Dreiecke, aber beinhaltet noch keinen Text.
Die Bimaßkette ist wie 2 Maßketten, nur dass diese 24 Doppelbytes sparsamer ist.
Das Diagramm besteht aus sehr vielen Objekten, die ein Diagramm ergeben.
Mit Nichts wird die Zeile einfach übersprungen. Dies macht Sinn, wenn man mit einer Wennformel bestimmte Teile ausblenden will.
Beispieldatei
|
52695 |
39622 |
0 |
0 |
0 |
12000 |
3300 |
1920 |
0 |
0 |
29333 |
|
|
|
|
28 |
Font |
360 |
0 |
0 |
0 |
400 |
0 |
0 |
0 |
0 |
Times New Roman |
|
|
|
|
5 |
Textabdecken |
1 |
0 |
|
|
|
|
|
|
|
|
|
|
|
|
8 |
Füller |
0 |
16 |
0 |
0 |
0 |
|
|
|
|
|
|
|
|
|
7 |
Pinsel |
0 |
49407 |
192 |
0 |
|
|
|
|
|
|
|
|
|
|
7 |
Pinsel |
0 |
0 |
0 |
0 |
|
|
|
|
|
|
|
|
|
|
4 |
ObjektWählen |
0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
4 |
ObjektWählen |
1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
4 |
ObjektWählen |
3 |
|
|
|
|
|
|
|
|
|
|
|
|
|
7 |
Text |
2 |
K1 |
0 |
500 |
|
|
|
|
|
|
|
|
|
|
7 |
Text |
2 |
K2 |
0 |
6700 |
|
|
|
|
|
|
|
|
|
|
|
Diagramm |
200 |
500 |
2750 |
5000 |
1000 |
Lu |
A K=25200 al |
2 |
4 |
5 |
3 |
0 |
0 |
360 |
7 |
Pinsel |
0 |
49344 |
255 |
0 |
|
|
|
|
|
|
|
0 |
70 |
70 |
4 |
ObjektWählen |
3 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Diagramm |
200 |
6700 |
2750 |
10970 |
800 |
Lu |
A K=26644,8 al |
4 |
4 |
5 |
3 |
0 |
0 |
341,6 |
|
|
|
|
|
|
|
|
|
|
|
|
|
0 |
78 |
78 |
Und so funxioniert die Datei:
Zuerst wird mit dem Preader gestartet. Schlüssel, Ansichtsfenster, Skalierung und Checksumme werden korrekt eingegeben.
Dann wird ein Font erstellt.
Danach wird das Textabdecken festgelegt. Die 1 bedeutet, dass Texte nicht abdecken.
Es wird ein schwarzer 16 dicker Füller definiert.
Danach kommt ein hellroter Pinsel und dann noch ein schwarzer Pinsel
Nun werden Objekt 0, 1 und 3 in die Hand genommen. Dies sind der Font, der schwarze Füller und der schwarze Pinsel.
Dann werden 2 Texte ganz oben hingeschrieben.
Nun wird ein KKT-Diagramm gezeichnet. Die Werte wurden korrekt eingetragen, sodass das Makro ein Diagramm erstellt.
Ein hellgrüner Pinsel wird erstellt.
Der schwarze Pinsel wird in die Hand genommen, weil im Diagramm der Pinsel gewexelt wurde.
Ein weiteres Diagramm wird gezeichnet. Da wird dann der hellgrüne Pinsel benutzt.
Tastenkürzel
Strg+j ließt eine WMF ein
Strg+L erzeugt eine WMF