转自:http://hi.baidu.com//item/1a4e1b08e1c8d4cd73e676b2
CreateCompatibleDC
1,首先明白DC的含义,Windows不允许程序员直接访问硬件,它对屏幕的操作是通过环境设备,也就是DC来完成的。屏幕上的每一个窗口都对应一个DC,可以把DC想象成一个视频缓冲区,对这这个缓冲区的操作,会表现在这个缓冲区对应的屏幕窗口上。 在窗口的DC之外,可以建立自己的DC,就是说它不对应窗口,这个方法就是CreateCompatibleDC,这个DC就是一个内存缓冲区,通过这个DC你可以把和它兼容的窗口DC保存到这个DC中,就是说你可以通过它在不同的DC之间拷贝数据。例如:你先在这个DC中建立好数据,然后在拷贝到窗口的DC就是完成了这个窗口的刷新。 下面是一个代码段:不长 hDeskTop = GetDesktopWindow(); hDeskTopDC = GetDC(hDeskTop);//桌面窗口DC hMemDC = CreateCompatibleDC(hDeskTopDC);//这建立的就是与桌面窗口兼容的DC
2, 函数功能:该函数创建一个与指定设备兼容的内存设备上下文环境(DC)。
函数原型:HDC CreateCompatibleDC(HDC hdc);
参数:
hdc:现有设备上下文环境的句柄,如果该句柄为NULL,该函数创建一个与应用程序的当前显示器兼容的内存设备上下文环境。
返回值:如果成功,则返回内存设备上下文环境的句柄;如果失败,则返回值为NULL。
CreateCompatibleDc函数只适用于支持光栅操作的设备,应用程序可以通过调用GetDeviceCaps函数来确定一个设备是否支持这些操作。
当不再需要内存设备上下文环境时,可调用DeleteDc函数删除它。
gdi在sdk应该是很重要的东西,不过嘛自己的水平实在是不怎么够品。长久以来一直都没有认识到 CreateCompatibleDC 的用途到底在这里,不过还好从知道这个东西数起的200天内,我终于还是晓得一些关于这个函数或者说内存dc存在的意义了。
在这种情况下,假如你要对屏幕进行比较多的gdi函数操作,如果每一步操作都直接对屏幕dc进行操作,那出现的大多数可能性都是屏幕的闪烁。一个很好的解决方法就是使用内存dc,将这些操作全部先在内存dc上操作,然后依次性在屏幕上进行操作。
例如:如果你单单使用bitblt在屏幕上拷贝一个图,那可以直接使用屏幕的dc。但是如果你要先设置背景(fillrect)然后再bitblt的话,这就涉及到两个屏幕dc的操作,这样的话屏幕很容易闪烁。
3,CreatCompatibleDC()创建了一个和当前屏幕的DC兼容的内存DC(DC就是设备上下文的意思,设备上下文就是当前的这个窗体的一些属性,譬如说他使用的画刷,画笔等等),在绘制位图的时候,你必须要在内存中建立这样的一个和当前设备的环境兼容的DC,也就是用这个函数建立,这样你才能把位图加载到这块内存里,然后在利用BitBlt函数将位图从内存复制到屏幕DC上,位图才能显示出来。这里涉及到一个概念:设备相关位图(DDB),设备无关位图(DIB)。GetDC()获取设备指针,该函数检索一指定窗口的客户区域或整个屏幕的显示设备上下文的句柄.以后可以在GDI函数中用该句柄绘图. 也就是取得设备上下文,供绘图或者其他的行为使用
转载于:https://www.cnblogs.com/wuguoqiang/p/6650484.html
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/222373.html原文链接:https://javaforall.net
