程序界面保存图片的问题
正常情况下,调用如下代码即可完成需求
- C/C++ code
CDC* pDC = GetDC(); CRect pRect; GetClientRect(&pRect); int w, h; w = pRect.right - pRect.left; h = pRect.bottom - pRect.top; CBitmap bm; bm.CreateCompatibleBitmap(pDC, w, h); CDC memdc; memdc.CreateCompatibleDC(pDC); CBitmap*pOld=memdc.SelectObject(&bm); memdc.BitBlt( 0, 0, w, h, pDC, pRect.left, pRect.top, SRCCOPY ); BITMAP btm; bm.GetBitmap(&btm); DWORD size=btm.bmWidthBytes*btm.bmHeight; LPSTR lpData=(LPSTR)::GlobalAlloc(GPTR,size); 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(memdc,bm,0,bih.biHeight,lpData,(BITMAPINFO*)&bih,DIB_RGB_COLORS); BITMAPFILEHEADER bfh; bfh.bfReserved1=bfh.bfReserved2=0; bfh.bfType=((WORD)('M'<< 8)|'B'); bfh.bfSize=54+size; bfh.bfOffBits=54; CFile bf; if(bf.Open(filePath,CFile::modeCreate|CFile::modeWrite)) { bf.Write(&bfh,sizeof(BITMAPFILEHEADER)); bf.Write(&bih,sizeof(BITMAPINFOHEADER)); bf.Write(lpData,size); bf.Close(); MessageBox(_T("保存成功!")); } else { MessageBox(_T("保存失败!")); } memdc.SelectObject( pOld ); bm.DeleteObject( ); memdc.DeleteDC( ); ::GlobalFree(lpData);但是现在有个问题是,如果要保存的界面有滚动条,则只能保存可视区域呢,而需求是要保存界面上所有的元素,包括因为滚动条而没有显示出来的界面,怎么做呢?
[解决办法]
滚动条时框架,不是dc的内容所以不保存
[解决办法]
自己算一下滚动条之外的界面大小,创建一个包含窗口及之前计算出来大小的CDC,如太大则需要分块绘制。
然后把要截图的东西在这个CDC上全部绘制一遍。
[解决办法]
试试看PrintWindow
[解决办法]
这个需要双缓冲绘图,然后,全部保存在一个内存位图里面,直接存储这个内存DC
[解决办法]
自定义MemDC 传到 OnDraw里 然后把这个DC的内容保存成图片