主页C++ Builder 资料C++ Builder 参考手册Pictures 图片TMetafile
C++ Builder 串口控件
C++ Builder 编程技巧
C++ Builder 操作指南
C++ Builder 参考手册
基础知识
cfloat 浮点数
cmath 数学函数
cstdlib 标准库函数
System 字符串
System 日期和时间
System.Math.hpp 数学函数
其他数据类型
VCL 基础类
VCL 应用程序
Pictures 图片
 • TBitmap
 • TGIFImage
 • TGraphic
 • TIcon
 • TJPEGImage
 • TMetafile
 • TPicture
 • TPngImage
 • TWICImage
Graphics 绘图
Additional 控件
System 控件
A ~ Z 字母顺序排列的目录
网友留言/技术支持
TMetafile - .emf (Win32 Enhanced metafile) 和 .wmf 图片 (Windows Metafile)

说明:

TMetafile: .emf (Win32 Enhanced metafile) 和 .wmf 图片 (Windows Metafile)

 

头文件:

#include <Vcl.Graphics.hpp> (XE2 之后),#include <Graphics.hpp> (XE 之前)

 

继承关系:

TObjectTPersistentTInterfacedPersistentTGraphicTMetafile

 

属性:

属性 类型 描述
public:    
CreatedBy UnicodeString 图片的作者,只读属性。
图片的作者需要在创建图片的时候,用 TMetafileCanvas 的构造函数的参数指定图片的作者和描述【例1:创建 emf 文件,设定作者和描述,单位换算关系
Description UnicodeString 图片的描述,只读属性。
图片的描述需要在创建图片的时候,用 TMetafileCanvas 的构造函数的参数指定图片的作者和描述【例1:创建 emf 文件,设定作者和描述,单位换算关系
Enhanced bool 是否为 emf (Win32 Enhanced metafile),可读写属性。
true: emf (Win32 Enhanced metafile), false: wmf (Windows Metafile)
默认值为 true。
Handle NativeUInt 图片 emf/wmf 的句柄,可读写属性,可以通过这个句柄使用 Windows API 函数来处理图片。
MMWidth int 以 0.01mm 为单位的图片宽度,emf/wmf 始终使用这个值作为图片的宽度,显示或打印的时候,通过 DC 的分辨率计算出适合于这个 DC 的大小【例1:创建 emf 文件,设定作者和描述,单位换算关系
MMHeight int 以 0.01mm 为单位的图片高度,emf/wmf 始终使用这个值作为图片的高度,显示或打印的时候,通过 DC 的分辨率计算出适合于这个 DC 的大小【例1:创建 emf 文件,设定作者和描述,单位换算关系
Inch Word 这是已经废弃的过时的属性。早期的 wmf 文件使用这个属性保存图片的分辨率,单位为 DPI (每英寸点数)。目前的文件显示始终是根据 DC 的分辨率来计算合适的大小。
TGraphic::   TGraphic 继承过来的
Empty bool 是否包含图像数据,只读。如果不包含图像数据,此属性为 true.
Height int 图像的高度,可读写,单位:像素 (pixels)
可以用 SetSize 方法同时修改宽度和高度
Modified bool 图像是否被修改过。如果被修改过,此属性为 true.
Palette HPALETTE 调色板句柄,可读写。如果图片没有或者不需要调色板,此值为 NULL
PaletteModified bool 调色板是否被修改过,如果被修改过,此属性值为 true.
Transparent bool 图像是否存在透明部分,可读写。
Width int 图像的宽度,可读写,单位:像素 (pixels)
可以用 SetSize 方法同时修改宽度和高度
SupportsPartialTransparency bool 是否支持半透明或 Alpha 通道,只读属性。

 

方法:

