Création d’un métafichier amélioré
Cette section contient un exemple qui illustre la création d’un métafichier amélioré stocké sur un disque, à l’aide d’un nom de fichier spécifié par l’utilisateur.
L’exemple utilise un contexte d’appareil pour la fenêtre d’application comme contexte d’appareil de référence. (Le système stocke les données de résolution de cet appareil dans l’en-tête du metafile amélioré.) L’application récupère un handle identifiant ce contexte d’appareil en appelant la fonction GetDC .
L’exemple utilise les dimensions de la zone cliente de l’application pour définir les dimensions du cadre d’image. À l’aide des dimensions de rectangle retournées par la fonction GetClientRect , l’application convertit les unités d’appareil en unités .01 millimètres et transmet les valeurs converties à la fonction CreateEnhMetaFile .
L’exemple montre comment afficher une boîte de dialogue Enregistrer sous courante qui permet à l’utilisateur de spécifier le nom de fichier du nouveau métafichier amélioré. Le système ajoute l’extension .emf à trois caractères à ce nom de fichier et transmet le nom à la fonction CreateEnhMetaFile .
L’exemple incorpore également une description textuelle de l’image dans l’en-tête enhanced-metafile. Cette description est spécifiée en tant que ressource dans la table de chaînes du fichier de ressources de l’application. Toutefois, dans une application de travail, cette chaîne est récupérée à partir d’un contrôle personnalisé dans une boîte de dialogue commune ou d’une boîte de dialogue distincte affichée uniquement à cet effet.
// Obtain a handle to a reference device context.
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 * iWidthMM * 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)/ 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 device context.
hdcMeta = CreateEnhMetaFile(hdcRef,
(LPTSTR) Ofn.lpstrFile,
&rect, (LPSTR)szDescription);
if (!hdcMeta)
errhandler("CreateEnhMetaFile", hWnd);
// Release the reference device context.
ReleaseDC(hWnd, hdcRef);