void CFasdfadfDlg::OnSaveGraphic()
{
CClientDC SHDC(m_graph.GetDlgItem(IDC_STATIC1));//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);
}
记得要添加头文件#include <WINDOWSX.H >