Herd Software Entwicklung
DaVinci Grafikbibliothek
DaVinci Dokumentation
MetafilesZur 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.
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.
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.
HDC hMeta = CreateMetaFile(NULL);
SetMapMode(hMeta, MM_ANISOTROPIC); SetWindowExtEx(hMeta, xx, yy, NULL); SetWindowOrgEx(hMeta, xx, yy, NULL);
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.
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);
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.