Directory Contents Search << >>


Metafiles

Konzept

Zur Ausgabe von Grafiken ist in Windows das GDI (Graphic Device Interface) zuständig. Applikationen rufen GDI-Funktionen wie MOVETO, RECTANGLE etc. auf, und das GDI führt die Zeichenfunktionen durch. Metafiles sind nun Aufzeichnungen solcher Folgen von Zeichenanweisungen. Metafiles werden sowohl programmintern, als auch zur Übergabe von Bildern über die Zwischenablage und OLE-Objekte verwendet.

Skalierbarkeit

Metafiles zeichnen sich insbesondere durch ihre gute Skalierbarkeit aus, da die Zeichenanweisungen erst bei der endgültigen Ausgabe mit der gerade gültigen Auflösung des Ausgabegerätes ausgeführt werden. So wird verhindert, dass Schriften auf einem Drucker oder bei Detailvergrößerungen "pixelig" wirken.

Nachteilig ist die Abhängigkeit des exakten Ausgabeergebnisses vom Gerätetreiber, so muss auf dem Ausgabesystem für optimale Ergebnisse auch jede im Metafile verwendete Schriftart installiert sein.

Koordinatensysteme

Da bei der Erstellung eines MetaFiles üblicherweise die Auflösung des Ausgabegerätes nicht bekannt ist, zeichnet die erstellende Anwendung den MetaFile basierend auf "logischen Koordinaten". Bei der Darstellung (dem "Abspielen") des MetaFiles auf dem Ausgabegerät führt das Windows GDI entsprechende Koordinatenumrechnungen nach den Angaben der realen Auflösung von der Anwendung (SetViewportExtEx) und der logischen Größe im Metafile (SetWindowExtEx) aus.

Metafile erzeugen

Eine Metafile-Aufzeichnung beginnt durch Anfordern eines HDC-Handles mit

HDC hMeta = CreateMetaFile(NULL);

Wenn ein Metafile nicht nur programmintern verwendet werden soll, sollte immer der MM_ANISOTROPIC-Modus benutzt werden.

SetMapMode(hMeta, MM_ANISOTROPIC);

SetWindowExtEx(hMeta, xx, yy, NULL);

SetWindowOrgEx(hMeta, xx, yy, NULL);

Anschließend können nahezu beliebige Zeichenvorgänge in den Metafile ausgeführt werden.

MoveTo(hMeta, 100, 100);

LineTo(hMeta, 200, 400);

Rectangle(hMeta, 10, 10, 50, 50);

HFONT hFont = CreateFont ( ... )

HFONT hFontOld = SelectObject( hMeta, hFont );

ExtTextOuT( hMeta ...)

SelectObject(hMeta, hFontOld);

DeleteObject(hFont)

Wichtig: Aus einem MetaFile kann nichts gelesen werden. Daher nicht verwenden: DrawText, GetTextMetrics, GetTextExtent ...!

Bevor der MetaFile abspielt werden kann, muss er geschlossen werden. Dadurch wird anstelle des DC-Handles ein HMETAFILE-Handle zur Verfügung gestellt.

  

HMETAFILE hBild = CloseMetaFile(hMeta);

Jetzt kann die Aufzeichnung mittels PlayMetaFile(hDC, hBild); in jeden Device-Kontext übertragen werden, dabei wird allerdings SetWindowExt usw. verändert und muss daher zuvor mit SaveDC gespeichert und anschließend restauriert werden.

Um die Ausgabegröße festzulegen, verwendet die Anwendung die Funktion SetViewportExtEx und SetViewportOrg:

PAINTSTRUCT  ps;

HWND    hDC = BeginPaint(hWnd, &ps);

RECT    rc;

GetClientRect(hWnd, &rc);

SetMapMode(hDC, MM_ANISOTROPIC);

SetViewportExtEx(hDC, rc.right, rc.bottom, NULL);

SetViewportOrgEx(hDC, 0, 0, NULL);

PlayMetaFile(hDC, hBild);

Günstige Eigenschaften:

Bei einfach strukturierten, aber großen Bildern brauchen sie weniger Speicher als Bitmaps und nutzen die Auflösung des Ausgabegerätes optimal.

Sie sind beliebig vergrößerbar / stauchbar, ohne dass Treppen oder ähnliches sichtbar werden:

Ein Metafile kann SelectPalette-Anweisungen enthalten, wodurch z.B. in Write oder Word Bilder mit 256 Farben sichtbar werden. Dies wird aber dadurch begrenzt, dass die Anwendung die Palette für die Reaktion auf Fenster-Nachrichten wie WM_QUERYNEWPALETTE nicht kennt, was erst mit Enhanced MetaFiles möglich wäre.

Ungünstige Eigenschaften:

Metafiles innerhalb von Metafiles sind heikel (siehe ScaleWindowExt)

Das Zoomen von Bitmaps sieht i.a. nicht gut aus, vor allem bei Zoomfaktoren nahe 1.0 (wie 1000:995). Das Anwendungsprogramm kann aber die Größe einer Bitmap innerhalb eines Metafiles kaum beeinflussen.

Nur wenige Programme unterstützen das direkte Bearbeiten von Metafiles (eines von Ihnen ist Microsoft Graph).

Placeable Metafiles

Die HMETAFILE Handles für Windows Metafiles enthalten im Gegensatz zu Enhanced Metafiles keine Angaben zur metrischen Größe des Metafiles (Größe in Zentimetern) und zum Seitenverhältnis zwischen Höhe und Breite. Daher verwenden nahezu alle Applikationen die Placeable-Metafiles, die typischerweise die Datei-Endung .WMF haben.

Placeable Metafiles haben im Vergleich zu Non-Placeable Matafiles einen zusätzlichen Header, der als METAFILEHEADER im Windows 3.1 API dokumentiert ist.

DaVinci kann Metafiles sowohl ohne dieses Header, als auch mit dem Header importieren. Da die Daten im Header im HMETAFILE-Handle nicht gespeichert werden können, werden sie in einer METARESOLUTION genannten Struktur zur Verfügung gestellt.

Nur die Angabe der METARESOLUTION - Struktur gemeinsam mit einem HMETAFILE-Handle ermöglicht die maßstabsgerechte Darstellung einer WMF-Datei.

-


Valid HTML 4.01!