Die METARESOLUTION - Struktur enthält Zusatzangaben zu Windows MetaFiles über die Auflösung des MetaFiles (Größe in Millimetern und das Verhältnis zwischen Breite und Höhe). Diese Angaben sind in einer Windows MetaFile HMETAFILE leider nicht gespeichert und müssen daher von der Anwendung getrennt verwaltet werden. Das übliche Dateiformat mit der Kennung .WMF enthält dazu einen kleinen Header, der die in der METARESOLUTION-Struktur zusammengefassten Daten enthält.
Für Enhanced MetaFiles ist diese Struktur nicht notwendig, da die Anwendung die Auflösung mit der API Funktion GetEnhMetaFileHeader erfragen kann.
METARESOLUTION ist definiert in der Datei DAVINCI.H. Falls die importierte Datei eine Metafile-Datei ist (WMF, DXF oder von einem FLT-Filter) enthält diese Struktur Angaben über die Größe des Bildes in cm und das Seitenverhältnis zwischen Höhe und Breite.
typedef struct |
||
{ |
||
RECT |
bbox; |
|
WORD |
inch; |
|
char |
reserved[2]; |
|
} METARESOLUTION, *LPMETARESOLUTION; |
||
Die METARESOLUTION-Struktur hat folgende Felder: |
Zum Austausch zwischen Anwendungen bestimmte MetaFiles sollten immer den Skalierungsmodus MM_ANISOTROPIC verwenden und die Größe des logischen Koordinatensystems mit SetWindowExtEx und SetWindowOrgEx setzen.
Das Element bbox der METARESOLUTION-Struktur enthält üblicherweise dieselben Angaben wie die Angaben in SetWindowExtEx und SetWindowOrgEx, lediglich als RECT-Element formuliert.
METARESOLUTION in Pixel
Vor dem Abspielen eines MetaFiles muss die Anwendung mit SetViewportExtEx und SetViewportOrgEx die Größe des Ausgabebereiches im DC festlegen. Dazu müssen die Angaben in der METARESOLUTION-Struktur mit der Auflösung des Ausgabe-DCs in Pixel je Inch verrechnet werden. Obwohl die METARESOLUTION-Struktur die Angabe von Auflösung und Position eines MetaFiles zuläßt, wird die Zielkoordinate meist von der Anwendung vorgegegeben.
Beispiel: Ausgabe auf einen Drucker.
LPMETARESOLUTION lpmr;
HDC hPrinterDC;
RECT rcPrinter;
POINT PrinterPixelPerInch;
PrinterPixelPerInch.x = GetDeviceCaps(hPrinterDC, LOGPIXELSX);
PrinterPixelPerInch.y = GetDeviceCaps(hPrinterDC, LOGPIXELSY);
rcPrinter.left = MulDiv( PrinterPixelPerInch.x, lpmr->bbox.left , lpmr->inch);
rcPrinter.top = MulDiv( PrinterPixelPerInch.y, lpmr->bbox.top , lpmr->inch);
rcPrinter.right = MulDiv( PrinterPixelPerInch.x, lpmr->bbox.right , lpmr->inch);
rcPrinter.bottom = MulDiv( PrinterPixelPerInch.y, lpmr->bbox.bottom, lpmr->inch);
SetMapMode(hPrinterDC, MM_ANISOTROPIC);
SetViewportExtEx(hPrinterDC, rcPrinter.right-rcPrinter.left, rcPrinter.bottom-rcPrinter.top, NULL);
SetViewportOrgEx(hPrinterDC, rcPrinter.left , rcPrinter.top , NULL);
Die Auflösungsangaben in der METARESOLUTION Struktur sind in Pixel je Inch gespeichert. Beim Umrechnen muss berücksichtigt werden, dass ein Inch = 25.4 Millimeter entspricht.
Beispiel: Umrechnung in 1/10 Millimeter
SIZE size10mm;
size10mm.cx = MulDiv( lpmr->bbox.right-lpmr->bbox.left, 254, lpmr->inch);
size10mm.cy = MulDiv( lpmr->bbox.bottom-lpmr->bbox.top, 254, lpmr->inch);