A Windows-format metafile must be converted to the enhanced format before it can be processed by the GetEnhMetaFile function. To convert the file, use the SetWinMetaFileBits function. SetWinMetaFileBits
The SetWinMetaFileBits function converts a metafile from the older Windows format to the new enhanced format and stores the new metafile in memory. HENHMETAFILE SetWinMetaFileBits(
  UINT cbBuffer,              // size of buffer
  CONST BYTE *lpbBuffer,      // metafile data buffer
  HDC hdcRef,                 // handle to reference DC
  CONST METAFILEPICT *lpmfp   // size of metafile picture
);
Parameters
cbBuffer 
[in] Specifies the size, in bytes, of the buffer that contains the Windows-format metafile. 
lpbBuffer 
[in] Pointer to a buffer that contains the Windows-format metafile data. (It is assumed that the data was obtained by using the GetMetaFileBitsEx or GetWinMetaFileBits function.) 
hdcRef 
[in] Handle to a reference device context. 
lpmfp 
[in] Pointer to a METAFILEPICT structure that contains the suggested size of the metafile picture and the mapping mode that was used when the picture was created. 
Return Values
If the function succeeds, the return value is a handle to a memory-based enhanced metafile.If the function fails, the return value is NULL. Windows NT/ 2000: To get extended error information, call GetLastError. Res
The Win32 API uses the reference device context's resolution data and the data in the METAFILEPICT structure to scale a picture. If the hdcRef parameter is NULL, the system uses resolution data for the current output device. If the lpmfp parameter is NULL, the system uses the MM_ANISOTROPIC mapping mode to scale the picture so that it fits the entire device surface. The hMF field in the METAFILEPICT structure is not used. When the application no longer needs the enhanced metafile handle, it should delete it by calling the DeleteEnhMetaFile function. The handle returned by this function can be used with other enhanced-metafile functions. If the reference device context is not identical to the device in which the metafile was originally created, some GDI functions that use device units may not draw the picture correctly. Requirements 
  Windows NT/2000: Requires Windows NT 3.1 or later.
  Windows 95/98: Requires Windows 95 or later.
  Header: Declared in Wingdi.h; include Windows.h.
  Library: Use Gdi32.lib.See Also
Metafiles Overview, Metafile Functions, DeleteEnhMetaFile, GetWinMetaFileBits, GetMetaFileBitsEx, METAFILEPICT, PlayEnhMetaFile Built on Thursday, May 11, 2000

解决方案 »

  1.   

    CFileDialog dlg() ;
    if ( dlg.DoModal() == IDOK )
    {
      char filename[255] ;
      strcpy( filename , dlg.GetPathName() );
      ShowWmf( filename ) ;
    }
    这样得到的filename是不是正确的
      

  2.   

    ::GetEnhMetaFile 只能打开EMF文件,不是WMF文件。要打开Windows 3.x格式的WMF文件需要使用::GetMetaFile打开WMF文件, 然后用::GetMetaFileBitsEx来读取里面的数据,然后再用::SetWinMetaFileBits来创建一个HENHMETAFILE句柄另外,大部分WMF并不是"Aldus Placeable Metafile"格式,这样用::GetMetaFile也读不出来(文件头不一样)Platform SDK里面有个MFEDIT sample(MultiMedia\GDI\Metafile), 里面演示了如果打开所有的metafiles。另外还有一个sample叫ENMETA,也可以参考一下(这个sample我没有找到:( )
      

  3.   

    http://support.microsoft.com/support/kb/articles/Q145/9/99.asp
    这里可以下载ENMETA.exe sample