读书人

程序界面保存图片的有关问题

发布时间: 2012-03-30 17:32:09 作者: rapoo

程序界面保存图片的问题
正常情况下,调用如下代码即可完成需求

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的内容保存成图片

读书人网 >VC/MFC

热点推荐