Encapsulating the GDI+ drawing methods

windows GDI+ 绘图的简单封装

Brief: A simple package of GDI+ drawing methods makes the drawing in mfc much easier.

由于用mfc经常需要在界面上进行一些绘制输出,所以用windows GDI比较多,但是用windowsGDI 绘图比较麻烦,刚开始学的时候还经常弄不清一堆DC, Object, HANDLE到底是干啥的。后来就琢磨清楚了,但为了用起来更方便,就弄个类,这样画什么就直接调对应的函数和常用的控制参数,比如大小位置颜色,而不需要自己去操控上下文、绘制画笔画刷等等麻烦事,而且一个函数完成一个简单图形的绘制,后面又学了gdi+,就重写了部分函数实现,用了更简单的方式完成。

为了避免闪烁,这里用了双缓存的原理,其实就是相当于在内存里开辟空间画完后在显示在屏幕上。至于闪烁的缘由,在我的另一篇博文里面有浅浅的探究:http://www.straka.cn/blog/flickering-in-mfc/

这里也不得不指明这么做是有损效率的,因为期间会重复创建和销毁画笔画刷等对象。但对于多数应用场景,这个损失是可以接受的。

要使用GDI+(Graphics device interface),要做些铺垫工作,

一般为了方便在应用程序的实例初始化阶段就可以把gdiplus一起初始化了,然后实现ExitInstance虚函数,在其中释放使用gdiplus所占的资源。

封装的类:

主要的成员和函数都在上述代码中列出,使用的话每次新建类实例,传入对话框句柄HANDLE和设备上下文DC,然后调用BeginDraw()初始化,等全部函数执行完毕,再调用DrawOnScreen()画到屏幕上,最后EndDraw()释放资源。如果需要更进一步的操作可以用GetMemBitmap() 和 GetMemDC()方法取得内存位图和画布进一步操作。但是注意这里的指针是指向成员的,用完不可释放,类内部管理。如果画完不需要显示在显示器上也可以用SaveMemDCAsJPG 和 SaveMemDCAsBMP 函数输出到文件。

而具体承担绘图任务的函数是自定义可以添加的:

我就把常用的一些添加了进来,画矩形、椭圆形、多边形框、及填充矩形、椭圆形、多边形内部、画矩形、椭圆形阴影,画圆角矩形、画立方体,绘制图片,以及输出文字。

其中画矩形阴影实现就是画了尺寸稍大的多个矩形,这种比较简单,当然也有别的处理方法,根据大家需要另外添加函数即可。

使用示例:

在对话框OnPaint函数中添加代码:

在第11行处添加画图代码,比如:

上述代码绘图效果:

代码下载:

GDIDemo

https://github.com/atp798/BlogStraka/

发表评论