⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 0507001.htm

📁 VC知识库5_chm_decompile_20040520_210715
💻 HTM
字号:
<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<title></title>
<link rel="stylesheet" type="text/css" href="../../vckbase.css">
</head>

<body>

<div align="justify">
  <table border="0" width="100%" class="font" height="57">
    <tr>
      <td width="27%" height="6" class="bigfont" bgcolor="#B8CFE7" align="center" bordercolor="#800080">
      <font color="#800080">VC知识库(五)</font>
      </td>
      <td width="73%" height="6" class="bigfont" bgcolor="#B8CFE7" align="center" bordercolor="#800080">
      <font color="#800080">www.vckbase.com</font>
      </td>
    </tr>
    <tr>
      <td width="100%" height="4" class="header" valign="top" align="center" colspan="2">
      <hr>
      </td>
    </tr>
    <tr>
      <td width="100%" height="17" class="header" valign="top" align="center" colspan="2">
      <FONT color=#0000c0>
      发掘Windows图元文件的应用价值</FONT>
      </td>
    </tr>
    <tr>
      <td width="100%" height="17" class="info" align="center" colspan="2">
      洛阳市洛轴集团汽摩公司 韩燕
      </td>  
    </tr>  
    <tr> 
      <td width="100%" height="22" class="font" colspan="2">
        <hr>
      </td>  
    </tr> 
    <tr> 
      <td width="100%" height="5" class="font" colspan="2"> 
      <CENTER><FONT color=#0000c0>
      </FONT>
      <p></CENTER>
      <FONT color=#ffffff>----</FONT> 
      说起图形文件的格式来,我相信大家都能如数家珍:bmp、gif、tif、jpg、psd……,但是,你听说过wmf格式吗?wmf格式有什么用途?由于介绍wmf格式及其应用的文章甚少,wmf格式就成了被大多数程序开发人员遗忘的角落。其实,wmf格式也有着它独特的优越性。本文从wmf格式是什么、wmf格式的特点、wmf格式的应用场合以及应用实例等方面作简单介绍。 </p>  
 
      <P><FONT color=#ffffff>----</FONT> <B>一、 wmf格式是什么?</B>  
      <P><FONT color=#ffffff>----</FONT> Wmf是Windows Metafile  
      的缩写,简称图元文件,它是微软公司定义的一种Windows平台下的图形文件格式。我们先来解释几个名词:  
      <P><FONT color=#ffffff>----</FONT> 图元文件头(metafile header):  
      是一个数据结构,它定义了储存在图元文件中图象的尺寸、图元文件的大小、调色板的数目、图元文件中记录数、指向图元文件描述的指针(如果存在的话)、指向图元文件调色板的指针(如果存在的话)。  
 
      <P><FONT color=#ffffff>----</FONT> 图元文件设备上下文(metafile DC):  
      是一个用户图元文件操作的设备上下文。  
      <P><FONT color=#ffffff>----</FONT> 图元文件句柄表(metafile handle table):  
      是标识用来建立存储在图元文件中的笔、刷子、字体以及其它对象的一组句柄。  
      <P><FONT color=#ffffff>----</FONT> 图元文件调色板(metafile palette):  
      是一组红、绿、蓝的值,这些值表示建立存储在图元文件中的图象时所使用的颜色。  
      <P><FONT color=#ffffff>----</FONT> 图元文件记录(metafile record):  
      是一个可变长的结构,结构中包含了诸如建立图象时设备的分辨率、图象的大小以及建立图象时所需要的GDI函数。  
      <P><FONT color=#ffffff>----</FONT> 有了上面的概念,我们就可以给wmf格式文件一个定义:  
      <P><FONT color=#ffffff>----</FONT>  
      图元文件是一个以二进制编码的、设备无关格式的多个结构的集合,这些结构包括图元文件头、调色板(可选的)、图元文件内容的文本描述(可选的)、图元文件记录。  
 
      <P><FONT color=#ffffff>----</FONT>  
      图元文件分为内存图元文件和磁盘图元文件。内存图元文件是仅在内存某一个区域进行操作并存放的,大多用于图象的绘制、拷贝或者进程间的剪切板图形共享;磁盘图元文件则主要用于将绘制图象保存到磁盘文件中,以便事后重看。  
 
      <P><FONT color=#ffffff>----</FONT> <B>二、 wmf格式的特点</B>  
      <P><FONT color=#ffffff>----</FONT> wmf格式文件的特点如下:  
      <P><FONT color=#ffffff>----</FONT> 1. wmf格式文件是Microsoft  
      Windows操作平台所支持的一种图形格式文件,目前,其它操作系统尚不支持这种格式,如Unix、Linux等。  
      <P><FONT color=#ffffff>----</FONT> 2.  
      与bmp格式不同,wmf格式文件是设备无关的,即它的输出特性不依赖于具体的输出设备。  
      <P><FONT color=#ffffff>----</FONT> 3. 其图象完全由Win32 API所拥有的GDI函数来完成。  
      <P><FONT color=#ffffff>----</FONT> 4. wmf格式文件所占的磁盘空间比其它任何格式的图形文件都要小得多。  
      <P><FONT color=#ffffff>----</FONT> 5.  
      在建立图元文件时,不能实现即画即得,而是将GDI调用记录在图元文件中,之后,在GDI环境中重新执行,才可显示图象。  
      <P><FONT color=#ffffff>----</FONT> 6.  
      显示图元文件的速度要比显示其它格式的图象文件慢,但是它形成图元文件的速度要远大于其它格式。  
      <P><FONT color=#ffffff>----</FONT> <B>三、 wmf格式的应用场合</B>  
      <P><FONT color=#ffffff>----</FONT> 由图元文件的特点,可知图元文件与其它格式的图象文件差别很大。  
      <P><FONT color=#ffffff>----</FONT>  
      首先,由于图元文件是以图象绘制操作序列来存放数据的,因此,它不适合于图象处理领域;其次,由于图元文件的图象显示速度慢,因此也不适合于需要快速显示的场合。  
 
      <P><FONT color=#ffffff>----</FONT>  
      但是,微软之所以设计了这种格式,自然有它独特的地方,这就是wmf格式文件所占的磁盘空间比其它任何格式的图形文件都要小得多。也就是说,只要用对场合,只这一条,便可击败所有格式无对手。  
 
      <P><FONT color=#ffffff>----</FONT> 一般地,图元文件的适用场合如下:  
      <P><FONT color=#ffffff>----</FONT> 1. 由采集数据绘制曲线的图象快速保存。  
      <P><FONT color=#ffffff>----</FONT> 2. 进程间的图象剪切板数据交换。  
      <P><FONT color=#ffffff>----</FONT> <B>四、 应用实例</B>  
      <P><FONT color=#ffffff>----</FONT> 由于篇幅所限,这里只针对图象的快速保存进行编程实践。  
      <P><FONT color=#ffffff>----</FONT> 1. 功能设计  
      <P><FONT color=#ffffff>----</FONT> (1) 建立图元文件  
      为减少程序篇幅,这里假设将产生的图元文件保存到一指定的文件名Myfile.wmf,另外,将图形假设为一正弦波。  
      <P><FONT color=#ffffff>----</FONT> (2) 显示图元文件  
      打开图元文件MyFile.wmf,将刚才产生的图形恢复到显示器上。  
      <P><FONT color=#ffffff>----</FONT> 2. 软件结构  
      <P><FONT color=#ffffff>----</FONT> 在Windows 98平台下,采用Visual C++ 6.0  
      开发工具,其软件结构使用MFC的单文档(SDI)框架。  
      <P><FONT color=#ffffff>----</FONT> 3. 程序实现  
      <P><FONT color=#ffffff>----</FONT> (1) 使用MFC AppWizard向导产生一应用框架  
      <P><FONT color=#ffffff>----</FONT>  
      在VC++的“File”菜单中,单击“New”,弹出一New对话框。在“Projects”页中选择“MFC AppWizard  
      [exe]”,在“Project name”编辑框中填入“MyWMF”,按“OK”按钮,退出New对话框。  
      <P><FONT color=#ffffff>----</FONT> 在“MFC AppWizard Step 1”对话框中选择单选钮“Single  
      document”,按“Finish”按钮即可完成应用框架的定制。  
      <P><FONT color=#ffffff>----</FONT> (2) 在视类的头文件MyWMFView.h中增加成员变量  
      <P><FONT color=#ffffff>----</FONT> HMETAFILE m_hMetaFile;  
      <P><FONT color=#ffffff>----</FONT> (3) 增加“建立图元文件”和“显示图元文件”菜单  
      <P><FONT color=#ffffff>----</FONT>  
      在“ResourceView”中,双击“Menu”下的“IDR_MAINFRAME”,在右边的窗口里,增加菜单“建立图元文件”,其标识为“ID_CREATEMETAFILE”;增加菜单“显示图元文件”,其标识为“ID_DISPMETAFILE”。  
 
      <P><FONT color=#ffffff>----</FONT> (4) 增加两个菜单所对应的消息处理函数  
      <P><FONT color=#ffffff>----</FONT> 在VC++的“New”菜单中,单击“ClassWizard”,弹出一“MFC  
      ClassWizard”对话框。在“Class Name”组合框中选择“CMyWMFView”,在“Object  
      IDs”列表框中选择“ID_CREATEMETAFILE”,在右边的“Messages”列表框中双击“COMMAND”,之后弹出一对话框,点击“OK”按钮,即建立了一个消息处理函数“OnCreateWMF()”;使用同样的方法建立“ID_DISPMETAFILE”的消息处理函数“OnDispWMF()”。  
 
      <P><FONT color=#ffffff>----</FONT> (5) 在视类的执行文件MyWMFView.cpp的开始中增加头文件定义  
      <P><FONT color=#ffffff>----</FONT> #include “math.h”  
      <P><FONT color=#ffffff>----</FONT> (5) 在消息处理函数“OnCreateWMF()”中增加代码如下:  
      <P><FONT color=#ffffff>----</FONT> <PRE>	//类CMetaFileDC的实例化
	CMetaFileDC metaFileDC;
	//建立图元的输出文件
	metaFileDC.Create(&quot;MyFile.wmf&quot;);
	//设置文本颜色和笔颜色
	metaFileDC.SetTextColor(RGB(255,0,0,));
	CPen thePen(PS_SOLID,1,RGB(0,0,255,));
	CPen * pOldPen=metaFileDC.SelectObject(&amp;thePen);
	//在图元文件中绘制矩形框
	metaFileDC.Rectangle(15, 15, 530, 230);
	//在图元文件中绘制正弦波
	for (int i=1; i&lt; 500; i++)
	{
		metaFileDC.MoveTo(20+i-1, 120-80*sin(0.1*(i-1)));
		metaFileDC.LineTo(20+i,   120-80*sin(0.1*i));
	}
	//在图元文件中绘制文本
	metaFileDC.TextOut(200,250,&quot;图6
  电机载荷正弦波曲线图&quot;);
	//恢复缺省的笔
	metaFileDC.SelectObject(pOldPen);
	//将以上绘制写入图元文件MyFile.wmf,关闭之,
