Здравствуйте Elder, Вы писали:
E>Помогите, как открыть метафайлы (wmf) в Visual C++. Функция PlayMetafile() их не открывает (вернее открывает метафайлы, созданные функцией CopyMetafile(), а остальные не открывает, не смотря на то, что я и вырезаю у них первые 22 байта, как сказано).
а с каких это пор PlayMetafile начала открывать файлы ?
в общем вот пример
HENHMETAFILE hMetaFile;
METAHEADER wmfHeader;
METAFILEPICT wmfPict;
DWORD dwFileKey;
WORD *pwBuffer = NULL;
int nFileHandle;
if( (nFileHandle = _topen(strFileName, _O_BINARY | _O_RDONLY, _S_IREAD)) == -1 )
throw 1L;
if( !(_read(nFileHandle, &dwFileKey, sizeof(DWORD)) > 0 ) )
throw 1L;
if (dwFileKey == 0x9AC6CDD7)
{
if (_lseek(nFileHandle, 22L, SEEK_SET) == -1)
throw 2L;
if (!(_read(nFileHandle, &wmfHeader, sizeof(METAHEADER)) > 0 ))
throw 3L;
pwBuffer = new WORD[wmfHeader.mtSize];
if (pwBuffer == NULL)
throw 4L;
if (_lseek(nFileHandle, 22L, SEEK_SET) == -1)
throw 5L;
if (!(_read(nFileHandle, pwBuffer, wmfHeader.mtSize * sizeof(WORD)) > 0 ))
throw 6L;
memset(&wmfPict, 0, sizeof(METAFILEPICT));
wmfPict.mm = MM_HIENGLISH;
wmfPict.xExt = 1000; //rect.Width();
wmfPict.yExt = 1000; //abs(rect.Height());
wmfPict.hMF = SetMetaFileBitsEx(wmfHeader.mtSize * sizeof(WORD), (BYTE*) pwBuffer);
if (wmfPict.hMF == NULL) throw 7L;
hMetaFile = SetWinMetaFileBits(wmfHeader.mtSize * sizeof(WORD), (BYTE*) pwBuffer, 0, &wmfPict);
if (hMetaFile == NULL) throw 8L;
}
else
{
hMetaFile = GetEnhMetaFile(strFileName);
if (hMetaFile == NULL) throw 9L;
}
if( wmfPict.hMF )
DeleteMetaFile( wmfPict.hMF );
_close( nFileHandle );
if( pwBuffer != NULL )
delete [] pwBuffer;
// ... использование hMetaFile, например в
::DeleteEnhMetaFile(m_hMetaFile);