BitBlt用法

在VC中显示位图常用取BitBlt()方法,它是将一幅位图从一个设备场景复制到另一个。源和目标DC相互间必须兼容。
虽然此方法的功能是这样的,但是我一直没有理解网上一些例子代码,不知道其用到的各DC和位图如何得到,及它们之间的关系。
今天工作中要将一些位图显示到窗口中,所以重要学习了一下。
我已经将要用的位图导入到工程资源中,所以我可以用:
        CBitmap cbmp;
        cbmp.LoadBitmap(IDB_BMP1);
这样得到一个CBitmap对象。
然后:
        BITMAP bitmap;
        cbmp.GetBitmap(&bitmap);
这样得到一个BITMAP对象,之所以要得到此对象是因为从其中可以得到位图的大小数据。
然后计算得到要在什么位置显示此位图(可以放在一个CRect rect;对象中)。

然后显示此位图,这是最重要的一步:
         CDC dcMemory;
         dcMemory.CreateCompatibleDC(pDC);
         hOldBitmap = dcMemory.SelectObject(&cbmp);
          pDC->BitBlt(rect.left,
                             rect.top,
                             bitmap.bmWidth,
                             bitmap.bmHeight,
                             &dcMemory,
                             0,0,
                             SRCCOPY);
其中pDC是一个CDC*,是将要在其中显示位图的设备环境。

这样位图就已经显示出来了,但是还要释放资源
        cbmp.DeleteObject();
        dcMemory.SelectObject(hOldBitmap);
        dcMemory.DeleteDC();
其中,要将临时设备环境选择入初始时位图,否则将不能正确释放!!

总结:
要在一个设备环境中显示位图,不能直接在上面“画”(目前我是我么觉得的),需要创建一个与之相兼容的新设备环境然后将位图选择入些新设备环境,然后再从些新设备环境中拷备位图以显示到正确的设备环境中。而选入这个动作相当与已经将位图“画在了临时设备环境中”(实际上并没有画,否则就可以直接选入要画图的CDC了),而且选入后位图在临时设备环境中的位置是左上角!

 转自:http://blog.tiantiansoft.com/user1/483/archives/2007/3360.html
MFC中的`BitBlt`函数是用于位图的显示和复制的函数。它的原型如下: ```cpp BOOL BitBlt( HDC hdcDest, // 目标DC的句柄 int nXDest, // 目标矩形左上角的x坐标 int nYDest, // 目标矩形左上角的y坐标 int nWidth, // 目标矩形的宽度 int nHeight, // 目标矩形的高度 HDC hdcSrc, // 源DC的句柄 int nXSrc, // 源矩形左上角的x坐标 int nYSrc, // 源矩形左上角的y坐标 DWORD dwRop // 光栅操作代码 ); ``` 其中,`hdcDest`和`hdcSrc`分别是目标DC和源DC的句柄,`nXDest`、`nYDest`、`nWidth`和`nHeight`描述了目标矩形的位置和大小,`nXSrc`和`nYSrc`描述了源矩形的位置,`dwRop`是光栅操作代码,控制复制操作的行为。 下面是一个简单的示例代码,演示了如何使用`BitBlt`函数复制一个位图: ```cpp CBitmap bmp; CDC dcMem; CRect rect; // 加载位图 bmp.LoadBitmap(IDB_BITMAP1); // 获取位图大小 bmp.GetBitmap(&bm); // 获取目标DC CClientDC dc(this); // 创建源DC dcMem.CreateCompatibleDC(&dc); // 选择位图到源DC中 CBitmap* pOldBitmap = dcMem.SelectObject(&bmp); // 获取目标区域 GetClientRect(&rect); // 复制位图到目标DC中 dc.BitBlt(0, 0, bm.bmWidth, bm.bmHeight, &dcMem, 0, 0, SRCCOPY); // 清理资源 dcMem.SelectObject(pOldBitmap); bmp.DeleteObject(); dcMem.DeleteDC(); ``` 在这个示例中,我们首先加载了一个位图,并获取了它的大小。然后,我们获取了目标DC,并创建了一个与之兼容的源DC。接着,我们选择位图到源DC中,并使用`BitBlt`函数将位图复制到目标DC中。最后,我们清理了资源。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值