对MFC中将绘制的图形进行截图的一点思考


在MFC中,通过CDC类绘制相应的图形后,如果需要将屏幕上绘制的图形在程序代码中进行截图,那么可以采取如下的截图函数
CRect rect;
GetClientRect(rect);
CImage image;
image.Create(rect.Width(),rect.Height(),24);
CDC* pDC=GetDC();
DC dstDC;//创建兼容DC
dstDC.CreateCompatibleDC(pDC);
dstDC.SelectObject(image);
dstDC.BitBlt(0,0,rect.Width(),rect.Height(),pDC,0,0,SRCCOPY);
image.Save(_T("D:\\用户目录\\Pictures\\名称.jpg");
此中方法只能将屏幕上存在的图形进行截图,因CDC类功能所限.但是若需要将屏幕上未显示的图截下来,该怎么办呢?对于滚动的屏幕而言,我们所能看到的界面上只能显示几张图,但是滚动屏幕会随着滚动条的向下移动而不断的绘制下面的图形,现在需要将屏幕显示的图形立即截下来,那么,该怎么做呢
首先,可能希望在窗口重绘中(滚动滚动条时)不断的调用截图函数,将屏幕上显示的图形裁剪下来。使用StretchBlt函数可以将DC中指定位置的图形截下来。如果我们知道每张图在DC中的位置,那么利用StretchBlt函数不断的裁剪相应区域的图,那么就可以获得相应的图形。
这种思路咋一看没有问题,可以将所需要的图形全部截下来。可是仔细想想,可能存在几个问题:
第一:在OnDraw中调用上面的截图函数时,只要屏幕重绘,即会调用截图函数,可能DC中的内容不完整,那么截下来的图形将是一片黑色;
第二:利用位置进行截图时,若图形没有在屏幕上显示,如果继续的采用上述的截图函数,也获得不了相应图形;第三:每次重绘时,虽然DC的首地址没变,但是句柄变了;
第四:窗口重绘时新的截图会覆盖原来的截图
在孙鑫的《VC++深入详解》的图形的保存和重绘这一章有关于“兼容设备描述表”,兼容DC实际是一块内存区域,利用它绘制的图形在窗口不可见。那么可以采用兼容DC绘制相应的图形,让进行截图。对于具有滚动条的屏幕,以下代码的位置是在:OnShowWindow(BOOL bShow, UINT nStatus)中,且在if (bShow)中,窗口第一次显示时调用以下代码

CDC  *pDC=GetDC();
CDC  dc;
CBrush   *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
CRect  rect;
GetClientRect(&rect);
dc.CreateCompatibleDC(pDC);
CBitmap  bitmap;
bitmap.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());
dc.SelectObject(&bitmap);
dc.BitBlt(0,0,rect.Width(),rect.Height(),pDC,0,0,SRCCOPY);
dc.SelectObject(pBrush);		
dc.SelectObject(img);

HeadText(pStripTextDC,m_TextHeight,strTime,strHeartRate,strTemp,strAction,m_Strip.sFlag);//写图形标题函数;
dc.BitBlt(0,0,m_StripWidth,m_TextHeight,pStripTextDC,0,0,SRCCOPY);
DrawStrip(pStripDC,m_DrawStruct,m_StripWidth,m_StripHeight);//画图函数
dc.BitBlt(0,m_TextHeight,m_StripWidth+1,m_StripHeight+1,pStripDC,0,0,SRCCOPY);



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值