将控件区域保存为BMP图片

 

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 >

你可能感兴趣的:(colors)