#include "stdafx.h"
#include "ScreenShot.h"
#include "CurtainDlg.h"
#include "afxdialogex.h"
IMPLEMENT_DYNAMIC(CCurtainDlg, CDialogEx);
//-------------GDI+全局变量-------------------
GdiplusStartupInput g_gdiplusStartInput;
ULONG_PTR g_gdiToken;
//--------------------------------------------
CCurtainDlg::CCurtainDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CCurtainDlg::IDD, pParent)
{
GdiplusStartup(&g_gdiToken,&g_gdiplusStartInput,NULL); //装载GDI+
}
CCurtainDlg::~CCurtainDlg()
{
GdiplusShutdown(g_gdiToken); //卸载GDI+
DestroyDevice(); //卸载设备句柄
::UnregisterHotKey(m_hWnd,999);//卸载全局热键
}
void CCurtainDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
int CCurtainDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDialogEx::OnCreate(lpCreateStruct) == -1)
return -1;
//初始化
InitDevice();
InitProperties();
//设置窗口大小
MoveWindow(0,0,m_iWidth,m_iHeight);
//注册全局快捷键
if(!::RegisterHotKey(m_hWnd,HOTKEY_C_A_P,MOD_CONTROL|MOD_ALT,0x50))
AfxMessageBox(_T("热键已经被占用"));
return 0;
}
void CCurtainDlg::OnCancel()
{
m_bIsActive = false;
CDialogEx::OnCancel();
}
void CCurtainDlg::OnPaint()
{
CPaintDC dc(this);
DrawCaptureWindowRect(); //画捕获窗口
DrawRubberBand(); //画橡皮筋
::BitBlt(dc.m_hDC,0,0,m_iWidth,m_iHeight,m_hMemDC,0,0,SRCCOPY); //缓存投射到窗口
}
BOOL CCurtainDlg::OnEraseBkgnd(CDC* pDC)
{
//贴上背景
::BitBlt(m_hMemDC,0,0,m_iWidth,m_iHeight,m_hRecordDC,0,0,SRCCOPY);
//贴上幕布
Graphics graphics(m_hMemDC);
graphics.FillRectangle(&SolidBrush(m_crCurtain),0,0,m_iWidth,m_iHeight);
/* return CDialogEx::OnEraseBkgnd(pDC); */ //防止系统自动擦除背景
return true;
}
BOOL CCurtainDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
/* return CDialogEx::OnSetCursor(pWnd, nHitTest, message); */ //防止系统自动设置光标
return true;
}
void CCurtainDlg::OnMouseMove(UINT nFlags, CPoint point)
{
if(!m_bIsClicked)
{
if(m_bIsCaptureWnd)
SetCurCaptureWndRect(point); //设置捕获窗口
}
else if(nFlags & MK_LBUTTON)
{
if(!m_bIsRubberBandOK)
{
//橡皮筋区域等于捕获区域
CRect rt(m_ptRubberBand,point);
rt.NormalizeRect();
m_rtRubberBand = rt;
}
else if(GetCursor()==m_hCurMov)
MoveRubberBand(point); //移动橡皮筋
else
ResizeRubberBand(point); //改变橡皮筋大小
RedrawWindow();
return;
}
MySetCursor(point);
RedrawWindow();
CDialogEx::OnMouseMove(nFlags, point);
}
void CCurtainDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
if(!m_bIsClicked)
{
m_bIsClicked = true;
m_ptRubberBand = point; //设置橡皮筋初始点
if(m_rtCurCaptureWndRect.IsRectEmpty())
m_rtRubberBand.SetRect(PTR(point.x,point.y)); //设置橡皮筋初始大小
else
m_rtRubberBand = m_rtCurCaptureWndRect; //设置橡皮筋等于捕获窗口
m_rtCurCaptureWndRect.SetRectEmpty(); //清空捕获窗口
}
else if(GetCursor() == m_hCurMov) //移动橡皮筋
m_ptTemp = point;
else
SetResizeStatus(point); //设置橡皮筋改大小
RedrawWindow();
CDialogEx::OnLButtonDown(nFlags, point);
}
void CCurtainDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
m_bIsRubberBandOK = true; //捕获成功
m_bRtUP = m_bRtDown = m_bRtLeft = m_bRtRight = false; //还原改大小状态
CDialogEx::OnLButtonUp(nFlags, point);
}
void CCurtainDlg::OnLButtonDblClk(UINT nFlags, CPoint point)
{
if(m_rtRubberBand.PtInRect(point))
PutInClipboard();
CDialogEx::OnLButtonDblClk(nFlags, point);
}
void CCurtainDlg::OnRButtonDown(UINT nFlags, CPoint point)
{
OnCancel();
CDialogEx::OnRButtonDown(nFlags, point);
}
void CCurtainDlg::OnHotKey(UINT nHotKeyId, UINT nKey1, UINT nKey2)
{
if(HOTKEY_C_A_P == nHotKeyId)
Activate();
CDialogEx::OnHotKey(nHotKeyId, nKey1, nKey2);
}
BEGIN_MESSAGE_MAP(CCurtainDlg, CDialogEx)
ON_WM_CREATE()
ON_WM_PAINT()
ON_WM_ERASEBKGND()
ON_WM_SETCURSOR()
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_LBUTTONDBLCLK()
ON_WM_RBUTTONDOWN()
ON_WM_HOTKEY()
END_MESSAGE_MAP()
void CCurtainDlg::Reset()
{
m_bIsClicked = false;
//重置捕获窗体
m_vctCaptureWndRect.clear();
m_rtCurCaptureWndRect.SetRectEmpty();
//重置橡皮筋
m_rtRubberBand.SetRectEmpty();
m_ptRubberBand.SetPoint(0,0);
m_bIsRubberBandOK = false;
//还原改大小状态
m_bRtUP=m_bRtDown=m_bRtLeft=m_bRtRight=false;
}
void CCurtainDlg::Activate()
{
if(m_bIsActive)
return;
Reset();
//记录原始桌面
::BitBlt(m_hRecordDC,0,0,m_iWidth,m_iHeight,m_hDC,0,0,SRCCOPY);
//枚举所有捕获窗口
if(m_bIsCaptureWnd)
::EnumWindows(CaptureWindowRect,(LPARAM)this);
//展现窗口
ShowWindow(SW_SHOW);
SetForegroundWindow();
m_bIsActive = true;
}
void CCurtainDlg::InitDevice()
{
m_hDC = ::GetDC(NULL);
m_hMemDC = ::CreateCompatibleDC(m_hDC);
m_hRecordDC = ::CreateCompatibleDC(m_hDC);
//获取屏幕宽高
m_iWidth = ::GetDeviceCaps(m_hDC,HORZRES);
m_iHeight = ::GetDeviceCaps(m_hDC,VERTRES);
m_hMemBitmap = ::CreateCompatibleBitmap(m_hDC,m_iWidth,m_iHeight);
m_hOldMemBitmap = (HBITMAP)::SelectObject(m_hMemDC,m_hMemBitmap);
m_hRecordBitmap = ::CreateCompatibleBitmap(m_hDC,m_iWidth,m_iHeight);
m_hOldRecordBitmap = (HBITMAP)::SelectObject(m_hRecordDC,m_hRecordBitmap);
//读取光标资源
m_hCurNor = LoadCursor(theApp.m_hInstance,MAKEINTRESOURCE(IDC_CUR_NOR));
m_hCurMov = LoadCursor(NULL,MAKEINTRESOURCE(IDC_SIZEALL));
m_hCurResizeHor = LoadCursor(NULL,MAKEINTRESOURCE(IDC_SIZEWE));
m_hCurResizeVer = LoadCursor(NULL,MAKEINTRESOURCE(IDC_SIZENS));
m_hCurResizeDia1 = LoadCursor(NULL,MAKEINTRESOURCE(IDC_SIZENWSE));
m_hCurResizeDia2 = LoadCursor(NULL,MAKEINTRESOURCE(IDC_SIZENESW));
}
void CCurtainDlg::DestroyDevice()
{
::DestroyCursor(m_hCurNor);
::DestroyCursor(m_hCurMov);
::DestroyCursor(m_hCurResizeHor);
::DestroyCursor(m_hCurResizeVer);
::DestroyCursor(m_hCurResizeDia1);
::DestroyCursor(m_hCurResizeDia2);
::SelectObject(m_hMemDC,m_hOldMemBitmap);
::SelectObject(m_hRecordDC,m_hOldRecordBitmap);
::DeleteObject(m_hOldMemBitmap);
::DeleteObject(m_hOldRecordBitmap);
::DeleteDC(m_hRecordDC);
::DeleteDC(m_hMemDC);
::ReleaseDC(NULL,m_hDC);
}
void CCurtainDlg::InitProperties()
{
m_bIsActive = false;
m_crCurtain = m_crCurtain.MakeARGB(150,0,0,0);
//初始化橡皮筋
m_fRubberBandThickness = 1.5f;
m_crRubberBand = m_crRubberBand.MakeARGB(255,255,0,0);
//初始化捕获窗口
m_bIsCaptureWnd = true;
m_fCaptureWndThickness = 5.0f;
m_crCaptureWnd = m_crCaptureWnd.MakeARGB(255,0,255,255);
}
void CCurtainDlg::SetCurCaptureWndRect(CPoint point)
{
m_rtCurCaptureWndRect.SetRectEmpty();
for (unsigned i = 0; i < m_vctCaptureWndRect.size(); i++)
if (m_vctCaptureWndRect[i].PtInRect(point))
{
m_rtCurCaptureWndRect = m_vctCaptureWndRect[i];
return;
}
}
void CCurtainDlg::DrawCaptureWindowRect()
{
if(m_rtCurCaptureWndRect.IsRectEmpty())
return;
//画高亮区域
::BitBlt(m_hMemDC,m_rtCurCaptureWndRect.left,m_rtCurCaptureWndRect.top,
m_rtCurCaptureWndRect.Width(),m_rtCurCaptureWndRect.Height(),
m_hRecordDC,m_rtCurCaptureWndRect.left,m_rtCurCaptureWndRect.top,SRCCOPY);
//画框
Graphics gr(m_hMemDC);
gr.DrawRectangle(
&Pen(m_crCaptureWnd,m_fCaptureWndThickness),
m_rtCurCaptureWndRect.left,
m_rtCurCaptureWndRect.top,
m_rtCurCaptureWndRect.Width(),
m_rtCurCaptureWndRect.Height());
}
void CCurtainDlg::DrawRubberBand()
{
if(m_rtRubberBand.IsRectEmpty())
return;
//偏差修正
if(m_rtRubberBand.top < 0)
m_rtRubberBand.top = 0;
if(m_rtRubberBand.left < 0)
m_rtRubberBand.left = 0;
if(m_rtRubberBand.right > m_iWidth)
m_rtRubberBand.right = m_iWidth;
if(m_rtRubberBand.bottom > m_iHeight)
m_rtRubberBand.bottom = m_iHeight;
//画高亮区域
::BitBlt(m
没有合适的资源?快使用搜索试试~ 我知道了~
VC 仿QQ截图控件代码
共21个文件
h:6个
cpp:4个
ico:1个
5星 · 超过95%的资源 需积分: 9 27 下载量 127 浏览量
2012-08-21
13:08:17
上传
评论
收藏 1.43MB RAR 举报
温馨提示
使用Visual Studio 2012开发,以下版本可能不能正常编译 代码有详细注释
资源推荐
资源详情
资源评论
收起资源包目录
ScreenShot.rar (21个子文件)
ScreenShot
ScreenShot.sln 897B
ScreenShot.exe 3.4MB
ScreenShot.v11.suo 45KB
ScreenShot
ScreenShot.h 299B
stdafx.cpp 212B
ScreenShot.vcxproj.filters 2KB
ScreenShot.rc 13KB
CurtainDlg.h 4KB
res
ScreenShot.ico 66KB
ScreenShot.rc2 804B
normal.cur 766B
stdafx.h 1KB
ScreenShot.aps 91KB
ScreenShot.cpp 1KB
CurtainDlg.cpp 16KB
ScreenShot.vcxproj.user 164B
targetver.h 314B
ScreenShot.vcxproj 6KB
resource.h 2KB
ScreenShotDlg.cpp 3KB
ScreenShotDlg.h 621B
共 21 条
- 1
资源评论
- zhugandeni2013-05-30挺不错的 是我想要的
- veen_lee2013-07-28vs2010可以编译运行,效果很赞!顶一个!
- mnorst2012-12-30不错,很强大,可以吸附窗体
- linds0162013-09-09很强大,用的是gdiplus
- jirimie2014-01-03知识基本功能,没有我想要的窗口截图
GenesisWang
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功