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截图的更多相关文章

  1. MFC截图和界面刷新相关问题

    问题描写叙述:         就是首先用CDC来截图,保存图片的路径通过dlg窗体来手动设置并传入.但是截下来的图片就会连带那个对话框也截图下来.         就是这样.我想截后面那个图.前面这 ...

  2. 人生第一次研读MFC截图工具的笔记心得

    截图工具: 其中用到了动态链接库DLL技术(Dynamic Link Library)技术,键盘钩子技术,光标捕获技术,类橡皮类CRectTracker 头文件:后缀名为.cpp,主要是定义和声明之类 ...

  3. MFC 之 截图工具

    这个截图工具能实现最主要的截图功能,并保存为bmp图片. 编写环境是vs2005,使用Unicode,基于对话框. 没什么难度,直接看代码 项目名称为CutOut // CutOutDlg.h : 头 ...

  4. MFC开发--截图工具

    近期学习了MFC的相关知识,MFC(Microsoft Foundation Classes)是微软公司提供的一个类库,可以这样简单理解,就是对于Win32的封装(MFC对windows API函数的 ...

  5. [MFC] MFC 获取指定窗口截图(大小可调)

    void screenShot(CRect rect,int left,int top,char *name){//截取窗口的大小,位置,名字(保存在默认路径下) CBitmap* m_pBitmap ...

  6. MFC漆摘要-截图,获得DIB/DDB图形Pixel

    1.       当前Screen进行Copy屏幕,获得BITMAP 当前屏幕Copy.须要获取当前屏幕的HDC, 一种是直接从屏幕DC抓原始图. 一种是然后使用兼容MemDC进行抓图,然后能够附加图 ...

  7. MFC的本质

    一.引言 上一专题中,纯手动地完成了一个Windows应用程序,然而,在实际开发中,我们大多数都是使用已有的类库来开发Windows应用程序.MFC(Microsoft Foundation Clas ...

  8. MFC中使用FLASH

    一.准备工作 第一步:下载并安装Adobe Flash Player. 从官方网站(http://get.adobe.com/cn/flashplayer/)上下载最新的Flash Player(大约 ...

  9. mfc ui库

    引用:http://blog.csdn.net/weiqubo/article/details/6783717 Xtrme toolkit,BCGControlBar,SkinMagic,AppFac ...

随机推荐

  1. Codeforces Round #312 (Div. 2) E. A Simple Task

    题目大意就是给一个字符串,然后多个操作,每次操作可以把每一段区间的字符进行升序或者降序排序,问最终的字符串是多少. 一开始只考虑字符串中字符'a'的情况,假设操作区间[L,R]中有x个'a',那么一次 ...

  2. YbRapidSolution.MVC项目首页分页没有起作用

    @model YbRapidSolution.Mvc.Models.CmsPagerDataModel <nav> <ul class="pager"> & ...

  3. oracle的例程

    oracle只有在具备sysoper和sysdba权限下才能启动和关闭例程 关闭例程: --正常关闭(等待当前连接的所有用户与数据库断开) shutdown normal; --立即关闭(回退活动的事 ...

  4. 夺命雷公狗---Thinkphp----9之中间层的创建,防止跨目录访问

    我们创建一个CommonController.class.php的中间层,让后让别的控制器都直接继承CommonController这个控制器即可决解跨目录访问的问题, <?php namesp ...

  5. python 笔记1

    Python join()方法 描述 Python join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串. 语法 join()方法语法: str.join(sequence) 参数 ...

  6. [php] PHP Fatal error: Class 'AMQPConnection' not found

    When using rabbitmq, $this->conn = new AMQPConnection($conn_args); $this->conn->connect(); ...

  7. java 网络编程(四)----UDP进阶篇聊天小程序

    设计要求:单线程模式,客户端只发送数据,数据的来源为键盘录入,服务器端只接收数据,当客户端发送886的时候,客户端和服务器端都退出. 1. 发送端: public class Send impleme ...

  8. 在Asp.Net的Global.asax中Application_Error跳转到自定义错误页无效的解决办法

    在开发Asp.Net系统的时候,我们很多时候希望系统发生错误后能够跳转到一个自定义的错误页面,于是我们经常会在Global.asax中的Application_Error方法中使用Response.R ...

  9. java - Annotation元数据

    Annotation元数据(一) 一.Annotation究竟是什么? 是java5.0中的新特征 数据的数据(元数据) Annotation和访问修饰符一样,应用于包.类型.构造方法.方法.成员变量 ...

  10. OpenStack fuel-web不可用解决办法

    Contents [hide] 1 为增加一台计算节点 2 磁盘清空 3 启动占用8001端口的进程 4 启动占用5432端口的进程 为增加一台计算节点 打开fuel-web,发现无法打开,弹出ngi ...