最后返回图元文件的句柄
m_hMetaFile = metaFileDC.Close();

(6) 在消息处理函数“OnDispWMF()”中增加代码如下:
    //定义一个客户区设备上下文,用于显示图元文件
	CClientDC clientDC(this);
	//打开图元文件,返回图元文件句柄
	HMETAFILE hmf=GetMetaFile(&quot;MyFile.wmf”);
	//显示图元文件,再现所绘制的曲线
	clientDC.PlayMetaFile(hmf);
</PRE><FONT color=#ffffff>----</FONT> (7) 经过编译、链接,形成可执行文件 MyWMF.exe。  
      <P><FONT color=#ffffff>----</FONT>  
      使用时先点击菜单“建立图元文件”,即可发现,在当前文件夹下,生成一个新文件MyFile.wmf;然后,再点击菜单“显示图元文件”,即可在客户区显示一幅正弦波曲线。  
 
      <P><FONT color=#ffffff>----</FONT> <B>五、 结束语</B>  
      <P><FONT color=#ffffff>----</FONT>  
      虽然WMF格式其结构定义比较复杂,但通过上面的编程实践,可见其实现起来并不复杂。这主要得力于MFC将内部复杂的处理封装在CMetaFileDC类中,对这个类的正确使用,即可达到事半功倍的效果。另外,我们在比较某某图象格式时,不能一言以蔽之,武断地说某某好某某不好,而应该结合具体的应用场合。  
      </P>  
      </td>     
    </tr>    
    <tr> 
      <td width="100%" height="12" class="font" colspan="2">  
      </td>     
    </tr> 
    <tr> 
      <td width="100%" height="6" class="font" colspan="2">  
      </td>     
    </tr> 
    <tr> 
      <td width="100%" height="8" class="font" colspan="2">  
      </td>     
    </tr> 
    <tr>    
      <td width="100%" height="17" class="font" colspan="2"></td>     
    </tr>    
  </table>     
</div>     
     
</body>     
     
</html>     

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -