在GDI有一个特点: 就是所有的图片绘制,都是通过DC来完成的。DC之间是可以相互传递的。
两个DC之中的图形 通过DC—>DC 来相互传递信息。
无论
位图—>屏幕
位图—>位图
屏幕—->位图
屏幕—–>屏幕
他们所使用的都是DC–>DC之间的传递。
其关键点便是:
如何获得各自的DC
对于屏幕:
直接使用GetDC() ReleaseDC() 便可
::GetDC() 返回的是CDC*
对于图片:
CBitmap 不支持DC
CImage 获得DC
CImage img;img.Load(imageFilePath);CDC *pDC;pDC=CDC::FromHandle(img.GetDC());// use pDC hereimg.ReleaseDC();
注意:
::GetDC()返回的是CDC*
而CImage::GetDC()返回的HDC
对图像进行操作
::GetDC() 所获得的是屏幕的DC, 使用此DC ,可以对屏幕进行绘图。
如果我们想在某一个位图的基础上,再次绘图的话,便不能简单的使用::GetDC()了,因为它只是负责在屏幕上绘图。
那怎么办呢?
既然所有的绘图都是在DC上进行绘图,所以我们必须把这个位图选择进DC,这样对DC操作,就相当直接对位图进行操作
pDC->SelectObject(&bmp):
// use pDC to draw orthers in the bmp
构造内存DC
一般我们为了避免闪烁等现象,,需要构造内存DC ,然后再DC上进行绘制,绘制完毕后,通过DC之间的传递,将图像再绘制到屏幕中去。
CDC memDC; 只是创建了一个CDC对象,还没有创建DC资源
memDC.CreateCompatibleDC(pDC); 才是真正创建DC资源。
创建兼容DC是关键,其关键之处在于要创建的DC与哪个现有的DC兼容。
因为内存DC只是个中介,它必须要将其DC中的图像传递到其它DC中(目的DC),才会体现其价值。
而DC 与 DC之间可以传递信息的前提是:两DC是兼容的。
据此可知: 内存DC要兼容目的DC
如下例:
CBitmap bmp;bmp.LoadBitmap(IDI_BITMAP);CDC memDC;memDC.CreateCompatibleDC(pDC);memDC.SelectObject(&bmp);pDC->BitBlt(0,0,nWidth,nHeight,&memDC,0,0,SRCCOPY);
DC—>DC的传递
下面针对各种情况一一给出示例:
敢于奋斗的人,心中不怕困难。