在好例子网,分享、交流、成长!
您当前所在位置:首页C/C++ 开发实例Android手机应用开发 → C++ 屏幕截图 例子源码

C++ 屏幕截图 例子源码

Android手机应用开发

下载此实例
  • 开发语言:C/C++
  • 实例大小:2.06M
  • 下载次数:32
  • 浏览次数:1001
  • 发布时间:2015-09-23
  • 实例类别:Android手机应用开发
  • 发 布 人:crazycode
  • 文件格式:.zip
  • 所需积分:2
 相关标签: 截图

实例介绍

【实例简介】

【实例截图】

【核心代码】


// ScreenDlg.cpp : implementation file
//

#include "stdafx.h"
#include "ScreenCapture.h"
#include "ScreenDlg.h"
#include ".\screendlg.h"

CRect LEFT_RECT;
CRect RIGHT_RECT;

COLORREF  INFO_EDGECOLOR	    = RGB(255, 142, 0);
COLORREF  SELECT_RECTCOLOR		= RGB(87, 133, 52);
const int INFO_WIDTH			= 172;
const int INFO_HEIGHT			= 146;
const int INFO_OFFSET			= 5;
const int TEXT_OFFSET			= 5;
const int INFO_HEADER_H			= 30;

// CScreenDlg dialog

IMPLEMENT_DYNAMIC(CScreenDlg, CDialog)
CScreenDlg::CScreenDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CScreenDlg::IDD, pParent)
{
	m_bSelectOK = FALSE;
	m_bSelectRgn = FALSE;
}

CScreenDlg::~CScreenDlg()
{
}

void CScreenDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
}


BEGIN_MESSAGE_MAP(CScreenDlg, CDialog)
	ON_WM_PAINT()
	ON_WM_CREATE()
	ON_WM_MOUSEMOVE()
	ON_WM_LBUTTONDOWN()
	ON_WM_LBUTTONUP()
	ON_WM_LBUTTONDBLCLK()
	ON_WM_RBUTTONUP()
	ON_WM_SETCURSOR()
END_MESSAGE_MAP()


// CScreenDlg message handlers

void CScreenDlg::OnPaint()
{
	CPaintDC dc(this); // device context for painting
	// TODO: Add your message handler code here
	// Do not call CDialog::OnPaint() for painting messages
	dc.StretchBlt(0,0,m_size.cx, m_size.cy, 
				&m_dcMem, 
				0,0,m_size.cx, m_size.cy,
				SRCCOPY);
}

int CScreenDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CDialog::OnCreate(lpCreateStruct) == -1)
		return -1;
	// TODO:  Add your specialized creation code here	
	ShowWindow(SW_HIDE);

	CDC dcScreen;
	dcScreen.CreateDC("DISPLAY", NULL, NULL, NULL);
	m_size.cx = GetDeviceCaps(dcScreen.GetSafeHdc(), HORZRES);
	m_size.cy = GetDeviceCaps(dcScreen.GetSafeHdc(), VERTRES);

	m_dcMem.CreateCompatibleDC(&dcScreen);
	m_bmpScreen.CreateCompatibleBitmap(&dcScreen, m_size.cx,m_size.cy);
	CBitmap* pOldBmp = m_dcMem.SelectObject(&m_bmpScreen);
	m_dcMem.BitBlt(0,0,m_size.cx, m_size.cy, &dcScreen, 0, 0, SRCCOPY);
	CRect rect(0,0,m_size.cx, m_size.cy);

	LEFT_RECT = CRect(INFO_OFFSET, INFO_OFFSET, INFO_OFFSET   INFO_WIDTH, INFO_OFFSET   INFO_HEIGHT);
	RIGHT_RECT = CRect(m_size.cx - INFO_WIDTH-INFO_OFFSET, INFO_OFFSET, m_size.cx-INFO_OFFSET, INFO_OFFSET   INFO_HEIGHT);
	m_rectInfo = LEFT_RECT;

	m_bmpInfoBK.LoadBitmap(IDB_BITMAP_INFOBK);
	MoveWindow(rect);
	ShowWindow(SW_SHOW);
	
	m_hCursor = LoadCursor(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDC_CURSOR_SELECT));
	return 0;
}

void CScreenDlg::OnMouseMove(UINT nFlags, CPoint point)
{
	// TODO: Add your message handler code here and/or call default
	m_ptMouse = point;
	if(!m_bSelectOK)
	{
		m_rectSelect.right = point.x;
		m_rectSelect.bottom = point.y;
	}

	DisplayInfo();
	CDialog::OnMouseMove(nFlags, point);
}

void CScreenDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
	// TODO: Add your message handler code here and/or call default
	if(m_bSelectOK == FALSE)
	{
		m_bSelectRgn = TRUE;
		m_rectSelect.left = m_rectSelect.right = point.x;
		m_rectSelect.top = m_rectSelect.bottom = point.y;
	}
	
	CDialog::OnLButtonDown(nFlags, point);
}

void CScreenDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
	// TODO: Add your message handler code here and/or call default
	if(m_bSelectOK == FALSE && m_bSelectRgn == TRUE)
	{	m_rectSelect.right = point.x;
		m_rectSelect.bottom = point.y;
		m_bSelectRgn = FALSE;
		m_bSelectOK = TRUE;
		m_hCursor = ::LoadCursor(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDC_CURSOR_OK));
	}

	CDialog::OnLButtonUp(nFlags, point);
}
void CScreenDlg::OnLButtonDblClk(UINT nFlags, CPoint point)
{
	// TODO: Add your message handler code here and/or call default
	OnOK();
	CDialog::OnLButtonDblClk(nFlags, point);
}
void CScreenDlg::OnRButtonUp(UINT nFlags, CPoint point)
{
	// TODO: Add your message handler code here and/or call default
	m_bSelectOK = FALSE;
	m_hCursor = ::LoadCursor(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDC_CURSOR_SELECT));
	DisplayInfo();

	CDialog::OnRButtonUp(nFlags, point);
}

