当前位置:编程学习 > VC++ >>

VC中将控件保存成图片&&VC中利用GDI+在控件上绘图,把图像保存成图片

一、VC中将控件保存成图片
/***
*函数功能:将VC中将控件保存成图片
*
***/
void OnBtnPRINT()
{
 // TODO: Add your control notification handler code here
 
 CClientDC SHDC(m_graph.GetDlgItem(IDC_CWG));//CClientDC中传递的参数为控件CWnd指针;如果打印的图片是当前控件对象,其参数为this
 CDC memDC;
 CRect rect;
 m_graph.GetClientRect(rect);//获取控件区域大小
 //GetClientRect(rect);//获取当前控件区域大小
 m_graph.ClientToScreen(&rect);//将控件区域大小转换成其在父窗口中的相对位置;如果打印的图片是当前控件对象,这段代码去掉
 memDC.CreateCompatibleDC(&SHDC);
 CBitmap bm;
 int Width=rect.Width();
 int Height=rect.Height();
 bm.CreateCompatibleBitmap(&SHDC,Width,Height);
 CBitmap *pOld=memDC.SelectObject(&bm);
 memDC.BitBlt(-rect.left,-rect.top,Width+rect.left,Height+rect.top,&SHDC,0,0,SRCCOPY);//传递的参数为控件在其父窗口的相对位置,做相应调整就能满足要求
 //memDC.BitBlt(0,0,Width,Height,&SHDC,0,0,SRCCOPY);//打印的图片是当前控件对象
 memDC.SelectObject(pOld);
 BITMAP btm;
 bm.GetBitmap(&btm);
 DWORD size=btm.bmWidthBytes*btm.bmHeight;
 LPSTR lpData=(LPSTR)GlobalAllocPtr(GPTR,size);
 BITMAPFILEHEADER bfh;
 BITMAPINFOHEADER bih;
 bih.biBitCount=btm.bmBitsPixel;
 bih.biClrImportant=0;
 bih.biClrUsed=0;
 bih.biCompression=0;
 bih.biHeight=btm.bmHeight;
 bih.biPlanes=1;
 bih.biSize=sizeof(BITMAPINFOHEADER);
 bih.biSizeImage=size;
 bih.biWidth=btm.bmWidth;
 bih.biXPelsPerMeter=0;
 bih.biYPelsPerMeter=0;
 GetDIBits(SHDC,bm,0,bih.biHeight,lpData,(BITMAPINFO*)&bih,DIB_RGB_COLORS);
 bfh.bfReserved1=bfh.bfReserved2=0;
 bfh.bfType=((WORD)('M'<<8)|'B');
 bfh.bfSize=54+size;
 bfh.bfOffBits=54;
 CFileDialog dlg(false,_T("BMP"),_T("*.bmp"),OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,_T("*.bmp|*.bmp|*.jpg*|*.jpg*"));
 if (dlg.DoModal()!=IDOK)
 {
  return;
 }
 CFile bf;
 CString ss=dlg.GetPathName();
 if (bf.Open(ss,CFile::modeCreate|CFile::modeWrite))
 {
  bf.WriteHuge(&bfh,sizeof(BITMAPFILEHEADER));
  bf.WriteHuge(&bih,sizeof(BITMAPINFOHEADER));
  bf.WriteHuge(lpData,size);
  bf.Close();
 }
 GlobalFreePtr(lpData);
}


二、VC中利用GDI+在控件上绘图,把图像保存成图片

void OnSaveBMP()
{

 Bitmap *bmp= new Bitmap(pictureWidth,pictureHeight);//pictureWidth,pictureHeight分别为绘图区域大小
 Graphics *graphics = new Graphics(bmp);
 SolidBrush textBrush(Color::White);
 graphics->FillRectangle(&textBrush,0,0,pictureWidth,pictureHeight);

 CLSID Clsid;
 GetEncoderClsid(L"image/bmp", &Clsid);
 //将CString转换成wchar_t*
 CString picPathStr=path+"XXXX.bmp";
 wchar_t* picPathW=picPathStr.AllocSysString();
 //再将wchar_t*转换成wchar_t
 wchar_t picPathW1[100];
 wcscpy(picPathW1,picPathW);
 bmp->Save(picPathW1, &Clsid);
 delete bmp;
 delete graphics;

 graphics=NULL;
 bmp=NULL;
}

/*******************设置绘图编码*****************************/

int GetEncoderClsid(const WCHAR* format, CLSID* pClsid)
{
 UINT  num = 0;          // number of image encoders
 UINT  size = 0;         // size of the image encoder array in bytes
 ImageCodecInfo* pImageCodecInfo = NULL;
 GetImageEncodersSize(&num, &size);
 if(size == 0)
  return -1;  // Failure
 pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
 if(pImageCodecInfo == NULL)
  return -1;  // Failure
 GetImageEncoders(num, size, pImageCodecInfo);
 for(UINT j = 0; j < num; ++j)
 {
  if( wcscmp(pImageCodecInfo[j].MimeType, format) == 0 )
  {
   *pClsid = pImageCodecInfo[j].Clsid;
   free(pImageCodecInfo);
   return j;  // Success
  }   
 }
 free(pImageCodecInfo);
 return -1;  // Failure
}

 

 

摘自 renhang888

补充:软件开发 , Vc ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,