15,979
社区成员
发帖
与我相关
我的任务
分享
// FullScreenDlg.cpp : 实现文件
//
#include "stdafx.h"
#include "ScreenCat.h"
#include "FullScreenDlg.h"
#include "ScreenCat.h"
#include <atlimage.h>
// CFullScreenDlg 对话框
IMPLEMENT_DYNAMIC(CFullScreenDlg, CDialog)
CFullScreenDlg::CFullScreenDlg(CWnd* pParent /*=NULL*/)
: CDialog(CFullScreenDlg::IDD, pParent)
{
//初始化m_tracker对象
m_tracker.m_rect.SetRect(-1, -2, -3, -4);
//初始边界形式
m_tracker.m_nStyle=CRectTracker::resizeOutside|CRectTracker::solidLine;
m_tracker.m_nHandleSize = 8;
//获取屏幕分辩率
m_xScreen = GetSystemMetrics(SM_CXSCREEN);
m_yScreen = GetSystemMetrics(SM_CYSCREEN);
//拷贝屏幕
CRect rect(0, 0,m_xScreen,m_yScreen);
hbitmap=CopyScreenToBitmap(&rect);
}
CFullScreenDlg::~CFullScreenDlg()
{
}
void CFullScreenDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
BOOL CFullScreenDlg::OnInitDialog()
{
CDialog::OnInitDialog();
//把对化框设置成全屏顶层窗口
SetWindowPos(&wndTopMost,0,0,m_xScreen,m_yScreen,SWP_SHOWWINDOW);
return TRUE;
}
//此函数将被调用两次 第一次传递屏幕矩形 第二次传递截取矩形
HBITMAP CFullScreenDlg::CopyScreenToBitmap(LPRECT lpRect)
{
HDC hScrDC, hMemDC;
// 屏幕和内存设备描述表
HBITMAP hBitmap, hOldBitmap;
// 位图句柄
int nX, nY, nX2, nY2;
// 选定区域坐标
int nWidth, nHeight;
// 确保选定区域不为空矩形
if (IsRectEmpty(lpRect))
return NULL;
//为屏幕创建设备描述表
hScrDC = CreateDC("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);
// 把屏幕设备描述表拷贝到内存设备描述表中
BitBlt(hMemDC, 0, 0, nWidth, nHeight, hScrDC, nX, nY, SRCCOPY);
hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap);
//得到屏幕位图的句柄
//清除
DeleteDC(hScrDC);
DeleteDC(hMemDC);
return hBitmap;
}
BEGIN_MESSAGE_MAP(CFullScreenDlg, CDialog)
ON_WM_PAINT()
ON_WM_RBUTTONDOWN()
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONDBLCLK()
END_MESSAGE_MAP()
// CFullScreenDlg 消息处理程序
void CFullScreenDlg::OnPaint()
{
CPaintDC dc(this);
HDC hdc=CreateCompatibleDC(dc);
SelectObject(hdc,hbitmap);
BitBlt(dc.m_hDC,0,0,m_xScreen,m_yScreen,hdc,0,0,SRCCOPY);
//画出矩形框
m_tracker.Draw(&dc);
// device context for painting
// TODO: 在此处添加消息处理程序代码
// 不为绘图消息调用 CDialog::OnPaint()
}
void CFullScreenDlg::OnRButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if(m_tracker.HitTest(point) < 0 )//当在矩形外右击时,返回主窗口
{
CDialog::OnOK();
GetParent()->ShowWindow(SW_SHOW);
}
else //在矩形内右击,保存文件 再返回主界面
{
SaveToFile(CopyScreenToBitmap(m_tracker.m_rect));
CDialog::OnOK();
GetParent()->ShowWindow(SW_SHOW);
}
CDialog::OnRButtonDown(nFlags, point);
}
void CFullScreenDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if(m_tracker.HitTest(point) < 0 ) // 点击在矩形外部 画选择框
{
m_tracker.TrackRubberBand(this,point,TRUE);
m_tracker.m_rect.NormalizeRect();
}
else // 点矩形选择框
{
m_tracker.Track(this,point,TRUE);
m_tracker.m_rect.NormalizeRect();
}
Invalidate(); //使客户区无效 系统会自动刷新窗口
CDialog::OnLButtonDown(nFlags, point);
}
void CFullScreenDlg::OnLButtonDblClk(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
//如果在是矩形内部双击
if( m_tracker.HitTest(point) == 8)
{
if (OpenClipboard())
{
EmptyClipboard();
SetClipboardData(CF_BITMAP, CopyScreenToBitmap(m_tracker.m_rect) );
CloseClipboard();
}
CDialog::OnOK();
GetParent()->ShowWindow(SW_SHOW);
}
CDialog::OnLButtonDblClk(nFlags, point);
}
void CFullScreenDlg::SaveToFile(HBITMAP hBitmap)
{
}