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 ,