如何将N个位图对象画到一个内存位图DC上

假如你定义了一个位图类,里面包含位图头,位图信息头,调色板,位图数据。然后你按照位图的格式将位图文件读入你的类中,现在你知道了位图的全部信息了。主要信息包含在位图信息头里面,数据则在位图数据缓冲里面。现在的问题是,在Windows下面如何将一张位图画出来,而且现在是如何从数据缓存里面绘画出位图。&&一般情况,我们都是直接绘制在dc里面,而不是绑定到子控件,让子控件自己绘画,比如picture控件之类的,我觉得提供绘制在dc里面的接口更具有广泛性。
&&现在我知道两种从内存数据绘制彩色位图的2种方法。第一种麻烦一点,第二种则相当直接。&&方法一:&&第一步,用CreateCompatibleDC创建跟目标dc的兼容性内存dc。&&第二步,用CreateCompatibleBitmap创建跟目标dc的兼容性位图。&&第三步,用SelectObject将第二步创建的兼容位图选入第一步创建的兼容dc中。&&第四步,用SetDIBits设置兼容位图的数据缓冲。&&第五步,用BitBlt将数据从兼容内存dc绘制到目标dc。&&第六步,删除兼容位图和兼容dc。&&代码如下,其中buffer代表位图数据缓冲。
HDC hCompatibleDC = CreateCompatibleDC(hDc);
HBITMAP hCompatibleBitmap = CreateCompatibleBitmap(hDc, bitmapinfoheader.biWidth,
bitmapinfoheader.biHeight);
HBITMAP hOldBitmap = (HBITMAP)SelectObject(hCompatibleDC, hCompatibleBitmap);
SetDIBits(hDc, hCompatibleBitmap, 0, bitmapinfoheader.biHeight,
buffer, (BITMAPINFO*)&bitmapinfoheader, DIB_RGB_COLORS);
BitBlt(hDc, nStartX, nStartY, bitmapinfoheader.biWidth, bitmapinfoheader.biHeight,
hCompatibleDC, 0, 0, SRCCOPY);
SelectObject(hCompatibleDC, hOldBitmap);
DeleteObject(hCompatibleDC);
DeleteObject(hCompatibleDC);
方法二:直接调用StretchDIBits绘制位图。
该函数功能相当强悍,似乎专为从内存数据绘制位图到dc而生。
函数原型如下:
int StretchDIBits(
// handle to DC
int XDest,
// x-coord of destination upper-left corner
int YDest,
// y-coord of destination upper-left corner
int nDestWidth,
// width of destination rectangle
int nDestHeight,
// height of destination rectangle
// x-coord of source upper-left corner
// y-coord of source upper-left corner
int nSrcWidth,
// width of source rectangle
int nSrcHeight,
// height of source rectangle
CONST VOID *lpBits,
// bitmap bits
CONST BITMAPINFO *lpBitsInfo, // bitmap data
UINT iUsage,
// usage options
DWORD dwRop
// raster operation code
使用也相当简单,调用
StretchDIBits(hDc, nStartX, nStartY, bitmapinfoheader.biWidth,
bitmapinfoheader.biHeight, 0, 0, bitmapinfoheader.biWidth,
bitmapinfoheader.biHeight, buffer, (BITMAPINFO*)&bitmapinfoheader,
DIB_RGB_COLORS, SRCCOPY);
http://www.cnblogs.com/lidabo/p/3542732.html
阅读(...) 评论()MFC关于多线程,多个内存DC绘制的问题
[问题点数:20分,结帖人ybin225]
MFC关于多线程,多个内存DC绘制的问题
[问题点数:20分,结帖人ybin225]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2011年 总版技术专家分年内排行榜第三2010年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第五
2014年11月 VC/MFC大版内专家分月排行榜第三
匿名用户不能发表回复!|怎么样把内存dc的上画的图形,透明输出在客户区dc上
[问题点数:20分,结帖人hufeikong]
怎么样把内存dc的上画的图形,透明输出在客户区dc上
[问题点数:20分,结帖人hufeikong]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2007年10月 VC/MFC大版内专家分月排行榜第二
2008年2月 VB大版内专家分月排行榜第一2003年4月 VC/MFC大版内专家分月排行榜第一2002年11月 VC/MFC大版内专家分月排行榜第一
2011年11月 VC/MFC大版内专家分月排行榜第二2008年3月 VB大版内专家分月排行榜第二2008年3月 硬件/嵌入开发大版内专家分月排行榜第二2003年4月 其他开发语言大版内专家分月排行榜第二2003年4月 VB大版内专家分月排行榜第二2003年3月 VB大版内专家分月排行榜第二
2013年2月 移动平台大版内专家分月排行榜第三
2012年4月 VC/MFC大版内专家分月排行榜第一
2012年5月 VC/MFC大版内专家分月排行榜第二2012年3月 VC/MFC大版内专家分月排行榜第二2011年7月 VC/MFC大版内专家分月排行榜第二2011年1月 VC/MFC大版内专家分月排行榜第二2010年12月 VC/MFC大版内专家分月排行榜第二2010年9月 VC/MFC大版内专家分月排行榜第二2010年6月 VC/MFC大版内专家分月排行榜第二2010年5月 VC/MFC大版内专家分月排行榜第二2010年4月 VC/MFC大版内专家分月排行榜第二
匿名用户不能发表回复!|当获得了DC的句柄,如何把DC上的区域保存到一个位图文件中?
[问题点数:100分,结帖人anystayisjk]
当获得了DC的句柄,如何把DC上的区域保存到一个位图文件中?
[问题点数:100分,结帖人anystayisjk]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2010年12月 VB大版内专家分月排行榜第二2010年11月 VB大版内专家分月排行榜第二2009年7月 VB大版内专家分月排行榜第二
2010年12月 VB大版内专家分月排行榜第二2010年11月 VB大版内专家分月排行榜第二2009年7月 VB大版内专家分月排行榜第二
匿名用户不能发表回复!|[GDI]如何将N个位图对象画到一个内存DC上?
[问题点数:40分,结帖人weiwuyuan]
[GDI]如何将N个位图对象画到一个内存DC上?
[问题点数:40分,结帖人weiwuyuan]
只显示楼主
取消只显示楼主
匿名用户不能发表回复!|}

我要回帖

更多关于 画图 无效的位图文件 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信