深入分析MFC之GDI原理透析

GDI阐述

GDI :Graph device interface  图形设备接口,应用程序调用图形编程的接口

为什么会使用GDI呢?

首先要理解显示器如何进行图像的显示,一般显示器把将要显示的内容存放在显存中(集成显卡一般使用内存,而独立显卡现在基本都使用独显),framebuffer就是用来存储显示的数据,由DMA自动读取数据将其显示在窗口中。而这里显示的只是一个个的像素点,通常是先显示一行的像素点,发出水平同步信号后,再显示下一行,当整个一屏幕的数据显示完全后,才会发出垂直同步信号,发出下一帧数据。

注意:这里显示任何图像,包括点,线,多边形,窗口等等,其实都是由像素一点点画出来的。

关键对于编程人员而言必须要懂得图形硬件接口的操作,就是必须懂得如何驱动底层,每当更换硬件或者升级硬件时,就需要重新写驱动接口,这对于上层应用的人而言,更无异于天灾人祸,因为很多上层开发人员并不懂得底层操作,而且底层图形设备千奇百怪,所以提供一个设备无关的接口是必须的。GDI就是这种有微软主推的图形接口,当然OpenGL等也可以的,现在主要探讨GDI,GDI其实也是一种二次封装,在底层驱动或者操作系统层次上的一个类库,SDK本身就提供了接口,而MFC又做了一次封装,使其操作更方便而起,而且更健壮。

注意:这里函数显示的时候并不是直接进行显示,而是将要显示的数据存储在设备描述表中处理好一个即将要显示的逻辑数据,然后再将此数据显示到窗口中,这样一来,可以处理字体,字型,颜色,不同窗口重叠显示等等

MFC如何使用GDI?

首先对于GDI而言,他并不是将图像直接显示在设备上,而是将显示的数据首先绘制在一个设备描述表DC中,这里面存储了显示图像的描述字段,包括物理设备和各种状态信息。画图前,先取得设备描述表句柄,然后再调用GDI输出函数进行输出并将句柄返回给GDI。

注意:其实GDI已经完成了数据流过程,就是将要显示的数据已经组织好,并放入指定位置,告诉DMA到这里取数据,然后显示。

MFC中只需先获取设备描述表对象指针,然后调用绘图函数即可。这又是什么意思呢?其实就是我要将数据流中间截断,把我想显示的数据放入,这样就可以输出我的数据。如何做呢?就是要获取数据流中对象,也就是设备描述表句柄,把他勾出来,使用他提供的函数进行绘制图像,然后把句柄再返回给GDI,有借有还再借不难,况且他人也要用这个句柄。看起来有点麻烦,其实MFC给我做好了的,CDC类直接将设备描述表和获取设备描述表句柄的GDI函数封装在一起了,我们只管使用。

那有那些设备描述句柄对象呢?

MFC提供了CDC类,如下一个例子

	CDC* pDC = GetDC();
	CRect rect;
	GetClientRect(&rect);
	pDC->DrawText(_T("hello MFC!"), &rect, DT_SINGLELINE| DT_CENTER | DT_VCENTER);
	ReleaseDC(pDC);
这里例子主要是显示一行数据”hello MFC“,这里声明了对象还需要释放,而GetDC只能在窗口客户区画图,GetWindowDC可以在窗口的任一地方画图,包括非客户区菜单栏,工具栏。另外在OnPaint函数中不能使用上面的获取和释放函数,使用如下的方式:
	PAINTSTRUCT ps;
	CDC *pDC = BeginPaint(&ps);
	pDC->Ellipse(100,100,400,400);
	EndPaint(&ps);

看到这里,发现获取方式设备描述表句柄好像多了,的确,幸亏MFC提供了如下分类的类:

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值