GDI 总结二: 位图的绘制

在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的传递

下面针对各种情况一一给出示例:

敢于奋斗的人,心中不怕困难。

GDI 总结二: 位图的绘制

相关文章:

你感兴趣的文章:

标签云: