WGF(windows graphic foundation)为windows下的gdi和gdiplus双缓冲绘图框架。框架在VC6.0下使用C++语言开发而成并以可扩展的MFC动态连接库形式提供,适用于windows操做系统。WGF为彻底开源的免费产品,能够用于任何商业的和非商业的用途。
WGF设计的目的是对windows下的gdi和gdiplus双缓冲绘图进行封装和优化。WGF封装了使用gdi和gdiplus进行双缓冲绘图的实现细节,使用框架进行双缓冲绘图时感受就像是在窗口上绘图同样。同时,WGF经过将绘图内容划分为静态场景和动态场景以及经过采用gdi和gdiplus混合绘图的方式对windows下的gdi和gdiplus绘图进行了优化。
html
WGF经过一个导出类CDBDraw实现了对双缓冲绘图的封装和优化。CDBDraw是一个很是简单的类,其只有3个导出的公有成员函数供外部进行调用,分别是初始化成员函数(init())、绘图成员函数(draw())和设置绘图区大小的成员函数(setRect())。这3个函数都是采用的__stdcall函数调用约定,关于这些函数的详细说明请参考源码中的注释,对于这些函数的使用方法请参考例程RobotField2D。CDBDraw类实现了对双缓冲绘图的隐藏,其在内部提供了保护类型的成员变量m_pDC和m_pGC分别用于gdi绘图和gdiplus绘图使用(m_pDC为一个CDC类对象,m_pGC为一个Graphics类对象)。在使用m_pDC和m_pGC进行绘图时,图形其实是被绘制在后备缓冲区中,可是CDBDraw类隐藏了双缓冲绘图中内存拷贝的细节以及对绘图过程当中的各种资源的释放都CDBDraw类进行了处理,用户能够不用担忧内存泄漏等问题。同时,CDBDraw类在接口成员函数Draw()中对静态场景和动态场景进行了处理以提升绘图的性能。CDBDraw类中Draw()成员函数的执行流程见图1 。编程
a)
WGF仅由一个导出类CDBDraw和一个非导出类CMemDC组成,属于轻量级的库。框架
b)
WGF以动态连接库的形式提供,能够方便的被其余的语言使用。函数
c)
WGF封装了双缓冲绘图的细节,用户只须要使用CDBDraw类中提供的成员变量m_pDC和m_pGC进行绘图,至于与双缓冲有关的内存拷贝和各种资源的释放等细节均由框架完成。优化
d)
在vc6.0使用gdiplus进行绘图时须要进行一系列的额外工做,包括包含头文件、导入库文件和gdiplus的启动(GdiplusStartup())和关闭(GdiplusShutdown())等。WGF对gdiplus的这些工做进行了封装,使用WGF并不须要进行gdiplus的任何配置便可直接进行gdiplus绘图。同时,CDBDraw类中提供的m_pDC和m_pGC为gdi和gdiplus混合绘图提供了便利。spa
e)
WGF对静态场景和动态场景采用了不一样的处理方式并经过gdi和gdiplus混合编程解决了gdiplus中低效的内存拷贝问题,使得采用WGF进行绘图的效率得以提高。效率的提高经过一个简单的试验可见一斑,即将drawStaticScene()虚函数中的绘图代码拷贝到drawDynamicScene()虚函数中,经过这一过程的先后对比发现拷贝后绘图程序的CPU占用率明显上升。
图1 绘图接口流程图
WGF源码及文档下载地址: