windows GDI+ 绘图的简单封装

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

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

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

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

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

封装的类:

class CDrawMethod
{
	HWND m_dlgHWND; //the handle of dialog window
	CDC *m_pDC;     //the device context of dialog
	CDC m_dcMem;    //the memory dc, to contain all the drawing than flush onto screen
	CBitmap m_bmpMem;  //bitmap bind to memory dc--m_dcMem 
	Gdiplus::Graphics* m_pGraph; //point to the object of Gdiplus
	
	CDrawMethod(HWND hwnd, CDC *pDC);
	~CDrawMethod();
	//call this func to init the member before any draw method
	int BeginDraw();
	//after all operate has been executed(drawn on memory DC), call this to draw on screen
	void DrawOnScreen();
	//call this func after all operate has done, free or release the resources, in case of memory leak
	int EndDraw();
	
	//save picture in memory DC to path as jpg file
	int SaveMemDCAsJPG(char* strPath);
	int SaveMemDCAsBMP(char* strPath);

	//return the memory bitmap member 
	CBitmap *GetMemBitmap();
	//return the memory DC member
	CDC *GetMemDC();
public:
	CRect m_rtClient;
};

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

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

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

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

使用示例:

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

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

上述代码绘图效果:


Demo源码等更多信息见原博客:

http://www.straka.cn/blog/encapsulate-gdi-draw-method/

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值