VC++实现View内容保存为图片的方法
本文实例讲述了VC++实现View内容保存为图片的方法。分享给大家供大家参考,具体如下:
我们在单文档应用程序中,经常需要将View中的内容保存为各种格式的图片文件,以便打印。乍一看,可能不知道从哪里下手,其实主要就是用到Bitmap的save方法,如:
HDChmemDC=::CreateCompatibleDC(hdc);
HBITMAPhBmp=::CreateCompatibleBitmap(hdc,destRect.Width(),destRect.Height());
HANDLEhOld=::SelectObject(hmemDC,hBmp);
Graphicsgraphic(hmemDC);
//下面进行各种文字、图形、图片的绘制…………………………………………….
Bitmapbitmap(hBmp,NULL);
CLSIDclsID;
//保存不同格式的(.jpg,bmp,png)的图片需要不同的CLSID,imageFormat为用户期望保存的图片格式
if(_T("jpg")==imageFormat.MakeLower())
{
GetEncoderClsid(_T("image/jpeg"),&clsID);
}
elseif(_T("bmp")==imageFormat.MakeLower())
{
GetEncoderClsid(_T("image/bmp"),&clsID);
}
elseif(_T("png")==imageFormat.MakeLower())
{
GetEncoderClsid(_T("image/png"),&clsID);
}
//保存为图片,strFN为图片保存的路径和文件名
bitmap.Save(strFN,&clsID,NULL);
::SelectObject(hmemDC,hOld);
::DeleteObject(hBmp);
::DeleteDC(hmemDC);
下面重要的就是获取不同图片格式的CLSID,看下面代码:
IntGetEncoderClsid(constTCHAR*format,CLSID*pClsid)
{
UINTnum=0;
UINTsize=0;
ImageCodecInfo*pImageCodecInfo=NULL;
GetImageEncodersSize(&num,&size);
if(size==0)
{
return-1;
}
pImageCodecInfo=(ImageCodecInfo*)(malloc(size));
if(pImageCodecInfo==NULL)
{
return-1;
}
GetImageEncoders(num,size,pImageCodecInfo);
for(UINTj=0;j<num;++j)
{
if(_tcscmp(pImageCodecInfo[j].MimeType,format)==0)
{
*pClsid=pImageCodecInfo[j].Clsid;
free(pImageCodecInfo);
returnj;
}
}
free(pImageCodecInfo);
return-1;
}
如果是直接打印View中的图片,那么View的OnDraw函数给的pDC指的就是打印机的纸张的尺寸,我们无需做太多的处理,我们只需要将当期View的区域转换到纸张的大小即可,如:
CRectrc;
GetClientRect(&rc);
Longwidth=0,height=0;
if(pDC->IsPrinting)
{
intxLogPixPerInch=pDC->GetDeviceCaps(LOGPIXELSX);
intyLogPixPerInch=pDC->GetDeviceCaps(LOGPIXELSY);
//得到设备坐标和逻辑坐标的比例
longxExt=(long)rc.width()*xLogPixPerInch/96;
longyExt=(long)rc.height()*yLogPixPerInch/96;
width=xExt;
height=yExt;
//后面使用GDI+进行绘图
HBITMAPhBmp=::CreateCompatibleBitmap(pDC->m_hDC,width,height);
HANDLEhOld=::SelectObject(hmemDC,hBmp);
Graphicstmp_graff(hmemDC);
…………………………………..
//获取纸张的大小,然后拉伸拷贝
intiPageWidth=pDC->GetDeviceCaps(HORZRES);
intiPageHeight=pDC->GetDeviceCaps(VERTRES);
::StretchBlt(pDC->m_hDC,0,0,iPageWidth,iPageHeight,hmemDC,0,0,width,height,SRCCOPY);::SelectObject(hmemDC,hOld);
::DeleteObject(hBmp);
::DeleteDC(hmemDC);
}
希望本文所述对大家VC++程序设计有所帮助。
热门推荐
5 短祝福语简短暖心
10 结婚祝福语粤语大全简短
11 晚上祝福语女生文案简短
12 法语妈妈生日祝福语简短
13 药厂开工祝福语大全简短
14 蛋糕节日祝福语简短英文
15 跨年的生日祝福语简短
16 文案祝福语英文短句简短
17 在家聚餐婚礼祝福语简短
18 学生节祝福语大全简短