#include "pch.h"
#include "math.h"
#include "IO.H"
#include "ScreenCatchDlg.h"
#include "Rectangle.h"
#include "Ellipse.h"
#include "ArrowLine.h"
#include "Curve.h"
#include "Inputedit.h"
#include "OutputText.h"
#include "screencatch_api.h"
#include "ScreenCatchInst.h"
#include "afxwin.h"
//#include "Color1.h"
#pragma warning(disable:4996)
extern MyRGB HBCDC;
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define GAP_BETWEEN_RECTTRACKER_AND_TOOLBAR 5 // 截图工具条CCatchToolbarDlg与矩形选择区域CCatchTracker之间的间距(竖直方向)
#define WIDTH_DRAW_PEN 3 // 绘制图形时所用的画笔粗度
#define HORIZONTAL_GAP_FROM_CURSOR 16 // 放大后区域图距离鼠标当前位置的水平距离
#define VERTICAL_GAP_FROM_CURSOR 16 // 放大后区域图距离鼠标当前位置的竖直距离
// 放大后的目标区域的大小,是参考QQ的效果来设定的(此区域大小要和背景图ENLARGE_AREA_BK.bmp中的目标区域一致)
#define ENLARGE_TARGET_AREA_WIDTH 116 // 放大后的目标区域的宽度
#define ENLARGE_TARGET_AREA_HEIGHT 84 // 放大后的目标区域的高度
// 参考QQ的效果,将鼠标周围区域的图片放大4倍,为了减少像素点的误差,
// ENLARGE_TARGET_AREA_WIDTH和ENLARGE_TARGET_AREA_HEIGHT尽量设置成4的倍数
// 以鼠标点为中心,向四周扩展,水平方向上分别向左向右扩展HORIZONTAL_OFFSET_PIXEL,竖直方向上分别向上向下扩展VERTICAL_OFFSET_PIXEL,
// 得到待放大的区域坐标
#define HORIZONTAL_OFFSET_PIXEL (ENLARGE_TARGET_AREA_WIDTH/4/2) // 4-放大倍速,2-计算当前鼠标向左向右偏移的距离(以计算出鼠标当前位置周围待放大的区域)
#define VERTICAL_OFFSET_PIXEL (ENLARGE_TARGET_AREA_HEIGHT/4/2)
#define SET_DLG_FOREGROUND_TIMER 300 // 在还没真正开始截图时定时将该截图对话框置顶,以规避有窗口跑到截图窗口之上的问题
extern void trpunc(MyRGB mma);
CScreenCatchDlg::CScreenCatchDlg(CWnd* pParent /* = NULL */)
: CDialog(CScreenCatchDlg::IDD, pParent)
{
// 初始化像皮筋类,新增的resizeMiddle类型
m_rectTracker.m_nStyle = CCatchTracker::resizeMiddle | CCatchTracker::solidLine;
m_rectTracker.m_rect.SetRect(-1, -2, -3, -4);
// 设置矩形边界颜色
m_rectTracker.SetRectColor(RGB(0, 174, 255));
// 设置矩形调整时光标,默认的比较小,设置大一点的(注意: 根据接口参数定义传入对应的光标ID)
m_rectTracker.SetResizeCursor(IDC_CUR_RESIZE_N_S, IDC_CUR_RESIZE_W_E, IDC_CUR_RESIZE_NW_SE,
IDC_CUR_RESIZE_NE_SW, IDC_CUR_MOVE_MIDDLE);
// 获取彩色光标
m_hColorCursor = AfxGetApp()->LoadCursor(IDC_CUR_ARROW_COLOR);
m_bRectCutting = FALSE;
m_bInCatchCourse = FALSE;
m_bQuit = FALSE;
m_rectTrackerStartPt = 0;
m_rectTrackerEndPt = 0;
m_pCatchToobarDlg = NULL;
m_bDrawImage = FALSE;
m_bFirstDrawArrowLine = FALSE;
m_emBtnSelected = emBtnNull; // 未选中绘图按钮,未选中绘图按钮,可以移动截取区域;选中绘图按钮后则不可以移动截图区域
m_drawStartPt = 0;
m_drawPrePoint = 0;
m_bRectTrackerMovable = TRUE;
m_bLButtonDown = FALSE;
m_bResizeTracker = FALSE;
m_rcEnlargedArea.SetRect(0, 0, 0, 0);
m_cursorPoint.SetPoint(0, 0);
m_lBtnDownPoint.SetPoint(0, 0);
m_hLightBitmap = NULL;
m_hGreyBitmap = NULL;
// 初始化刷新窗口区域 m_rgn
m_rgn.CreateRectRgn(0, 0, 50, 50);
// 加载放大区域绘制的背景图
m_pImgEnlargeAreaBk = LoadCImage(IDB_ENLARGE_AREA_BK, _T("PNG"), AfxGetInstanceHandle());
// 加载截取区域的尺寸区域绘制的背景图
m_pImgCutRectSizeDisplayBk = LoadCImage(IDB_CUTRECT_SIZE_DISPLAY_BK, _T("PNG"), AfxGetInstanceHandle());
}
CScreenCatchDlg::~CScreenCatchDlg()
{
if (m_pImgEnlargeAreaBk != NULL)
{
delete m_pImgEnlargeAreaBk;
m_pImgEnlargeAreaBk = NULL;
}
if (m_pImgCutRectSizeDisplayBk != NULL)
{
delete m_pImgCutRectSizeDisplayBk;
m_pImgCutRectSizeDisplayBk = NULL;
}
if (m_fontInputEdit.GetSafeHandle() != NULL)
{
m_fontInputEdit.DeleteObject();
}
if (m_rgn.GetSafeHandle() != NULL)
{
m_rgn.DeleteObject();
}
// 由于m_hBitmap是通过调用CopyScreenToBitmap接口获取的,在接口中
// 使用CreateCompatibleBitmap创建得到的,所以在这个需要delete掉
if (m_hLightBitmap != NULL)
{
::DeleteObject(m_hLightBitmap);
}
if (m_hGreyBitmap != NULL)
{
::DeleteObject(m_hGreyBitmap);
}
// 将图元列表中图元对象释放掉
std::vector<CShape*>::iterator it = m_vpShapeList.begin();
for (; it != m_vpShapeList.end(); it++)
{
CShape* pShape = *it;
if (pShape != NULL)
{
delete pShape;
pShape = NULL;
}
}
m_vpShapeList.clear();
if (m_pCatchToobarDlg != NULL)
{
m_pCatchToobarDlg->DestroyWindow();
delete m_pCatchToobarDlg;
m_pCatchToobarDlg = NULL;
}
}
void CScreenCatchDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//DDX_Control( pDX, IDC_EDIT_SHOW_TIP, //m_editShowTip );
}
BEGIN_MESSAGE_MAP(CScreenCatchDlg, CDialog)
ON_WM_PAINT()
ON_WM_SETCURSOR()
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_LBUTTONDBLCLK()
ON_WM_ERASEBKGND()
ON_WM_RBUTTONUP()
ON_WM_CTLCOLOR()
ON_WM_ACTIVATE()
//ON_WM_TIMER()
ON_MESSAGE(WM_UPDATE_TOOLBAR_POS, OnUpdateToolbarPos)
ON_MESSAGE(WM_DETECT_ESCAPE_KEYDOWN, OnDetectEscapeKeydown)
ON_MESSAGE(WM_DETECT_SAVE_HOTKEY_KEYDOWN, OnSaveHotKeyDown)
ON_MESSAGE(WM_BTN_CLICKED_NOTIF, OnBtnClickedNotif)
END_MESSAGE_MAP()
BOOL CScreenCatchDlg::OnInitDialog()
{
CDialog::OnInitDialog();
SetWindowText(_T("屏幕截图"));
// 获取屏幕分辩率
m_xScreen = GetSystemMetrics(SM_CXSCREEN);
m_yScreen = GetSystemMetrics(SM_CYSCREEN);
// 1、截取当前桌面图像,保存到亮色位图对象中
CRect rect(0, 0, m_xScreen, m_yScreen);
m_hLightBitmap = CopyScreenToBitmap(&rect);
if (m_hLightBitmap == NULL)
{
QuitForMemoryLack();
return FALSE;
}
// 2、截取当前桌面图像,保存到亮色位图对象中
// 暂时保存为亮色位图,后面要进行灰化处理
m_hGreyBitmap = CopyScreenToBitmap(&rect);
if (m_hGreyBitmap == NULL)
{
QuitForMemoryLack();
return FALSE;
}
// 将亮色位图灰化,保存到m_hGrayBitmap中
DoGreyLightBmp();
CDC* pDC = GetDC();
// 3、创建用于双缓冲绘图的内存DC和位图
CString strLog;
BOOL bRet = m_memDC.CreateCompatibleDC(pDC);
if (!bRet)
{
strLog.Format(_T("[CCatchScreenDlg::OnInitDialog] 创建m_memDC失败, GetLastError: %d"),
GetLastError());
WriteScreenCatchLog(strLog);
QuitForMemoryLack();
return FALSE;
}
//bRet = m_memBitmap.CreateCompatibleBitmap( pDC, rect.Width(), rect.Height() );
// 不能调用CreateCompatibleBitmap去创建位图,该函数在内存不充足时会有创建失败的问题
// 换用CreateDIBSection创建DIB设备无关位图,解决内存不足引起的创建位图失败问题
HBITMAP hMemBmp = CreateDIBBitmap(rect.Width(), rect.Height());
if (hMemBmp == NULL)
{
strLog.Format(_T("[CCatchScreenDlg::OnInitDialog] 创建hMemBmp失败, GetLastError: %d"),
GetLastError());
WriteScreenCatchLog(strLog);
QuitForMemoryLack();
return FALSE;
}
m_memBitmap.Attach(hMemBmp);
m_memDC.SelectObject(&m_memBitmap);
// 4、创建拉动鼠标动态绘制图元过程中用的临时DC和位图
bRet = m_tmpDrawDC.CreateCompatibleDC(pDC);
if (!bRet)
{
strLog.Format(_T("[CCatchScreenDlg::OnInitDialog] 创建m_tmpDrawDC失败, GetLastError: %d"),
GetLastError());
WriteScreenCatchLog(strLog);
QuitForMemoryLack();
return FALSE;
}
//bRet = m_tmpDrawBitmap.CreateCompatibleBitmap( pDC, rect.Width(), rect.Height() );
/
没有合适的资源?快使用搜索试试~ 我知道了~
功能齐全的屏幕截图MFC源码:ScreenCatch_plsu.rar
共123个文件
bmp:42个
h:30个
cpp:22个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
5星 · 超过95%的资源 17 下载量 12 浏览量
2022-03-10
12:46:01
上传
评论 3
收藏 2.79MB RAR 举报
温馨提示
C++实现功能齐全的MFC屏幕截图,使用VS2019编译,实现了屏幕截图的%80功能: 1、桌面的灰化遮罩; 2、窗口的自动套索; 3、源码可以编译成任何版本->ReleaesX64X86 DebugX64X86 4、可以选择画图颜色比如在所截取的图片上画箭头可以选择颜色、提供了比Q截图颜色更丰富的选择。
资源推荐
资源详情
资源评论
收起资源包目录
功能齐全的屏幕截图MFC源码:ScreenCatch_plsu.rar (123个子文件)
ScreenCatch.aps 335KB
TestScreenCatch.aps 105KB
jm.bmp 141KB
SPECIAL_TIP_EDIT_BK.bmp 94KB
complete.bmp 17KB
send_to_blog.bmp 14KB
curve_sel.bmp 7KB
curve.bmp 7KB
rect.bmp 7KB
arrowline.bmp 7KB
ellipse_sel.bmp 7KB
arrowline_sel.bmp 7KB
quit.bmp 7KB
ellipse.bmp 7KB
text_sel.bmp 7KB
undo.bmp 7KB
rect_sel.bmp 7KB
text.bmp 7KB
save.bmp 7KB
jp1.bmp 5KB
jp-Up.bmp 5KB
cl-1.bmp 5KB
jp-Down.bmp 5KB
cl-Up.bmp 5KB
cl-Down.bmp 5KB
cl1.bmp 5KB
jp-1.bmp 5KB
c1.bmp 1KB
e2.bmp 1KB
z1.bmp 1KB
d2.bmp 1KB
x1.bmp 1KB
z2.bmp 1KB
a2.bmp 1KB
b1.bmp 1KB
d1.bmp 1KB
x2.bmp 1KB
e1.bmp 1KB
y1.bmp 1KB
y2.bmp 1KB
a1.bmp 1KB
c2.bmp 1KB
b2.bmp 1KB
bs.bmp 1KB
ScreenCatchDlg.cpp 84KB
CatchTracker.cpp 24KB
Color1.cpp 19KB
CatchToobarDlg.cpp 16KB
SkinButton.cpp 13KB
InputEdit.cpp 6KB
EnumWindows.cpp 5KB
ScreenCatch.cpp 4KB
TestScreenCatchDlg.cpp 3KB
TestScreenCatch.cpp 3KB
common.cpp 3KB
OperateTipEdit.cpp 3KB
ArrowLine.cpp 2KB
OutputText.cpp 2KB
sc1.cpp 2KB
Curve.cpp 2KB
Rectangle.cpp 2KB
ScreenCatchInst.cpp 1KB
Ellipse.cpp 1KB
pch.cpp 158B
pch.cpp 158B
Shape.cpp 93B
Arrow_Color.cur 766B
Draw_Image.cur 326B
Move_Middle.cur 326B
Resize_N_S.cur 326B
Hand.cur 326B
Resize_W_E.cur 326B
Resize_NE_SW.cur 326B
Resize_NW_SE.cur 326B
ScreenCatch.def 213B
ScreenCatch.dll 2.95MB
TestScreenCatch.exe 3.87MB
ScreenCatch.vcxproj.filters 10KB
TestScreenCatch.vcxproj.filters 2KB
ScreenCatchDlg.h 8KB
resource.h 5KB
SkinButton.h 4KB
CatchTracker.h 4KB
CatchToobarDlg.h 3KB
Color1.h 2KB
screencatch_api.h 2KB
screencatch_api.h 2KB
EnumWindows.h 2KB
framework.h 2KB
InputEdit.h 1KB
framework.h 1KB
ScreenCatchInst.h 1KB
common.h 879B
OperateTipEdit.h 678B
TestScreenCatchDlg.h 668B
pch.h 636B
sc1.h 608B
ScreenCatch.h 580B
pch.h 572B
resource.h 556B
共 123 条
- 1
- 2
C+V代码搬运工
- 粉丝: 54
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
- 4
前往页