📄 11.4.2 元文件的保存与打开.txt
字号:
11 .4.2 元文件的保存与打开
接下来,我们希望把保存图形绘制命令的元文件保存为磁盘文件,以便在以后需要时
随时可以打开该文件,并在程序窗口中显示其中的图形内容。于是为 Graphic程序的
CGraphicView类分别添加【文件】子菜单下的【打开】和【保存】菜单命令的响应函数,
然后在这两个命令响应函数(分别为 OnFileOpen和 OnFileSave )中分别实现元文件的打
开和保存。
为了保存元文件,可以使用 CopyMetaFile函数,该函数的作用是把 Windows元文件
的内容复制到指定的文件。该函数的声明形式如下所示 :
m
HMETAFILE CopyMetaFile( HMETAFILE hmfSrc ,LPCTSTR lpszFile
CopyMetaFile函数有两个参数,含义分别如下所述 :
. hmfSrc
指定要复制的 Windows元文件的句柄:
. lpszFile
指定复制目标文件名称。我们在Graphic程序的 OnFileSave函数中添加如例 11-13所示的代码,以
实现元文件的保存。
例 11-13
void CGraphicView : :OnFileSave()
HMETAFILE hmetaFile;
hmetaFile=m_dcMetaFile.Close();
CopyMetaFile(hmetaFile, "meta.wmf" ) ;
m_dcMetaFile.Create() ;
DeleteMetaFile(hmetaFile) ;
在上述例 11-13所示代码中,首先定义一个 HMETAFILE类型的元文件句柄变量,接着调用元文件设
备上下文的 Close成员函数得到对应的元文件句柄,然后调用 CopyMetaFile函数将该元文件句柄所
指向的元文件中的内容复制到指定的磁盘文件: . meta.wmf中。对元文件来说,当把它的内容保存
为一个磁盘文件时,通常将其扩展名取为 "wmf",即 "Windows Meta File"的缩写。复制操作完成
之后,需要重新再创建一个元文件 DC,以备下一次绘制图形使用。这时,对于己得到的元文件句柄:
hmetaFile来说,它所标识的元文件就不再需要了,所以将其删除。
再次运行 Graphic程序,利用【绘图\直线】菜单项在程序窗口中绘制一条直线,然后利用【文件飞
保存】菜单命令保存元文件内容,这时可以发现 Graphic程序目录下多了一个文件: meta.wmf。
接下来在 Graphic程序中实现将刚才己保存的元文件打开这一功能。这时需要利用 GetMetaFile函
数得到指定元文件的句柄。在 Win32 API中己经废弃这个函数了, Win32 应用程序应该使用
GetEnhMetaFile函数创建一个增强型元文件句柄(关于增强型元文件的知识,读者可以自行查看
MSDN中的相关资料〉。但是在程序中仍可以使用 GetMetaFile这个函数来得到元文件句柄,这主要
是为了兼容 Windows的 16位版本。所以在 Graphic程序的 OnFileOpen函数中添加如例 11哺 14所
示代码,以实现元文件的打开。
侈IJ 11-14
void CGraphicView : :OnFileOpen()
HMETAFILE hmetaFile:
hmetaFile=GetMetaFile("meta.wmf");
m_dcMetaFile.PlayMetaFile(hmetaFile) ;
DeleteMetaFile(hmetaFile);
invalidate () ;
在上述例 11-14所示代码中,首先利用 GetMetaFile函数获得指定元文件: meta.wmf 的句柄。接着
就在元文件设备上下文中播放该元文件,这样,该元文件包含的图形绘制命令就被记录下来了。播
放之后,对于元文件句柄: hmetaFile来说,己经没有用处了,所以将其删除。上述代码的最后调用
Invalidate函数以引起窗口的重绘,这样程序就会调用 OnDraw函数。前面我们己经在 OnDraw函数
中调用当前窗口设备上下文 (pDC)的 PlayMetaFile函数在当前窗口中播放元文件,因此这时程序就
可以在当前窗口中显示该元文件包含的图形绘制命令的结果。
再次运行 Graphic程序,利用【文件飞打开】菜单命令即可打开先前保存的元文件,这时,在程序
窗口中可以看到先前绘制的图形(本例是一条直线)。这里再次强调,元文件保存的并不是图形数据,
而是图形绘制命令。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -