CDC::CreateCompatibleDC 的整理(转)

来源:互联网 发布:系统备份软件 编辑:程序博客网 时间:2024/06/01 08:26

首先,DC 是表示设备环境上下文的意思,Windows是不允许程序员直接访问硬件的,它对屏幕的操作是通过环境设备,也就是DC来完成的。屏幕上的没一个窗口都对应一个DC,可以把DC想象成一个视频缓冲区,对这这个缓冲区的操作,会表现在这个缓冲区对应的屏幕窗口上。
在窗口的DC之外,可以建立自己的DC,就是说它不对应窗口,这个方法就是CreateCompatibleDC,这个DC就是一个内存缓冲区,通过这个DC你可以把和它兼容的窗口DC保存到这个DC中,就是说你可以通过它在不同的DC之间拷贝数据。例如:你先在这个DC中建立好数据,然后在拷贝到窗口的DC就是完成了这个窗口的刷新。

CreatCompatibleDC()创建了一个和当前屏幕的DC兼容的内存DC(DC就是设备上下文的意思,设备上下文就是当前的这个窗体的一些属性,譬如说他使用的画刷,画笔等等),在绘制位图的时候,你必须要在内存中建立这样的一个和当前设备的环境兼容的DC,也就是用这个函数建立,这样你才能把位图加载到这块内存里,然后在利用BitBlt函数将位图从内存复制到屏幕DC上,位图才能显示出来。这里涉及到一个概念:设备相关位图(DDB),设备无关位图(DIB)。GetDC()获取设备指针,该函数检索一指定窗口的客户区域或整个屏幕的显示设备上下文的句柄.以后可以在GDI函数中用该句柄绘图. 也就是取得设备上下文,供绘图或者其他的行为使用。

注:一般对于实现位图的显示时,常会用到CreatCompatibleDC()函数。

程序的实现:

void OnDraw(CDC* pDC){CDC MemDC; // 定义一个显示设备对象CBitMap  MemBitMap;//定义一个位图对象MemDC.CreatCompatibleDC(NULL);//创建一个与屏幕显示兼容的内存DC//注:这时还不能进行画图,因为还没有地方用来画图//下面建立一个与屏幕显示兼容的位图,至于位图的大小嘛,可以用窗口的大小,也可以自己定义(如:有滚动条时就要大于当前窗口的大小,在BitBlt时决定拷贝内存的哪部分到屏幕上)MemBitMap.CreateCompatibleBitmap(pDC, nWinth, nHeight); //这里可以自己创建自定义的位图,也可以通过LoadBitMap函数从资源中加载现成的位图。CBitmap *pOldBit = MemDC.selectObject(&MemBitMap);// 将与屏幕兼容的位图加载到内存DC中,这样内存DC 中就有地方用来画图了。//先用背景色将位图清除干净,这里我用的是白色作为背景你也可以用自己应该用的颜色MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255));//绘图MemDC.MoveTo(……);MemDC.LineTo(……);pDC->BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY);//将位图从内存DC中拷贝到屏幕上//最后记得将创建的GDI对象删除MemBitMap.DeleteObject()MemDC.DeleteObject()}

在这种情况下,假如你要对屏幕进行比较多的gdi函数操作,如果每一步操作都直接对屏幕dc进行操作,那出现的大多数可能性都是屏幕的闪烁。一个很好的解决方法就是使用内存dc,将这些操作全部先在内存dc上操作,然后一次性在屏幕上进行操作。

例如:如果你单单使用bitblt在屏幕上拷贝一个图,那可以直接使用屏幕的dc。但是如果你要先设置背景(fillrect)然后再bitblt的话,这就涉及到两个屏幕dc的操作,这样的话屏幕很容易闪烁。

[1]: http://ww.cnblogs.com/yangxx-1990/p/4962230.html
[2]: http://blog.csdn.net/sunnyorange/article/details/6590793

0 0
原创粉丝点击