建立增強型中繼檔
本節包含範例,示範如何使用使用者指定的檔案名,建立儲存在磁片上的增強型中繼檔。
此範例使用應用程式視窗的裝置內容做為參考裝置內容。 (系統會將此裝置的解析資料儲存在 enhanced-metafile 的標頭中。) 應用程式會藉由呼叫 GetDC 函式來擷取識別此裝置內容的控制碼。
此範例會使用應用程式工作區的維度來定義圖片框的維度。 使用 GetClientRect 函式所傳回的矩形維度,應用程式會將裝置單位轉換為 .01 公釐單位,並將轉換的值傳遞至 CreateEnhMetaFile 函式。
此範例會顯示 [ 另存新 檔] 通用對話方塊,讓使用者能夠指定新增強型中繼檔的檔案名。 系統會將三個字元的 .emf 副檔名附加至此檔案名,並將名稱傳遞至 CreateEnhMetaFile 函 式。
此範例也會在增強中繼檔標頭中內嵌圖片的文字描述。 此描述會指定為應用程式資源檔字串資料表中的資源。 不過,在工作應用程式中,此字串會從通用對話方塊中的自訂控制項擷取,或從僅針對此用途顯示的個別對話方塊擷取。
// 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);