代码改变世界

win32GDI函数BitBlt

2011-10-19 20:36  捣乱小子  阅读(3975)  评论(0编辑  收藏  举报

今天又充电了。

平时输出文字一般都是用textout或者drawtext。而今天遇到绘制绘图的问题,但是这个不能顾名思义的说直接在客户区draw就可以了,win32有特俗的处理方法。

要在一个设备环境中绘制位图,我们不能直接话,按msdn里面的说法,我们要创建一个与当前设备环境相兼容的另一个设备环境;将位图选入新创建的设备环境后,再调用bitblt函数来显示位图,bitblt就实现了将位图从新创建的设备环境中copy到当前的设备环境当中(from the specified source device context into a destination device context.这是msdn的原话)..

我还是有疑问的因为我知道怎么显示位图了,但是还是不知道如何去得到一个位图资源(学习需要这样).

如果在当前目录下,那好办直接loadbitmap就可以了;

如果在dll中就比较麻烦一点,可以参考下面的代码:

void DrawBitmap(HDC hdc,int xStart,int yStart,HBITMAP hBitmap)
{
	BITMAP bm;
	HDC hMemDC;
	POINT pt;

	hMemDC = ::CreateCompatibleDC(hdc);
	::SelectObject(hMemDC,hBitmap);
	::GetObject(hBitmap,sizeof(BITMAP),&bm);

	pt.x = bm.bmWidth;
	pt.y = bm.bmHeight;

	::BitBlt(hdc,xStart,yStart,pt.x,pt.y,hMemDC,0,0,SRCCOPY);

	::DeleteDC(hMemDC);
}

捣乱小子

温故而知新:

111107光棍节的前四天,复习了BitBlt,像上面所说的位图只能从一个设备环境拷贝到另一个设备环境当中,所以我们要创建另一个DC,也就是hMemDC。创建之后,我们要往这个环境当中放置位图,也就是selectobject(hMemDC,hBitmap);它会返回一个旧的位图句柄,GetObject其实就是根据句柄来找到资源的,这在win32当中再熟悉不过了。

传进的BITMAP就在其中更新了,于是得到了它的宽度和高度,找在BitBlt当中是要用到的。

至于BitBlt依次是是目标设备环境,显示位置,宽高,源设备环境,SRCCOPY(一般用这个mode)。

有两个位图显示的增强函数,一个是StretchBlt和TransparentBlt,具体的就不在这里讲解了。

今日温故,是因为笔者踏上了VC的路,即使学习路途比较陡峭,困难多多。

侯捷说过一句挺有意思的话,如果你没有看过MFC的源代码,那么恭喜你,你是一个快乐的程序员。