Creating an Enhanced Metafile

This section contains an example that demonstrates the creation of an enhanced metafile that is stored on a disk, using a filename specified by the user.

The example uses a DC for the application window as the reference DC. (Windows stores the resolution data for this device in the enhanced-metafile's header.) The application retrieves a handle identifying this DC by calling the GetDC function.

The example uses the dimensions of the application's client area to define the dimensions of the picture frame. Using the rectangle dimensions returned by the GetClientRect function, the application converts the device units to .01-millimeter units and passes the converted values to the CreateEnhMetaFile function.

The example displays a Save As common dialog box that enables the user to specify the filename of the new enhanced metafile. The system appends the three-character .EMF extension to this filename and passes the name to the CreateEnhMetaFile function.

The example also embeds a text description of the picture in the enhanced-metafile header. This description is specified as a resource in the string table of the application's resource file. However, in a working application, this string would be retrieved from a custom control in a common dialog box or from a separate dialog box displayed solely for this purpose.

/* Obtain a handle to a reference DC. */

hdcRef = GetDC(hWnd);

/*

* Determine the picture frame dimensions.

* iWidthMM is the display width in millimeters.

* iHeightMM is the display height in millimeters.

* iWidthPels is the display width in pixels.

* iHeightPels is the display height in pixels

*/

iWidthMM = GetDeviceCaps(hdcRef, HORZSIZE);

iHeightMM = GetDeviceCaps(hdcRef, VERTSIZE);

iWidthPels = GetDeviceCaps(hdcRef, HORZRES);

iHeightPels = GetDeviceCaps(hdcRef, VERTRES);

/*

* Retrieve the coordinates of the client

* rectangle, in pixels.

*/

GetClientRect(hWnd, &rect);

/*

* Convert client coordinates to .01-mm units.

* Use iWidthMM, iWidthPels, iHeightMM, and

* iHeightPels to determine the number of

* .01-millimeter units per pixel in the x-

* and y-directions.

*/

rect.left = (rect.left * iWidthMM * 100)/iWidthPels;

rect.top = (rect.top * iHeightMM * 100)/iHeightPels;

rect.right = (rect.right * iiWidthMM * 100)/iWidthPels;

rect.bottom = (rect.bottom * iHeightMM * 100)/iHeightPels;

/* Load the filename filter from the string table. */

LoadString(hInst, IDS_FILTERSTRING,

(LPSTR)szFilter, sizeof(szFilter));

/*

* Replace the '%' separators that are embedded

* between the strings in the string-table entry

* with '\0'.

*/

for (i=0; szFilter[i]!='\0'; i++)

if (szFilter[i] == '%')

szFilter[i] = '\0';

/* Load the dialog title string from the table. */

LoadString(hInst, IDS_TITLESTRING,

(LPSTR)szTitle, sizeof(szTitle));

/* Initialize the OPENFILENAME members. */

szFile[0] = '\0';

Ofn.lStructSize = sizeof(OPENFILENAME);

Ofn.hwndOwner = hWnd;

Ofn.lpstrFilter = szFilter;

Ofn.lpstrFile= szFile;

Ofn.nMaxFile = sizeof(szFile);

Ofn.lpstrFileTitle = szFileTitle;

Ofn.nMaxFileTitle = sizeof(szFileTitle);

Ofn.lpstrInitialDir = (LPSTR)NULL;

Ofn.Flags = OFN_SHOWHELP | OFN_OVERWRITEPROMPT;

Ofn.lpstrTitle = szTitle;

/*

* Display the Filename common dialog box. The

* filename specified by the user is passed

* to the CreateEnhMetaFile function and used to

* store the metafile on disk.

*/

GetSaveFileName(&Ofn);

/* Load the description from the string table. */

LoadString(hInst, IDS_DESCRIPTIONSTRING,

(LPSTR)szDescription, sizeof(szDescription));

/*

* Replace the '%' string separators that are

* embedded between strings in the string-table

* entry with '\0'.

*/

for (i=0; szDescription[i]!='\0'; i++)

if (szDescription[i] == '%')

szDescription[i] = '\0';

/* Create the metafile DC. */

hdcMeta = CreateEnhMetaFile(hdcRef,

(LPTSTR) Ofn.lpstrFile,

&rect, (LPSTR)szDescription);

if (!hdcMeta)

errhandler("CreateEnhMetaFile", hWnd);

/* Release the reference DC. */

ReleaseDC(hWnd, hdcRef);