Вам нужно инициализировать структуру METAFILEPICT .
Минимальный пример:
if (hmf) {
DWORD nSize = GetMetaFileBitsEx( hmf, 0, NULL );
if (nSize) {
BYTE *lpvData = new BYTE[nSize];
if (lpvData) {
DWORD dw = GetMetaFileBitsEx( hmf, nSize, lpvData );
if (dw) {
// Fill out a METAFILEPICT structure
mp.mm = MM_ANISOTROPIC;
mp.xExt = 1000;
mp.yExt = 1000;
mp.hMF = NULL;
// Get a reference DC
hDC = GetDC( NULL );
// Make an enhanced metafile from the windows metafile
hemf = SetWinMetaFileBits( nSize, lpvData, hDC, &mp );
// Clean up
ReleaseDC( NULL, hDC );
}
delete[] lpvData;
}
DeleteMetaFile( hmf );
}
Мой тестовый код:
hdcMeta = CreateMetaFile(NULL);
hBrush = CreateSolidBrush(RGB(0, 0, 255));
Rectangle(hdcMeta, 0, 0, 100, 100);
MoveToEx(hdcMeta, 0, 0, NULL);
LineTo(hdcMeta, 100, 100);
MoveToEx(hdcMeta, 0, 100, NULL);
LineTo(hdcMeta, 100, 0);
SelectObject(hdcMeta, hBrush);
Ellipse(hdcMeta, 20, 20, 80, 80);
hmf = CloseMetaFile(hdcMeta);
UINT nSize = GetMetaFileBitsEx(hmf, 0, NULL);
Отладка:
Вы можете увидеть nSize = 114
Я подозреваю, что вы используете CreateMetaFileA
и CloseMetaFile
для прямой загрузки файлаНазывать и возвращать дескриптор метафайла в формате Windows - неверный способ.
Вы можете использовать другой способ преобразования:
EmfWin32::open( Inkscape::Extension::Input *mod, const gchar *uri )
{
EMF_CALLBACK_DATA d = {0};
gsize bytesRead = 0;
gsize bytesWritten = 0;
GError* error = NULL;
gchar *local_fn =
g_filename_from_utf8( uri, -1, &bytesRead, &bytesWritten, &error );
if (local_fn == NULL) {
return NULL;
}
d.outsvg = new Glib::ustring("");
d.path = new Glib::ustring("");
CHAR *ansi_uri = (CHAR *) local_fn;
gunichar2 *unicode_fn = g_utf8_to_utf16( local_fn, -1, NULL, NULL, NULL );
WCHAR *unicode_uri = (WCHAR *) unicode_fn;
// Try open as Enhanced Metafile
HENHMETAFILE hemf;
if (PrintWin32::is_os_wide())
hemf = GetEnhMetaFileW(unicode_uri);
else
hemf = GetEnhMetaFileA(ansi_uri);
METAFILEPICT mp;
HDC hDC;
if (hmf) {
DWORD nSize = GetMetaFileBitsEx( hmf, 0, NULL );
if (nSize) {
BYTE *lpvData = new BYTE[nSize];
if (lpvData) {
DWORD dw = GetMetaFileBitsEx( hmf, nSize, lpvData );
if (dw) {
// Fill out a METAFILEPICT structure
mp.mm = MM_ANISOTROPIC;
mp.xExt = 1000;
mp.yExt = 1000;
mp.hMF = NULL;
// Get a reference DC
hDC = GetDC( NULL );
// Make an enhanced metafile from the windows metafile
hemf = SetWinMetaFileBits( nSize, lpvData, hDC, &mp );
// Clean up
ReleaseDC( NULL, hDC );
}
delete[] lpvData;
}
DeleteMetaFile( hmf );
}
}
Для получения более подробной информации, пожалуйста, обратитесь к Эта ссылка.