| Herd Software Entwicklung
|=
DaVinci Grafikbibliothek
|==
DaVinci Dokumentation Home Search Order


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 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, daß Schriften auf einem Drucker oder bei Detailvergrößerungen "Pixelig" wirken.

Nachteilig ist die Abhängigkeit des exakten Ausgabeergebnisses vom Gerätetreiber, so muß 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 (SetWindowExtExaus.

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, muß 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 muß daher zuvor mit SaveDC gespeichert und anschließend restauriert werden.

Um die Ausgabegröße festzulegen, verwendet die Anwendung die Funktion SetViewportExt 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ünstigen Eigenschaften:

Ungünstige Eigenschaften:

Placeable Metafiles

Die Windows-API-Funktionen CreateMetaFile und GETMETAFILE ermöglichen es zwar, Metafiles auf Dateiebene zu handhaben, jedoch beziehen sie sich auf Non-Placeable Metafiles. Diese haben sich im Zusammenhang mit größeren Windows-Applikationen aber NICHT durchgesetzt, da Angaben zur metrischen Größe des Metafiles (Größe in cm) und zum Seitenverhältnis zwischen Höhe und Breite fehlen. Stattdessen 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.