设为首页 加入收藏

TOP

11.1.3 将设备上下文转换为位图
2013-10-07 00:11:15 来源: 作者: 【 】 浏览:66
Tags:11.1.3 设备 上下文 转换 位图

11.1.3  将设备上下文转换为位图

将设备上下文转换为位图就是将设备上下文中的内容保存成位图文件。
在前面的介绍中,读者已经了解了位图的文件结构。位图文件由位图文件头、位图信息头、调色板和位图数据组成。位图文件头是固定的结构,位图信息头及调色板可以通过CBitmap的GetBitmap方法获得,而对于位图数据可以GetDIBits方法获得,最后通过CFile对象创建位图文件,并将前面得到的数据写入文件中。

例如:
将设备上下文转换为位图的程序设计步骤如下。
ch1102实例位置:mr\11\sl\02
(1)创建一个基于单文档的应用程序。
(2)在视图类的OnDraw方法中将设备上下文中的内容保存成位图文件。代码如下:

void CCDCBMPView::OnDraw(CDC* pDC)
{
CCDCBMPDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDC->TextOut(100, 30,"弃我去者,昨日之日不可留;乱我心者,");
pDC->TextOut(60, 50,"今日之日多烦扰。长空万里送秋雁,对此可以");
pDC->TextOut(60, 70,"酣高楼。蓬莱文章建安骨,中间小谢又青发。");
pDC->TextOut(60, 90,"具怀逸兴壮思飞,欲上青天揽明月。抽刀断水");
pDC->TextOut(60,110,"水更流,举杯消愁愁更愁。人生在世不称意,");
pDC->TextOut(60,130,"明朝散发弄扁舟。");

CBitmap bmp;
bmp.CreateCompatibleBitmap(pDC,400,200);
CDC memDC;
memDC.CreateCompatibleDC(pDC);
memDC.SelectObject(&bmp);
memDC.BitBlt(0,0,400,200,pDC,0,0,SRCCOPY);

BITMAP bInfo;
bmp.GetBitmap(&bInfo);
int szPanel = 0;
if (bInfo.bmBitsPixel<16)
szPanel = pow(2,bInfo.bmBitsPixel)*sizeof(RGBQUAD);
BITMAPINFO* pBitInfo = (BITMAPINFO*) LocalAlloc(LPTR,sizeof(BITMAPINFO)+szPanel);
pBitInfo->bmiHeader.biBitCount = bInfo.bmBitsPixel;
pBitInfo->bmiHeader.biClrImportant = 0;
pBitInfo->bmiHeader.biCompression = 0;
pBitInfo->bmiHeader.biHeight = bInfo.bmHeight;
pBitInfo->bmiHeader.biPlanes = bInfo.bmPlanes;
pBitInfo->bmiHeader.biSize = sizeof(BITMAPINFO);
pBitInfo->bmiHeader.biSizeImage = bInfo.bmWidthBytes* bInfo.bmHeight;
pBitInfo->bmiHeader.biWidth = bInfo.bmWidth;
pBitInfo->bmiHeader.biXPelsPerMeter = 0;
pBitInfo->bmiHeader.biYPelsPerMeter = 0;

char* pData = new char[bInfo.bmWidthBytes*bInfo.bmHeight];
GetDIBits(memDC.m_hDC,bmp,0,bInfo.bmHeight,pData,pBitInfo,DIB_RGB_COLORS);

BITMAPFILEHEADER FileHeader;
FileHeader.bfType = 0x4d42; //BM
FileHeader.bfReserved1 = 0;
FileHeader.bfReserved2 = 0;
FileHeader.bfSize = sizeof(BITMAPFILEHEADER);
FileHeader.bfOffBits = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFO)+szPanel;

CFile file;
file.Open("E:\\bmp.bmp",CFile::modeCreate|CFile::modeReadWrite);
file.WriteHuge(&FileHeader,sizeof(BITMAPFILEHEADER));
file.WriteHuge(pBitInfo,sizeof(BITMAPINFO));
file.WriteHuge(pData,bInfo.bmWidthBytes*bInfo.bmHeight);
file.Close();

LocalFree(pBitInfo);
delete pData;
}

(3)运行程序,保存的位图文件如图11.2所示。

图11.2  将设备上下文转换为位图

【责任编辑:阚书 TEL:(010)68476606】

回书目   上一节   下一节

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇11.2.1 播放应用程序中的WAVE资源 下一篇11.3.2 播放Flash动画

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: