MFC窗口拷屏代码
sshong 发表于2008年5月14日 10:43:00 更新于2008年5月22日 15:57:00
自己写的总结,错误之处,还望指出
要领如下 sshong 08.05.14
1.首先是获取窗口客户区的DC
2.产生这个DC对应的设备上下文内存(因为直接操作源DC会有闪烁,而先搞一个统一的DC到内存中,最后再统一copy到源DC)
3.产生这个DC对应的位图(大小一致,为何全黑还不得而知)
4.将这个位图选中到设备上下文内存中,并保留老的位图
5.根据源DC拷贝位图到内存设备上下文中,没有这一句位图还是黑的,估计选入之后,对内存设备上下文的操作会影响到选入的位图
6.选入老的位图,因为被选入的gdi对象无法被销毁,而出栈时需要销毁这个新位图,所以选出以便被销毁
7.此时新位图已经拷贝好客户区了,可以设定剪贴板
要领如下 sshong 08.05.14
1.首先是获取窗口客户区的DC
2.产生这个DC对应的设备上下文内存(因为直接操作源DC会有闪烁,而先搞一个统一的DC到内存中,最后再统一copy到源DC)
3.产生这个DC对应的位图(大小一致,为何全黑还不得而知)
4.将这个位图选中到设备上下文内存中,并保留老的位图
5.根据源DC拷贝位图到内存设备上下文中,没有这一句位图还是黑的,估计选入之后,对内存设备上下文的操作会影响到选入的位图
6.选入老的位图,因为被选入的gdi对象无法被销毁,而出栈时需要销毁这个新位图,所以选出以便被销毁
7.此时新位图已经拷贝好客户区了,可以设定剪贴板
void CCaptureScreenDlg::OnBnClickedButton()
{
//
CDC MemDc;// 屏幕和内存设备描述表
CClientDC ScrDc(this);
CBitmap ScrBmp;
CRect rect;
GetClientRect(&rect);
MemDc.CreateCompatibleDC(&ScrDc);
ScrBmp.CreateCompatibleBitmap(&ScrDc,rect.Width(), rect.Height());
//屏幕分辨率为800x600
CBitmap* pOld=MemDc.SelectObject(&ScrBmp);
MemDc.BitBlt(0,0,rect.Width(), rect.Height(),&ScrDc,0,0,SRCCOPY);//拷屏
MemDc.SelectObject(pOld);
//输出到剪贴板
OpenClipboard();
EmptyClipboard();
SetClipboardData(CF_BITMAP, ScrBmp.GetSafeHandle());
CloseClipboard();
}
评论
2008年5月22日 15:20
鼓掌~~沙发~~~
添加评论
分类
琐碎文字 As3&Flex RIA UG English CodingArt C++ PHP Webserver E音乐盒 Unity3d C# JS&Html5 Tools mobile golang AI 最近发表
- claude code / codex的一些配置(2026年5月5日 17:38:10)
- 2026年5月5日(2026年5月5日 17:27:39)
- js的锁以及异步调用相关(2024年11月30日 10:58:51)
- golang学习之函数/方法/接口(2022年1月6日 17:50:24)
- golang学习之零值(2022年1月6日 16:38:10)
- hello, 2018(2018年1月15日 22:47:25)
- 字体类型名词解释(2015年1月18日 11:29:14)
- 获取mysql表注释以及列注释(2014年11月13日 15:56:32)
- php连接ms sql数据库的一些问题(2014年9月15日 20:32:14)
- virtualbox虚拟网络:NAT&bridge桥接网络(2014年8月25日 22:51:35)
最近回复