方法 描述
public:  
TMetafile __fastcall virtual TMetafile(void);
构造函数
~TMetafile __fastcall virtual ~TMetafile(void);
析构函数
Clear void __fastcall Clear(void);
创建新的图像,并且增加引用计数,销毁原来的图像。
HandleAllocated bool __fastcall HandleAllocated(void);
返回 Handle 属性是否分配了一个有效的句柄。由于读取 Handle 属性的时候,如果 Handle 没有分配有效的句柄,会自动分配一个,如果想知道目前 Handle 属性究竟是否分配了句柄,就需要用 HandleAllocated 函数判断,这个函数不会创建新的句柄。
LoadFromStream virtual void __fastcall LoadFromStream(System::Classes::TStream* Stream);
从流加载图像。
SaveToFile virtual void __fastcall SaveToFile(const System::UnicodeString Filename);
把当前图像储存为文件。
SaveToStream virtual void __fastcall SaveToStream(System::Classes::TStream* Stream);
把图像数据保存到流。
LoadFromClipboardFormat virtual void __fastcall LoadFromClipboardFormat(System::Word AFormat, NativeUInt AData, HPALETTE APalette);
从剪贴板加载图像数据,AFormat 为剪贴板数据格式,例如 CF_BITMAP,AData 为图像数据,APalette 为调色板句柄。【请参考 TBitmap 的例子:从剪贴板加载位图
SaveToClipboardFormat virtual void __fastcall SaveToClipboardFormat(System::Word &AFormat, NativeUInt &AData, HPALETTE &APalette);
把当前的图像数据转为剪贴板格式的数据,可以把这些数据放入剪贴板。
【请参考 TBitmap 的例子:把位图放在剪贴板里面
Assign virtual void __fastcall Assign(System::Classes::TPersistent* Source);
把 Source 里面的图像赋值 (或类型格式转换) 到当前图像。
ReleaseHandle NativeUInt __fastcall ReleaseHandle(void);
把 Handle 属性置为 NULL,让这个句柄和 TMetafile 脱离关系,返回值为原先的 Handle 属性值。
在给 Handle 属性赋值之前,调用 ReleaseHandle 方法不会丢失原来句柄所关联的资源。
SetSize virtual void __fastcall SetSize(int AWidth, int AHeight);
修改图像的大小为:宽度 = AWidth,高度 = AHeight,单位为像素 (pixels)
由于创建 emf/wmf 文件,始终使用以 mm 为单位的 MMWidth 和 MMHeight,SetSize 这个函数并没有实际的意义。【例1:创建 emf 文件,设定作者和描述,单位换算关系
TGraphic:: TGraphic 继承过来的
Equals virtual bool __fastcall Equals(System::TObject* Obj);
比较当前图像是否和 Obj 的图像数据相同。
LoadFromFile virtual void __fastcall LoadFromFile(const System::UnicodeString Filename);
从文件加载图像。
operator
_di_IStreamPersist()
operator System::Classes::_di_IStreamPersist()
{
  System::Classes::_di_IStreamPersist intf;
  this->GetInterface(intf);
  return intf;
}
类型转换操作符,转为 _di_IStreamPersist 类型。
protected:  
GetEmpty virtual bool __fastcall GetEmpty(void);
返回图像数据是否为空。
GetHeight virtual int __fastcall GetHeight(void);
返回图像的高度,单位:像素 (pixels)。
GetPalette virtual HPALETTE __fastcall GetPalette(void);
返回调色板句柄。
GetWidth virtual int __fastcall GetWidth(void);
返回图像的宽度,单位:像素 (pixels)。
Draw virtual void __fastcall Draw(TCanvas* ACanvas, const System::Types::TRect &Rect);
把当前图像数据显示到画布 ACanvas 的 Rect 位置。
ReadData virtual void __fastcall ReadData(System::Classes::TStream* Stream);
从 Stream 里面读取图像数据。
ReadEMFStream void __fastcall ReadEMFStream(System::Classes::TStream* Stream);
读取 emf 流
ReadWMFStream void __fastcall ReadWMFStream(System::Classes::TStream* Stream, int Length);
读取 wmf 流
SetHeight virtual void __fastcall SetHeight(int Value);
把图像高度修改为 Value,单位:像素 (pixels)
SetTransparent virtual void __fastcall SetTransparent(bool Value);
设为是否需要把图像显示为透明。
SetWidth virtual void __fastcall SetWidth(int Value);
把图像宽度修改为 Value,单位:像素 (pixels)
TestEMF bool __fastcall TestEMF(System::Classes::TStream* Stream);
检查流 Stream 里面的数据是否为 emf 数据,返回值:true: emf, false: wmf
WriteData virtual void __fastcall WriteData(System::Classes::TStream* Stream);
把图像数据写到 Stream 里面
WriteEMFStream void __fastcall WriteEMFStream(System::Classes::TStream* Stream);
把图像数据写入 emf 流
WriteWMFStream void __fastcall WriteWMFStream(System::Classes::TStream* Stream);
把图像数据写入 wmf 流
TGraphic:: TGraphic 继承过来的
Changed virtual void __fastcall Changed(System::TObject* Sender);
当图像数据被修改的时候,会自动调用 Changed 方法。
Changed 方法会把 Modified 属性置为 true,并且触发 OnChange 事件。
DefineProperties virtual void __fastcall DefineProperties(System::Classes::TFiler* Filer);
重载 TPersistent 的 DefineProperties,用于 ReadData 和 WriteData 方法读写流图像数据。
DrawTransparent virtual void __fastcall DrawTransparent(TCanvas* ACanvas, const System::Types::TRect &Rect, System::Byte Opacity);
把当前图像数据显示到画布 ACanvas 的 Rect 位置,和画布 Rect 位置原来的显示内容混合在一起,Opacity 为混合的比例,用来实现图像的透明效果,即 Opacity 为图像不透明的程度。
Equals HIDESBASE virtual bool __fastcall Equals(TGraphic* Graphic)/* overload */;
比较当前图像是否和 Obj 的图像数据相同。
GetTransparent virtual bool __fastcall GetTransparent(void);
返回图像是否存在透明部分。
Progress DYNAMIC void __fastcall Progress(System::TObject* Sender, TProgressStage Stage, System::Byte PercentDone, bool RedrawNow, const System::Types::TRect &R, const System::UnicodeString Msg);
当图像改变时 (加载、存储、转换的过程中),会调用这个方法来触发 OnProgress 事件。
SetPalette virtual void __fastcall SetPalette(HPALETTE Value);
调色板改为使用 Value 句柄的调色板。
GetSupportsPartialTransparency virtual bool __fastcall GetSupportsPartialTransparency(void);
返回是否支持半透明或 Alpha 通道。

 

