下面的代码(屏幕截图),哪位老大给解释一下呀?

[大楚] 2005-03-28 03:36:07
///////截取屏幕图像的///////////
//主要是这部分看不明白,刚学VC,各位老大多多指点:) 谢谢
void CShowBMPView::OnCopySrc()
{
CDC MemDc,ScrDc; // 屏幕和内存设备描述表
//得到屏幕分辨率
int ScrWidth = GetSystemMetrics(SM_CXSCREEN);
int ScrHeight = GetSystemMetrics(SM_CYSCREEN);

//1 创建一个屏幕DC
ScrDc.CreateDC("display",NULL,NULL,NULL);

//2 创建一个与屏幕DC相兼容的内存DC
MemDc.CreateCompatibleDC(&ScrDc);

//3 创建与屏幕DC相兼容的位图
ScrBmp.Detach();
ScrBmp.CreateCompatibleBitmap(&ScrDc,ScrWidth,ScrHeight);

//4 将位图指针放入内存DC中,并得到一个pOld位图指针
//??? 仅仅将位图指针放到内存DC中吗?
CBitmap* pOld = MemDc.SelectObject(&ScrBmp);

//5 将位图由屏幕DC拷贝到内存DC中
//??? 这次是将位图数据放入到了内存DC中吧?
MemDc.BitBlt(0,0,ScrWidth,ScrHeight,&ScrDc,0,0,SRCCOPY);

//???经过(4)和(5)是不是已经将位图保存到了ScrBmp中啦?
//倒来倒去的,清楚呀,:(

//6 将位图放入内存DC中
//????为什么又pOld放了进去呀
MemDc.SelectObject(pOld);

CClientDC pDC(this);
OnDraw(&pDC);
}

//////////显示图像的/////
void CShowBMPView::OnDraw(CDC* pDC)
{
CDocument* pDoc = GetDocument();

// TODO: add draw code here
CRect trect;
GetClientRect(&trect);

CDC MemDC;
MemDC.CreateCompatibleDC(pDC);

CBitmap* pOldB=MemDC.SelectObject(&ScrBmp);

//显示大小 可自己定
pDC->BitBlt(0,0,trect.Width(),trect.Height(),&MemDC,0,0,SRCCOPY);

}
...全文
242 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
[大楚] 2005-03-28
  • 打赏
  • 举报
回复
我是个新手,首先感谢大家的热情指点,
但天生驽钝,没办法 :( 接着问了:)

//6 将位图放入内存DC中
//????为什么又pOld放了进去呀
MemDc.SelectObject(pOld);

是这一步实现了由pOld换到ScrBmp中的吗?,
感觉它只是将原来的旧位图又放回了MemDc中而已
本来由 4 将新位图指针放在了MemDC中,
再由 5 将位图数据也放在了MemDc中
本来已经完成了屏幕截取了,但它又通过 6 将旧位图的指针放回去?
不理解了!!! 因为我要访问的是ScrBmp呀,并不是MemDC呀

而 6 的执行又返回了什么呢?,新位图的指针吗?产生什么作用呢?





zyh_jason 2005-03-28
  • 打赏
  • 举报
回复
总之,位图先放在MemDC中,但它是本地变量,你无法得到,所以用pOld换到scrBmp中,然后才能用。
星辰游侠 2005-03-28
  • 打赏
  • 举报
回复
这个有windows的原理

你创建一个一个新位图(这个位图已经占用了资源),原先DC已经有一个旧的位图,选入新的位图以后,这个SelectObject会在选入的同时返回原先旧位图的指针。在使用以后要用保存的旧位图恢复,同时释放新位图所占用的资源,如果不把新位图用旧位图替换出来,就无法释放新位图所占用的资源,这样你的程序就会有资源泄漏
[大楚] 2005-03-28
  • 打赏
  • 举报
回复
BitBlt 方法我能明白,
这几个方法所实现的功能我明白,但是合到一起我就不明白:(


//6 将位图放入内存DC中
//????为什么又pOld放了进去呀
MemDc.SelectObject(pOld);

我纳闷的是如果不做第6步,图片就无法显示出来
但第4,和第5步 已经完成图片的截取了呀
为什么不做恢复,就显示不出来:(
殇迪 2005-03-28
  • 打赏
  • 举报
回复
//4 将位图指针放入内存DC中,并得到一个pOld位图指针
//??? 仅仅将位图指针放到内存DC中吗?
CBitmap* pOld = MemDc.SelectObject(&ScrBmp);
///////////////////////////////////////////////////////////
这里是为了保存现场——保存原来的dc


//???经过(4)和(5)是不是已经将位图保存到了ScrBmp中啦?
//倒来倒去的,清楚呀,:(
//6 将位图放入内存DC中
//????为什么又pOld放了进去呀
///////////////////////////////////////////////
这里是恢复现场——把原先保存到pOld中的内容又还原
xiangding 2005-03-28
  • 打赏
  • 举报
回复
主要还是这个函数实现截屏:
BitBlt

SRCCOPY表示copy屏幕,前面的参数是要copy的区域大小
mousefj 2005-03-28
  • 打赏
  • 举报
回复
保存和恢复现场

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