基本信息
源码名称:C++ 屏幕截图 例子源码
源码大小:2.06M
文件格式:.zip
开发语言:C/C++
更新时间:2015-09-23
   友情提示:(无需注册或充值,赞助后即可获取资源下载链接)

     嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300

本次赞助数额为: 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);
}