void CScreenDlg::DisplayInfo(void)
{
	
	if(LEFT_RECT.PtInRect(m_ptMouse))
	{	
		m_rectInfo = RIGHT_RECT;
	}
	else if(RIGHT_RECT.PtInRect(m_ptMouse))
	{
		m_rectInfo = LEFT_RECT;
	}

	CClientDC dc(this);
	COLORREF color = dc.GetPixel(m_ptMouse);
	
	CDC dcMem;
	dcMem.CreateCompatibleDC(&dc);
	CBitmap bmp;
	bmp.CreateCompatibleBitmap(&dc, m_size.cx, m_size.cy);
	CBitmap* pOldBmp = dcMem.SelectObject(&bmp);
	// get the backgroud
	dcMem.BitBlt(0,0,m_size.cx, m_size.cy, 
		&m_dcMem, 
		0,0,
		SRCCOPY);

	//------------------------
	// draw the info plane
	//------------------------
	CBrush brushBK(&m_bmpInfoBK);
	CPen   penBK(PS_SOLID, 1,INFO_EDGECOLOR);	
	CPen*	pOldPen   =  dcMem.SelectObject(&penBK);
	CBrush* pOldBrush =  dcMem.SelectObject(&brushBK);
	dcMem.SetBrushOrg(m_rectInfo.left, m_rectInfo.top);
	dcMem.Rectangle(m_rectInfo);
	dcMem.SelectObject(pOldBrush);
	dcMem.SelectObject(pOldPen);

	//-----------------------------------
	// draw the text
	//-----------------------------------
	CString str1, str2;
	if(m_bSelectRgn || m_bSelectOK)
	{		
		str1.Format("起始点:%d, %d", m_rectSelect.left, m_rectSelect.top);
		str2.Format("中止点:%d, %d", m_rectSelect.right, m_rectSelect.bottom);
	}
	else
	{
		str1.Format("鼠标位置: %d, %d", m_ptMouse.x, m_ptMouse.y);
		str2.Format("当前颜色: %d, %d, %d", 
			GetRValue(color),  GetGValue(color),  GetBValue(color));

	}
	dcMem.SetBkMode(TRANSPARENT);
	dcMem.SetTextColor(RGB(255, 255, 255));
	dcMem.TextOut(TEXT_OFFSET   m_rectInfo.left, 10   INFO_HEADER_H, str1);
	dcMem.TextOut(TEXT_OFFSET   m_rectInfo.left, 30   INFO_HEADER_H, str2);
	
	//-----------------------------------
	// draw the selected region
	//-------------------------------------
	if(m_bSelectRgn || m_bSelectOK)
	{
		CPen penLine(PS_SOLID, 1, SELECT_RECTCOLOR);
		CPen* pOldPen = dcMem.SelectObject(&penLine);

		dcMem.MoveTo(m_rectSelect.left, m_rectSelect.top);
		dcMem.LineTo(m_rectSelect.right, m_rectSelect.top);
		dcMem.LineTo(m_rectSelect.right, m_rectSelect.bottom);
		dcMem.LineTo(m_rectSelect.left, m_rectSelect.bottom);
		dcMem.LineTo(m_rectSelect.left, m_rectSelect.top);

		dcMem.SelectObject(pOldPen);
	}
	// display all
	dc.StretchBlt(0,0,m_size.cx, m_size.cy, 
		&dcMem, 
		0,0,m_size.cx, m_size.cy,
		SRCCOPY);

	dcMem.SelectObject(pOldBmp);
}

void CScreenDlg::SaveSelectBmp(void)
{
	if(!m_bSelectOK)
		return;

	if(m_rectSelect.IsRectEmpty() || m_rectSelect.IsRectNull())
		return;

	CDC dcSave;
	dcSave.CreateCompatibleDC(NULL);
	CBitmap bitmap;
	BITMAP bm;
	m_bmpScreen.GetObject(sizeof(bm), &bm);
	bm.bmWidth = m_rectSelect.Width();
	bm.bmHeight = m_rectSelect.Height();
	bitmap.CreateBitmapIndirect(&bm);
	CBitmap* pOldBmp = dcSave.SelectObject(&bitmap);
	
	dcSave.StretchBlt(0,0, m_rectSelect.Width(), m_rectSelect.Height(),
		&m_dcMem, m_rectSelect.left, m_rectSelect.top,
		m_rectSelect.Width(), m_rectSelect.Height(), SRCCOPY);
	
	HBITMAP hBmp = (HBITMAP)bitmap.Detach();
	dcSave.SelectObject(pOldBmp);


	// save to the clipboard
	if(::OpenClipboard(m_hWnd))
	{
	::EmptyClipboard();
	::SetClipboardData(CF_BITMAP, hBmp);
	::CloseClipboard();
	}
}

void CScreenDlg::OnOK()
{
	// TODO: Add your specialized code here and/or call the base class
	SaveSelectBmp();

	CDialog::OnOK();
}


BOOL CScreenDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
	// TODO: Add your message handler code here and/or call default
	if(nHitTest == HTCLIENT)
	{
		::SetCursor(m_hCursor);
		return TRUE;
	}
	return CDialog::OnSetCursor(pWnd, nHitTest, message);
}


标签: 截图

实例下载地址

C++ 屏幕截图 例子源码

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警