3.5 Sample of Metafile Program Output

This section describes a sample program and the metafile that it creates. The sample program creates a small metafile that draws a purple rectangle with a green border and writes the words “Hello People” in the rectangle.

MakeAMetaFile(hDC)
HDC hDC;
{
    HPEN     hMetaGreenPen;
    HBRUSH   hMetaVioletBrush;
    HDC      hDCMeta;
    HANDLE   hMeta;

    /* Create the metafile with output going to the disk. */

    hDCMeta = CreateMetaFile( (LPSTR) "sample.met");

    hMetaGreenPen = CreatePen(0, 0, (DWORD) 0x0000FF00);
    SelectObject(hDCMeta, hMetaGreenPen);

    hMetaVioletBrush = CreateSolidBrush((DWORD) 0x00FF00FF);
    SelectObject(hDCMeta, hMetaVioletBrush);

    Rectangle(hDCMeta, 0, 0, 150, 70);

    TextOut(hDCMeta, 10, 10, (LPSTR) "Hello People", 12);

    /* We are done with the metafile. */

    hMeta = CloseMetaFile(hDCMeta);

    /* Play the metafile that we just created. */

    PlayMetaFile(hDC, hMeta);
}

The resulting metafile, SAMPLE.MET, consists of a metafile header and six records. It has the following binary form:

0001         mtType... disk metafile
0009         mtSize...
0300         mtVersion
0000 0036    mtSize
0002         mtNoObjects
0000 000C    mtMaxRecord
0000         mtNoParameters


0000 0008    rdSize
02FA         rdFunction (CreatePenIndirect function)
0000 0000 0000 0000 FF00  rdParm (LOGPEN structure defining pen)

0000 0004    rdSize
012D         rdFunction (SelectObject)
0000         rdParm (index to object #0... the above pen)

0000 0007    rdSize
02FC         rdFunction (CreateBrushIndirect)
0000 00FF 00FF 0000 rdParm (LOGBRUSH structure defining the brush)

0000 0004    rdSize
012D         rdFunction (SelectObject)
0001         rdParm (index to object #1... the brush)

0000 0007    rdSize
041B         rdFunction (Rectangle)
0046 0096 0000 0000 rdParm (parameters sent to Rectangle...
                    in reverse order)

0000 000C    rdSize
0521         rdFunction (TextOut)
rdParm
000C         count
string
48 65 6C 6C 6F 20 50 65 6F 70 6C 65   "Hello People"
000A             y-value
000A             x-value