// ScreenSpyDlg.cpp : 实现文件
//
#include "stdafx.h"
#include "ScreenSpy.h"
#include "ScreenSpyDlg.h"
#include "afxdialogex.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
CScreenSpyDlg::CScreenSpyDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CScreenSpyDlg::IDD, pParent)
{
//初始化像皮筋类
m_RectTracker.m_nStyle=CRectTracker::resizeInside|CRectTracker::dottedLine;
m_RectTracker.m_rect.SetRect(-1,-1,-1,-1);
m_hCursor=AfxGetApp()->LoadCursor(ARROW_COLOR);
m_bDraw=FALSE;
m_bStartDraw=FALSE;
m_bShowInfo = FALSE;
m_startPt=0;
//获取屏幕分辩率
m_xScreen = GetSystemMetrics(SM_CXSCREEN);
m_yScreen = GetSystemMetrics(SM_CYSCREEN);
//截取屏幕到位图中
CRect rect(0, 0,m_xScreen,m_yScreen);
m_pBitmap=CBitmap::FromHandle(CopyScreenToBitmap(&rect));
//要更新的区域
m_rgn.CreateRectRgn(0,0,50,50);
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CScreenSpyDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CScreenSpyDlg, CDialog)
//{{AFX_MSG_MAP(CScreenSpyDlg)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_LBUTTONDBLCLK()
ON_WM_RBUTTONDOWN()
ON_WM_ERASEBKGND()
ON_WM_SETCURSOR()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CScreenSpyDlg message handlers
BOOL CScreenSpyDlg::OnInitDialog()
{
CDialog::OnInitDialog();
//把对化框设置成全屏顶层窗口
SetWindowPos(&wndTopMost,0,0,m_xScreen,m_yScreen,SWP_SHOWWINDOW);
//捕获按键消息窗口,将对话框的句柄传递到CCatchScreenApp中
((CScreenSpyApp*)AfxGetApp())->m_hwndDlg=m_hWnd;
SetIcon(m_hIcon, TRUE);
SetIcon(m_hIcon, FALSE);
return TRUE;
}
void CScreenSpyDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CPaintDC dc(this);
if(m_bShowInfo&&m_bStartDraw)
{
CRect rect;
m_RectTracker.GetTrueRect(&rect);
ShowInfo(rect);
}
//画出像皮筋矩形
if(m_bStartDraw)
{
m_RectTracker.Draw(&dc);
}
CDialog::OnPaint();
}
}
/************************************************************************/
/*
显示相关的信息 inRect为传进来的橡皮筋矩形
*/
/************************************************************************/
void CScreenSpyDlg::ShowInfo(CRect &inRect)
{
//截取矩形大小信息离鼠标间隔
const int space=3;
CClientDC dc(this);
//设置字体颜色大小
CPoint pt;
CPen pen(PS_SOLID,1,RGB(147,147,147));
dc.SetTextColor(RGB(255,255,255));
CFont cfont;
cfont.CreatePointFont(90,L"宋体");
dc.SelectObject(&cfont);
//得到字体宽度和高度
GetCursorPos(&pt);
dc.SetBkMode(TRANSPARENT);
TEXTMETRIC tm;
int charHeight;
CSize size;
int lineLength;
dc.GetTextMetrics(&tm);
charHeight = tm.tmHeight+tm.tmExternalLeading + 10;
size=dc.GetTextExtent(L"%d x %d",strlen(" %d x %d "));
lineLength=size.cx;
//初始化矩形, 以保证写下一行文字 20*50
CRect rect(inRect.left,inRect.top-20,inRect.left+70,inRect.top);
int x = GetDeviceCaps(dc, HORZRES);
int y = GetDeviceCaps(dc, VERTRES);
//创建临时矩形
CRect rectTemp;
//当矩形到达桌面边缘时调整方向和大小
if((pt.x+rect.Width())>=x)
{
//桌面上方显示不下矩形
rectTemp=rect;
rectTemp.left=rect.left-rect.Width()-space*2;
rectTemp.right=rect.right-rect.Width()-space*2;;
rect=rectTemp;
}
if((pt.y-rect.Height())<=0)
{
//桌面右方显示不下矩形
rectTemp=rect;
rectTemp.top=rect.top+rect.Height()+space*2;;
rectTemp.bottom=rect.bottom+rect.Height()+space*2;;
rect=rectTemp;
}
//创建灰色画刷画矩形
dc.SelectObject((HBRUSH)GetStockObject(GRAY_BRUSH));
dc.Rectangle(rect);
rect.top+=2;
//在矩形中显示文字
CString string;
string.Format(L" %d x %d",inRect.Width(),inRect.Height());
dc.TextOut(rect.left,rect.top,string);
}
HCURSOR CScreenSpyDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CScreenSpyDlg::OnOK()
{
}
void CScreenSpyDlg::OnCancel()
{
if(m_bStartDraw)
{
m_bStartDraw=FALSE;
m_bDraw=FALSE;
m_RectTracker.m_rect.SetRect(-1,-1,-1,-1);
PaintWindow();
}
else
{
CDialog::OnCancel();
}
}
void CScreenSpyDlg::OnMouseMove(UINT nFlags, CPoint point)
{
if(m_bDraw)
{
m_RectTracker.m_rect.SetRect(m_startPt.x+1,m_startPt.y+1,point.x,point.y);
m_bStartDraw=TRUE;
PaintWindow();
}
CDialog::OnMouseMove(nFlags, point);
}
void CScreenSpyDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
int nHitTest;
nHitTest=m_RectTracker.HitTest(point);
m_bShowInfo= TRUE;
PaintWindow();
//判断击中位置
if(nHitTest<0)
{
if(!m_bStartDraw)
{
m_startPt=point;
m_bDraw=TRUE;
PaintWindow();
}
}
else
{
if(m_bStartDraw)
{
m_RectTracker.Track(this,point,TRUE);
SendMessage(WM_LBUTTONUP,NULL,NULL);
PaintWindow();
}
}
CDialog::OnLButtonDown(nFlags, point);
}
void CScreenSpyDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
m_bDraw=FALSE;
//m_bShowInfo = FALSE;
PaintWindow();
CDialog::OnLButtonUp(nFlags, point);
}
void CScreenSpyDlg::OnLButtonDblClk(UINT nFlags, CPoint point)
{
int nHitTest;
nHitTest=m_RectTracker.HitTest(point);
if(nHitTest==8)
{
CopyScreenToBitmap(m_RectTracker.m_rect,TRUE);
PostQuitMessage(0);
}
CDialog::OnLButtonDblClk(nFlags, point);
}
void CScreenSpyDlg::OnRButtonDown(UINT nFlags, CPoint point)
{
if(m_bStartDraw)
{
//如果已经截取矩则清除截取矩形
m_bStartDraw=FALSE;
m_RectTracker.m_rect.SetRect(-1,-1,-1,-1);
PaintWindow();
}
else
{
PostQuitMessage(0);
}
CDialog::OnRButtonDown(nFlags, point);
}
BOOL CScreenSpyDlg::OnEraseBkgnd(CDC* pDC)
{
BITMAP bmp;
m_pBitmap->GetBitmap(&bmp);
CDC dcCompatible;
dcCompatible.CreateCompatibleDC(pDC);
dcCompatible.SelectObject(m_pBitmap);
CRect rect;
GetClientRect(&rect);
pDC->BitBlt(0,0,rect.Width(),rect.Height(),&dcCompatible,0,0,SRCCOPY);
return TRUE;
}
BOOL CScreenSpyDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
if (pWnd == this && m_RectTracker.SetCursor(this, nHitTest))
{
return TRUE;
}
else
{
//设置彩色光标
SetCursor(m_hCursor);
return TRUE;
}
}
//*********************增加的函数**********************************************************
//考贝屏幕,这段代码是拿来主义 呵呵
HBITMAP CScreenSpyDlg::CopyScreenToBitmap(LPRECT lpRect,BOOL bSave)
//lpRect 代表选定区域
{
HDC hScrDC, hMemDC;
// 屏幕和内存设备描述表
HBITMAP hBitmap, hOldBitmap;
// 位图句柄
int nX, nY, nX2, nY2;
// 选定区域坐标
int nWidth, nHeight;
// 确保选定区域不为空矩形
if (IsRectEmpty(lpRect))
return NULL;
//为屏幕创建设备描述表
hScrDC = CreateDC(L"DISPLAY", NULL, NULL, NULL);
//为屏幕设备描述表创建兼容的内存设备描述表
hMemDC = CreateCompatibleDC(hScrDC);
// 获得选定区域坐标
nX = lpRect->left;
nY = lpRect->top;
nX2 = lpRect->right;
nY2 = lpRect->bottom;
//确保选定区域是可见的
if (nX < 0)
nX = 0;
if (nY < 0)
nY = 0;
if (nX2 > m_xScreen)
nX2 = m_xScreen;
if (nY2 > m_yScreen)
nY2 = m_yScreen;
nWidth = nX2 - nX;
nHeight = nY2 - nY;
// 创建一个与屏幕设备描述表兼容的位图
hBitmap = CreateCompatibleBitmap
(hScrDC, nWidth, nHeight);
// 把新位图选到内存设备描述表中
hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap);
// 把屏幕设备描述表拷贝到内存设备描述表中
if(bSave)
{
CDC dcCompatible;
dcCompatible.CreateCompatibleDC(CDC::FromHandle(hM
- 1
- 2
- 3
- 4
- 5
前往页