mfc截图
1、进入截图状态
PRTSCRING = TRUE;//开始截图标志为TRUE
AfxGetMainWnd()->ShowWindow(SW_SHOWMAXIMIZED);//主窗口最大化
SetWindowLong(GetSafeHwnd(), GWL_EXSTYLE, ::GetWindowLongPtr(GetSafeHwnd(), GWL_EXSTYLE) | WS_EX_LAYERED);
this->SetLayeredWindowAttributes(0, (255 * 1) / 100, LWA_ALPHA);//设置透明度为1%
CButton *begin_btn = (CButton*)GetDlgItem(IDC_BTN_BEGIN);//开始截图按钮
CButton *exit_btn = (CButton*)GetDlgItem(IDC_BTN_EXIT);//退出程序按钮
begin_btn->ShowWindow(FALSE);//截图按钮不可见
exit_btn->ShowWindow(FALSE);//退出程序按钮不可见
SetClassLong(this->GetSafeHwnd(), GCL_HCURSOR, (LONG)LoadCursor(NULL, IDC_CROSS));//设置截图时的光标为十字
2、鼠标左键按下消息函数
if (PRTSCRING == TRUE)//如果是在截图状态下鼠标左键按下
{
begin_point = point;//存储鼠标左键按下的坐标
CDialogEx::OnLButtonDown(nFlags, point);
}
3、鼠标左键弹起消息函数
if (PRTSCRING == TRUE)//如果是在截图状态下鼠标左键弹起
{
PRTSCRING = FALSE;//开始截图标志为FALSE
PRTSCRED = TRUE;//截图结束标志为TRUE
end_point = point;//得到截图结束时的坐标
int weith, heith;
weith = (end_point.x > begin_point.x ? end_point.x - begin_point.x : begin_point.x - end_point.x);//截图的宽度
heith = (end_point.y > begin_point.y ? end_point.y - begin_point.y : begin_point.y - end_point.y);//截图的长度
/*如果截图的面积太小,会影响视觉感,人为增大*/
if (weith < 50)
weith = 50;
if (heith < 100)
heith = 100;
SetWindowPos(NULL, 0, 0, weith, heith, SWP_SHOWWINDOW);//把主窗口大小设置成用户截图的图片大小
//SetWindowLong(m_hWnd, GWL_STYLE, GetWindowLong(m_hWnd, GWL_STYLE) & ~WS_CAPTION); //去标题栏
//SetWindowLong(m_hWnd, GWL_EXSTYLE, GetWindowLong(m_hWnd, GWL_EXSTYLE) & ~(WS_EX_WINDOWEDGE | WS_EX_DLGMODALFRAME)); //去边框
CDC *pDesktopDC = GetDesktopWindow()->GetDC();//获取全屏幕DC
CRect rect;//获取主窗口矩形对象
this->GetClientRect(&rect);
CDC *pDC = this->GetDC();//获取主窗口DC
/*用StretchBlt函数将源矩形的位图复制到目标矩形*/
pDC->StretchBlt(0, 0, rect.Width(), rect.Height(), pDesktopDC, begin_point.x>end_point.x ? end_point.x : begin_point.x, begin_point.y > end_point.y ? end_point.y : begin_point.y, weith, heith, SRCCOPY);//核心函数,将全屏幕的截图区域复制在主窗口上面显示
::SetWindowLong(GetSafeHwnd(), GWL_EXSTYLE, ::GetWindowLongPtr(GetSafeHwnd(), GWL_EXSTYLE) | WS_EX_LAYERED);
this->SetLayeredWindowAttributes(0, (255 * 100) / 100, LWA_ALPHA);//恢复正常透明度
CButton *save_btn = (CButton *)GetDlgItem(2000);//保存截图按钮
save_btn->ShowWindow(TRUE);//这个保存按钮是我在初始化函数中生成的,本来是不可见的,当截图完成后,这个按钮就可见
4、保存按钮函数
CButton *save_btn = (CButton*)GetDlgItem(2000);//在点击了保存按钮之后,这个按钮不可见
save_btn->ShowWindow(FALSE);
CDC *pDC = GetWindowDC();//获取主窗口设备上下文
CDC memDC;//内存设备上下文
memDC.CreateCompatibleDC(pDC);
CRect rt;//获取主窗口的矩形
GetWindowRect(&rt);
CBitmap Bmp;
Bmp.CreateCompatibleBitmap(pDC, rt.Width(), rt.Height());
CBitmap *pBmpPrev = (CBitmap*)memDC.SelectObject(&Bmp);
memDC.BitBlt(0, 0, rt.Width(), rt.Height(), pDC, 0, 0, SRCCOPY);
CImage image;
image.Attach((HBITMAP)Bmp.m_hObject);
image.Save(L"c:\\1.bmp");
mfc截图的更多相关文章
- MFC截图和界面刷新相关问题
问题描写叙述: 就是首先用CDC来截图,保存图片的路径通过dlg窗体来手动设置并传入.但是截下来的图片就会连带那个对话框也截图下来. 就是这样.我想截后面那个图.前面这 ...
- 人生第一次研读MFC截图工具的笔记心得
截图工具: 其中用到了动态链接库DLL技术(Dynamic Link Library)技术,键盘钩子技术,光标捕获技术,类橡皮类CRectTracker 头文件:后缀名为.cpp,主要是定义和声明之类 ...
- MFC 之 截图工具
这个截图工具能实现最主要的截图功能,并保存为bmp图片. 编写环境是vs2005,使用Unicode,基于对话框. 没什么难度,直接看代码 项目名称为CutOut // CutOutDlg.h : 头 ...
- MFC开发--截图工具
近期学习了MFC的相关知识,MFC(Microsoft Foundation Classes)是微软公司提供的一个类库,可以这样简单理解,就是对于Win32的封装(MFC对windows API函数的 ...
- [MFC] MFC 获取指定窗口截图(大小可调)
void screenShot(CRect rect,int left,int top,char *name){//截取窗口的大小,位置,名字(保存在默认路径下) CBitmap* m_pBitmap ...
- MFC漆摘要-截图,获得DIB/DDB图形Pixel
1. 当前Screen进行Copy屏幕,获得BITMAP 当前屏幕Copy.须要获取当前屏幕的HDC, 一种是直接从屏幕DC抓原始图. 一种是然后使用兼容MemDC进行抓图,然后能够附加图 ...
- MFC的本质
一.引言 上一专题中,纯手动地完成了一个Windows应用程序,然而,在实际开发中,我们大多数都是使用已有的类库来开发Windows应用程序.MFC(Microsoft Foundation Clas ...
- MFC中使用FLASH
一.准备工作 第一步:下载并安装Adobe Flash Player. 从官方网站(http://get.adobe.com/cn/flashplayer/)上下载最新的Flash Player(大约 ...
- mfc ui库
引用:http://blog.csdn.net/weiqubo/article/details/6783717 Xtrme toolkit,BCGControlBar,SkinMagic,AppFac ...
随机推荐
- kafka0.8.2以下版本删除topic
一些说明 kafka0.8.2及以上版本已经支持delete命令删除topic,可是之前的版本要是想删除topic还是要费一番手脚,绝对是个体力活... 该方法最好仅在线下开发环境中使用,毕竟要重启z ...
- [转]ms sql 2000 下批量 附加/分离 数据库(sql语句)
这次公司要把MS SQL Server 2000 服务器上的数据库复制到新的服务器上面去,于是几百个数据库文件就交给我附加到新服务器上了 以前一直没接触过这方面的东西,于是果断谷歌了也百度了 找 ...
- paper 44 :颜色矩和颜色相关图(color correlogram)
- MVC权限管理系统dwpro项目分配按钮没有显示的问题
问题如下: 修改如下: 或者(原因为这个两个地方名要一致,大小写也要注意): 效果图:
- sql 根据一个表更新 另一个表的例子及可能遇到的问题
例子: update a set a.name=b.name1 from a,b where a.id=b.id 例子延伸:更新的时候会把字符串 转为科学计数法 怎么办? 答:用 cast 转换一下 ...
- oracle中清空表数据的两种方法
1.delete from t 2 .truncate table t 区别: 1.delete是dml操作:truncate是ddl操作,ddl隐式提交不能回滚 2.delete from t可以回 ...
- android SDK安装容易出错的原因
1.实际上,安卓SDK安装之后,拷贝到其他的机子上面.配置一下环境变量,就可以跑起来的 2.但是拷贝到其他的机子上面临着一个问题就是Eclipse已经配置了的android环境,需要在新的机子上面修改 ...
- 操作系统双语阅读 - Schedulers调度器2
Most processes can be described as either I/O bound or CPU bound. 大多数进程都可以描述为IO绑定或者CPU绑定. An I/O-bou ...
- Google Map: JavaScript API RefererNotAllowedMapError
visite https://console.developers.google.com/apis/credentials and select the project you use. http:/ ...
- 为什么很多人用keepalived来实现redis故障转移
目前,Redis还没有一个类似于MySQL Proxy或Oracle RAC的官方HA方案.Redis作者有一个名为Redis Sentinel的计划 ,据称将会有监控,报警和自动故障转移三大功能,非 ...