Я пытаюсь создать расширенный метафайл, например:
// Obtain a handle to a reference device context.
HDC hdcRef = GetDC(hwnd);
// Determine the picture frame dimensions.
int iWidthMM = GetDeviceCaps(hdcRef, HORZSIZE);
int iHeightMM = GetDeviceCaps(hdcRef, VERTSIZE);
int iWidthPels = GetDeviceCaps(hdcRef, HORZRES);
int iHeightPels = GetDeviceCaps(hdcRef, VERTRES);
// Retrieve the coordinates of the client
// rectangle, in pixels.
RECT rect;
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;
// Create the metafile device context.
CreateEnhMetaFile(hdcRef, (LPTSTR)"temp.emf", &rect, NULL);
// Release the reference device context.
ReleaseDC(hwnd, hdcRef);
Взял здесь код
Все, что у меня получилось, - это 0-байтовый файл без расширения с странно закодированным именем, smth, как 整 灭 攮 晭.
В чем проблема?
PS Кроме того, я вызываю его в смешанном режиме, из С# через объект c++/cli.
EDIT Проблема со странным кодированием решена, но созданный файл все еще имеет длину 0 байт. Как это можно решить?
Бросок является проблемой, не используйте броски, если вам действительно не нужно.
Удивительно, что вы получили эту акцию с веб-сайта Microsoft! Вы должны задуматься о качестве проката людей MS. Но в их коде это не ошибка просто лишняя. Когда вы переводите его на свой код, это неправильно.
CreateEnhMetaFile(hdcRef, _T("temp.emf"), &rect, NULL);
Макрос _T
является официальным способом записи строкового литерала, который будет интерпретироваться как строка Unicode или строка ANSI в зависимости от ваших параметров компилятора.