Re: Открытие метафайлов в Visual C
От: Archie Беларусь  
Дата: 18.01.02 13:47
Оценка: 8 (2)
Здравствуйте 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);
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.