Windows 图形编程:位图与元文件

Windows编程中,图形的表示和处理是常见的需求。图形文件可以通过两种主要方式来描述:位图('*.bmp')和元文件('*.wmf' 或 '*.emf')。位图通过描述每个像素点的颜色来表示图像,而元文件则使用复杂的指令集,如线条或圆形,来描述如何绘制图像。

Windows系统中,WMF或EMF文件直接使用GDI(图形设备接口)的指令集。当元文件被显示或隐藏时,GDI指令链将按照向量指定的顺序逐个调用命令,以确定每个图形元素的位置。由于向量很容易缩放,因此元文件图像可以很容易地进行缩放而不会丢失信息。这是元文件的一个重要优势。另一个优势是,如果图像不太复杂,元文件的内存使用量相对较低。因此,对于简单描述的图像,使用元文件而不是位图是一个很好的选择。

那么,在Windows编程中如何实现这一点呢?MFC(Microsoft Foundation Classes)提供了一个名为CStatic的控件,它支持元文件。通过调用方法SetEnhMetaFile(HENHMETAFILE hMetaFile),可以选择元文件并在每次显示控件时播放,同时将其大小缩放到控件的框架内。唯一的问题是:元文件的句柄从何而来?要生成元文件,需要一个标准的绘图程序。大多数绘图程序都可以导出到EMF文件格式。这个文件可以在MFC项目中作为自定义资源导入,例如作为'emf'资源。在运行时,像任何资源一样,必须通过其标识符定位元文件资源,并将其加载到进程的内存上下文中。

示例类CEnhMetaFileCtrl及其方法SetEnhMetaFileToCtrl(UINT metaID, HMODULE hModule/*= NULL*/)展示了如何实现这一点。该类相应地扩展了CStatic。

class CEnhMetaFileCtrl : public CStatic { public: CEnhMetaFileCtrl(); virtual ~CEnhMetaFileCtrl(); BOOL SetEnhMetaFileToCtrl(UINT metaID, HMODULE hModule = NULL); protected: HENHMETAFILE m_hMetaFile; }; CEnhMetaFileCtrl::CEnhMetaFileCtrl() { m_hMetaFile = NULL; } CEnhMetaFileCtrl::~CEnhMetaFileCtrl() { if (m_hMetaFile) DeleteEnhMetaFile(m_hMetaFile); } BOOL CEnhMetaFileCtrl::SetEnhMetaFileToCtrl(UINT metaID, HMODULE hModule) { HRSRC hRes = FindResource(hModule, MAKEINTRESOURCE(metaID), L"EMF"); if (!hRes) return FALSE; HGLOBAL hMeta = LoadResource(hModule, hRes); if (!hMeta) return FALSE; BYTE* pData = (BYTE*)GlobalLock(hMeta); if (!pData) return FALSE; m_hMetaFile = SetEnhMetaFileBits(SizeofResource(hModule, hRes), pData); BOOL bRes = ModifyStyle(0, SS_ENHMETAFILE) // allow metafiles && SetEnhMetaFile(m_hMetaFile) != NULL; // set metafile GlobalUnlock(hMeta); return bRes; }

在上述代码中,CEnhMetaFileCtrl类通过FindResource函数查找资源,LoadResource函数加载资源,GlobalLock函数锁定资源,SetEnhMetaFileBits函数设置元文件的位图,最后通过ModifyStyle和SetEnhMetaFile函数将元文件设置到控件上。

通过这种方式,可以在Windows应用程序中灵活地使用元文件来显示图形,同时保持图形的质量和内存的高效使用。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485