www.gusucode.com > VC++指定区域抓图、截屏小程序-源码程序 > VC++指定区域抓图、截屏小程序-源码程序/code/CapForm.cpp

    //Download by http://www.NewXing.com
/*
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

	文件:CapForm.h	类CCapForm的执行文件

	版权:Firebird Software Workroom 保留

	声明:本源程序的版权受《中华人民共和国著作权法》以及其
		  它相关法律和条约的保护。任何有机会得到本源程序的
		  个人和机构,未经作者明确授权,不得将本源程序用于
		  任何商业目的(直接的或间接的)。对于非商业目的的使
		  用 (包括复制、传播、编译和修改), 原则上没有特别
		  的限制条款,但请在相关文档中说明其来源,并尊重原
		  作者的署名权。

	编写:秦传安(chings)	2000.5

	联络:Tel:(0792)6323086	E_mail:chings@163.net
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
#include "fclstd.h"
#include "CapForm.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CCapForm::CCapForm()
{
	m_hScreenDC = NULL;
	m_hCursor = NULL;
	m_nCapFlag = 0;
	m_bDown = FALSE;
}

CCapForm::~CCapForm()
{
	
}

//////////////////////////////////////////////////////////////////////
void CCapForm::OnInitDialog()
{
	HDC hdc = GetDC(NULL);

	int cx = GetSystemMetrics(SM_CXSCREEN);
	int cy = GetSystemMetrics(SM_CYSCREEN);

	m_hScreenDC = CreateCompatibleDC(hdc);
	HBITMAP hBmp = CreateCompatibleBitmap(hdc,cx,cy);
	SelectObject(m_hScreenDC,hBmp);

	BitBlt(m_hScreenDC,0,0,cx,cy,hdc,0,0,SRCCOPY);
	ReleaseDC(NULL,hdc);

	SetWindowPos(m_hWnd,NULL,0,0,cx,cy,
				SWP_NOZORDER|SWP_NOACTIVATE|SWP_NOCOPYBITS);

/*
	WINDOWPLACEMENT wpl;
	memset(&wpl,0,sizeof(WINDOWPLACEMENT));
	wpl.length = sizeof(WINDOWPLACEMENT);
	wpl.rcNormalPosition.left = 0;
	wpl.rcNormalPosition.top = 0;
	wpl.rcNormalPosition.right = cx;
	wpl.rcNormalPosition.bottom = cy;
	wpl.showCmd = SW_SHOWNORMAL;
	SetWindowPlacement(m_hWnd,&wpl);*/
}
//////////////////////////////////////////////////////////////////////
LRESULT CCapForm::WindowProc(UINT msg,WPARAM wParam,LPARAM lParam)
{
	LRESULT lResult = 0;
	
	switch(msg)
	{
	case WM_ERASEBKGND:
		lResult = 1;
		break;
	case WM_PAINT:
		{
			HDC hDC = GetDC(m_hWnd);
			int cx = GetSystemMetrics(SM_CXSCREEN);
			int cy = GetSystemMetrics(SM_CYSCREEN);
			BitBlt(hDC,0,0,cx,cy,m_hScreenDC,0,0,SRCCOPY);
			ReleaseDC(m_hWnd,hDC);
		}
		break;
	case WM_LBUTTONDOWN:
		m_ptBegin.x = m_ptEnd.x = LOWORD(lParam);
		m_ptBegin.y = m_ptEnd.y = HIWORD(lParam);
		if(m_nCapFlag = 2)
		{
			m_bDown = TRUE;
			m_rcSel.left = m_rcSel.right = m_ptBegin.x;
			m_rcSel.top = m_rcSel.bottom = m_ptBegin.y;
		}
		break;
	case WM_LBUTTONUP:
		EndDialog(m_hWnd,IDOK);
		break;
	case WM_MOUSEMOVE:
		if(m_nCapFlag = 2 && m_bDown)
		{
			HDC hdc = GetDC(m_hWnd);

			DrawFocusRect(hdc,&m_rcSel);

			m_ptEnd.x = LOWORD(lParam);
			m_ptEnd.y = HIWORD(lParam);
			m_rcSel.left = min(m_ptBegin.x,m_ptEnd.x);
			m_rcSel.top = min(m_ptBegin.y,m_ptEnd.y);
			m_rcSel.right = max(m_ptBegin.x,m_ptEnd.x);
			m_rcSel.bottom = max(m_ptBegin.y,m_ptEnd.y);

			DrawFocusRect(hdc,&m_rcSel);
			ReleaseDC(m_hWnd,hdc);
		}
		break;
	case WM_SETCURSOR:
		SetCursor(m_hCursor);
		lResult = 1;
		break;
	default:
		lResult = CModalDlg::WindowProc(msg,wParam,lParam);
		break;
	}

	return lResult;	
}