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 ...
随机推荐
- HDU 4897 Little Devil I(树链剖分)(2014 Multi-University Training Contest 4)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4897 Problem Description There is an old country and ...
- BZOJ1930 [Shoi2003]pacman 吃豆豆
dp,首先建出图,f[i][j]表示a吃到了i点,b吃到了j点的最大值,转移的时候转移拓扑序小的那一维,如果i拓扑序小于j,那么转移到f[k][j],否则转移到f[i][k],建出的图边数也要优化, ...
- linux抓包方法
tcpdump -i eth0 -X -w data.cap 得到的包保存到本地wireshark解析ip.addr == url && http.request.url contai ...
- logging
#coding=utf8 import sys, logging logging.basicConfig(level=logging.INFO, forma ...
- Mongodb 笔记08 了解应用的动态、数据管理、持久性
了解应用的动态 1. 了解正在进行的操作:db.currentOp() , 可以加过滤条件,从而只显示符合条件的结果. 1). 寻找有问题的操作:db.currentOp() 最常见的操作就是用来寻找 ...
- SELECT INTO和INSERT INTO SELECT
--自动创建了target_table表,并复制source_table表的数据到target_table select name,age into target_table from source_ ...
- IntelliJ IDEA---java的编译工具【转】
转自:http://baike.baidu.com/link?url=sEpS0rItaB9BiO3i-qCdGSYiTIVPSJfBTjSXXngtN2hBhGl1j36CYQORKrbpqMHqj ...
- C# HttpClient, 使用C#操作Web
我们知道, .Net类库里提供了HttpWebRequest等类,方便我们编程与Web服务器进行交互. 但是实际使用中我们经常会遇到以下需求,基础类里没有直接提供相应的功能(WebClient类包含这 ...
- mongodb 2.6 window 安装启动服务
安装目录:C:\Program Files\MongoDB 2.6 Standard\ 创建目录:D:\mongodb\data 通过cmd,执行如下命令: cd C:\Program Files ...
- Oracle存储过程返回游标实例详解
复制代码 代码如下:CREATE OR REPLACE PROCEDURE PROCSENDEMAIL(P_TXT VARCHAR2, P_SUB VARCHAR2, P_SENDOR VARCHAR ...