关于兼容位图DDB的使用疑问,请各位帮帮忙

snmhm1991 2013-10-16 04:08:10
我有如下的一些代码:

CRect deskRect;
GetDesktopWindow()->GetWindowRect(deskRect);

HDC deskDC=::GetDC(NULL);
HDC memDC=::CreateCompatibleDC(deskDC);
HBITMAP hBmp=CreateCompatibleBitmap(deskDC,deskRect.Width(),deskRect.Height());
SelectObject(memDC,hBmp);
BitBlt(memDC,0,0,deskRect.Width(),deskRect.Height(),deskDC,0,0,SRCCOPY);

上面的代码在兼容DC及兼容位图上画出了屏幕的区域,创建并对兼容位图做图后现在我想在其他地方继续使用这个DDB,如下代码:

CDC* hDC=GetDC();
CDC memDC2;
memDC2.CreateCompatibleDC(hDC);
memDC2.SelectObject(hBmp);
hDC->BitBlt(0,0,500,400,&memDC2,0,0,SRCCOPY);

下面的这段代码又将兼容位图选入另一个兼容DC画到上前窗口上,为何这样做没有图像?
此时通过
BITMAP bm;
GetObject(hBmp,sizeof(BITMAP),&bm);取得hbmp的bmBits为NULL

虽然上面的代码看上去没什么用,不过我是想让兼容位图可以得到复用,以便传到其他地方使用,但是这样简单地做显示是不行的。

然后我又查看了一些资料说是将DDB转化为DIB,网上流传了一个名为DDBToDIB()的函数我也用过,但是仍然没用。

请问大家有没有解决这个问题的好的方法?关键是要让兼容位图可被重复使用
...全文
99 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
lm_whales 2013-11-02
  • 打赏
  • 举报
回复
DDB没有分辨率参数。 只有像素信息。 这是二者的差别。 DIB有分辨率参数。 一个图像具体的宽度,高度是可以计算的。 即宽若干厘米,高若干厘米。 所以称为设备无关位图。 DDB得到宽度,高度有多少像素,所以叫设备相关位图。 只要添加设备的分辨率信息,DDB基本上就可以看作DIB了 具体转换,就是 读取DDB像素,调色板信息。 然后求出设备分辨率. 然后,就可以按照DIB存储了。
snmhm1991 2013-10-16
  • 打赏
  • 举报
回复
有人吗?快进来回帖领分吧,送分了
snmhm1991 2013-10-16
  • 打赏
  • 举报
回复
问题解决,自己想得太麻烦了,直接把上面的 SelectObject(memDC,hBmp); 使用完成后再选入原来的对象就可以了, HBITMAP oldBitmap=SelectObject(memDC,hBmp); 使用完成后 SelectObject(memDC,oldBitmap); 重新选入以前的对象后将会使目标对象脱离设备上下文,其他设备就可以继续使用这个位图对象
snmhm1991 2013-10-16
  • 打赏
  • 举报
回复
自己顶一下,麻烦大家帮帮忙

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