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的源代码,那么恭喜你,你是一个快乐的程序员。