향상된 메타파일 만들기
이 섹션에는 사용자가 지정한 파일 이름을 사용하여 디스크에 저장된 향상된 메타파일을 만드는 방법을 보여 주는 예제가 포함되어 있습니다.
이 예제에서는 애플리케이션 창에 대한 디바이스 컨텍스트를 참조 디바이스 컨텍스트로 사용합니다. (시스템은 이 디바이스의 해상도 데이터를 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);