事件:

事件 描述
public:  
TGraphic:: TGraphic 继承过来的
OnChange __property System::Classes::TNotifyEvent OnChange = {read=FOnChange, write=FOnChange};
• 当加载的图像发生变化时产生的事件,如果正在显示这个图片,需要刷新显示。
• 对于 gif 动画,需要显示下一帧的时候,会产生这个事件,需要在这个事件里面刷新显示
例:直接在画布上显示 gif 动画
OnProgress __property TProgressEvent OnProgress = {read=FOnProgress, write=FOnProgress};
当加载、存储、转换的过程中,会产生这个事件,表示这个过程的进度。

 

例1:创建 emf 文件,设定作者和描述,单位换算关系

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  std::auto_ptr<TMetafile>emf(new TMetafile);
  int iEmfWidth = 100; // 整个 emf 的宽度,单位:显示在屏幕上的像素个数 (pixels)
  int iEmfHeight = 80; // 整个 emf 的高度,单位:显示在屏幕上的像素个数 (pixels)
//emf->SetSize(iEmfWidth, iEmfHeight); // 这句注释掉了,创建 emf 时始终使用以 0.01mm 为单位的 MMWidth 和 MMHeight
//emf 显示的时候,会根据 MMWidth 和 MMHeight 与 DC 的分辨率计算出合适的大小 (或者说,换算为 DC 的 pixels)

  HDC hRefDC = GetDC(0); // 参考 DC 为显示屏 DC
  if(hRefDC)
   {
     try
      {
//      水平方向显示屏像素 (pixels) 与 0.01mm 单位之间的换算比例
        double HorzRes = GetDeviceCaps(hRefDC, HORZSIZE)*100.0 / (double)GetDeviceCaps(hRefDC, HORZRES);
//      垂直方向显示屏像素 (pixels) 与 0.01mm 单位之间的换算比例
        double VertRes = GetDeviceCaps(hRefDC, VERTSIZE)*100.0 / (double)GetDeviceCaps(hRefDC, VERTRES);

        emf->MMWidth  = iEmfWidth  * HorzRes + 0.5;  // emf 的宽度 (单位:0.01mm)
        emf->MMHeight = iEmfHeight * VertRes + 0.5;  // emf 的高度 (单位:0.01mm)

        std::auto_ptr<TMetafileCanvas>WmfCanvas(     // 自动指针 WmfCanvas
          new TMetafileCanvas(                       // 创建 Metafile 画布
          emf.get(),                                 // 是这个 emf 的画布
          hRefDC,                                    // 参考 DC
          L"Victor Chen",                            // emf 文件的作者
          L"http://www.cppfans.com/"));              // emf 文件的描述

        TRect rectWmf(0,0,iEmfWidth,iEmfHeight);     // 整个 emf 的大小 (单位:pixels)
        WmfCanvas->Brush->Style = bsSolid;           // 刷子的样式:实心儿的
        WmfCanvas->Brush->Color = clWhite;           // 刷子的颜色:白色
        WmfCanvas->FillRect(rectWmf);                // 填充整个 emf 为白色
        WmfCanvas->Brush->Style = bsClear;           // 刷子的样式:无色透明
        WmfCanvas->Pen->Color = clBlue;              // 画笔的颜色:蓝色
        WmfCanvas->Ellipse(rectWmf);                 // 用画笔在整个 emf 范围画一个椭圆
      }
     __finally
      {
        ReleaseDC(0, hRefDC);
      }
   }

  emf->SaveToFile(L"d:\\test.emf");                  // 保存文件 test.emf
}

 

相关链接:

jpg, gif, png, bmp 之间的格式转换
bmp 转 gif 图片和动画
显示 gif 图片和动画
gif 的每一帧提取出来,每一帧存为一个 bmp 图片
屏幕截图

◤上一页:TJPEGImage下一页:TPicture

C++ 爱好者 -- Victor Chen 的个人网站 www.cppfans.com 辽ICP备11016859号