⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 screensnapdlg.cpp

📁 截取屏幕部分
💻 CPP
📖 第 1 页 / 共 3 页
字号:
//////////////////////////////////////////////////////////////////////////////
//类名:CScreenSnapDlg
//功能:轻松抓图实现对话框
/////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "ScreenSnap.h"
#include "ScreenSnapDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#define WM_SNAPHOTKEY WM_USER + 101  //自定义系统热键消息,用来抓图
#define WM_TRAYNOTIFY WM_USER + 100  //自定义系统托盘消息
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// Dialog Data
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	CPictureEx	m_Flag;				//GIF动态图像显示
	CHyperLink	m_Mail;				//超链接形式显示EMAIL
	CWBButton	m_OK;				//位图按钮
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAboutDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:
	//{{AFX_MSG(CAboutDlg)
	virtual BOOL OnInitDialog();
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	DDX_Control(pDX, IDC_FLAG, m_Flag);
	DDX_Control(pDX, IDC_STATIC_MAIL, m_Mail);
	DDX_Control(pDX, IDOK, m_OK);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

//////////////////////////////////////////////////////////////////////////////
//涵数名:OnInitDialog
//功能:初始化"关于"对话框
/////////////////////////////////////////////////////////////////////////////
BOOL CAboutDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	//设置“关于”对话框的位图按钮显示
	m_OK.LoadBitmaps(IDB_BUTTON,5, 5, 5, 5, 4 );

	//加入EMAIL的超连接
    m_Mail.SetURL(_T("mailto:ssliu@mail.ustc.edu.cn"));
	m_Mail.SetUnderline(FALSE);	

	//显示动态GIF图像logo
	if(m_Flag.Load(MAKEINTRESOURCE(IDR_FLAG),_T("GIF")))
	{
		m_Flag.SetBkColor(RGB(160,180,220));
		m_Flag.Draw();	
	}	

	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

/////////////////////////////////////////////////////////////////////////////
// CScreenSnapDlg dialog
CScreenSnapDlg::CScreenSnapDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CScreenSnapDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CScreenSnapDlg)
	//在此初始化使用说明文字信息
	m_Usage = _T("\n使用说明: \n    点击<抓图>按钮后开始抓取图像,用鼠标选中您要抓取的图像范围后(鼠标会自动高亮显示该图像),按键盘上的<F3>热键既可完成抓图。程序会自动将此选中图像复制到系统剪切板中,然后到您需要它的文档或画图中,直接粘贴既可,您还可以将已经抓好的图形保存到本地硬盘上。 同时,支持屏幕右下角的系统区图标交互操作。");
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	//系统区显示的图标文件
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CScreenSnapDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CScreenSnapDlg)
	DDX_Control(pDX, IDC_SAVEBMP, m_Save);
	DDX_Control(pDX, IDC_DESCRIPTION, m_Description);
	DDX_Control(pDX, IDC_HIDEWINDOW, m_Hide);
	DDX_Control(pDX, IDCANCEL, m_Exit);
	DDX_Control(pDX, IDC_SCREENSNAP, m_Snap);
	DDX_Control(pDX, ID_ABOUT, m_About);
	DDX_Text(pDX, IDC_USAGE, m_Usage);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CScreenSnapDlg, CDialog)
	//{{AFX_MSG_MAP(CScreenSnapDlg)
	ON_MESSAGE(WM_TRAYNOTIFY, OnTrayNotification)  //自定义系统托盘消息涵数 
	ON_MESSAGE(WM_HOTKEY,OnHotKey)				   //自定义系统热键消息涵数
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_SCREENSNAP, OnScreensnap)
	ON_BN_CLICKED(ID_ABOUT, OnAbout)
	ON_COMMAND(IDR_SHOWHIDE, OnShowhide)
	ON_COMMAND(IDR_EXIT, OnExit)
	ON_WM_LBUTTONDOWN()
	ON_WM_TIMER()
	ON_BN_CLICKED(IDC_HIDEWINDOW, OnHideWindow)
	ON_COMMAND(IDR_SNAPWINDOW, OnSnapWindow)
	ON_BN_CLICKED(IDC_SAVEBMP, OnSavebmp)
	ON_COMMAND(IDR_ABOUT, OnAbout)
	ON_COMMAND(IDR_SAVEBMP, OnSaveBmp)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CScreenSnapDlg message handlers
//////////////////////////////////////////////////////////////////////////////
//涵数名:OnInitDialog
//功能:初始化对话框
/////////////////////////////////////////////////////////////////////////////
BOOL CScreenSnapDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Add "About..." menu item to system menu.

	// IDM_ABOUTBOX must be in the system command range.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
    
	//创建系统区图标
	if (!m_TrayIcon.Create(this, 
				IDR_POPUPMENU, 
				_T("轻松抓图袖珍版 V1.0"), 
				&m_hIcon, 
				1,							//一幅图像
				1000,						//延时1秒变化
				WM_TRAYNOTIFY))
	{
		AfxMessageBox(_T("错误:创建系统图标失败!"), MB_OK | MB_ICONSTOP);
		return -1;
	}

	//设置位图按钮显示
	m_Snap.LoadBitmaps(IDB_BUTTON,5, 5, 5, 5, 4 );
	m_Save.LoadBitmaps(IDB_BUTTON,5, 5, 5, 5, 4 );
	m_Hide.LoadBitmaps(IDB_BUTTON,5, 5, 5, 5, 4 );
	m_About.LoadBitmaps(IDB_BUTTON,5, 5, 5, 5, 4 );
	m_Exit.LoadBitmaps(IDB_BUTTON,5, 5, 5, 5, 4 );

	//描述信息初始值
	m_Description.SetWindowText("抓图操作开始后,按F3键完成抓图!");

	//初始置抓取图像窗口操作为假
	m_bStartSnapWindow = FALSE;

	//初始置选中图像窗口为空
	m_hwndFoundWindow = NULL;

	//注册系统热键,用来热键抓图<F3键>
	RegisterHotKey(GetSafeHwnd(),WM_SNAPHOTKEY,NULL ,VK_F3);

	//初始置窗体位于最顶层
	SetWindowPos(&wndTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
	
	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CScreenSnapDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CScreenSnapDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		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;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CScreenSnapDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

//********************************************************************************
//* 名称:OnHotKey
//* 功能:F3键释放抓取操作,并复制选中图像窗口到系统剪切板中
//********************************************************************************
LRESULT CScreenSnapDlg::OnHotKey(WPARAM wParam,LPARAM lParam)
{
	if(wParam==WM_SNAPHOTKEY)
	{
	  if(m_bStartSnapWindow)								//当正在抓取操作时
	  {
		ReleaseCapture();									//释放全屏捕捉
		
		m_bStartSnapWindow = FALSE;							//重置抓取操作为假

		KillTimer(1);										//消除抓取定时器操作
		
		if (m_hwndFoundWindow)								//如果已有选中窗口的话,则刷新它
		{
			RefreshWindow (m_hwndFoundWindow);
		}

	    CaptureWindowToClipboard(m_hwndFoundWindow);		//将选中的图像窗口复制到系统剪切板中
		Sleep(500); 
		ShowWindow(SW_SHOW);                                //恢复窗口正常显示
		m_Description.SetWindowText("已成功的将选中图像复制到系统剪切板中!");
	  }
	}
	
	return 0;
}

//********************************************************************************
//* 名称:DestroyWindow
//* 功能:程序关闭时的处理工作
//********************************************************************************
BOOL CScreenSnapDlg::DestroyWindow() 
{
	if(m_bStartSnapWindow)									//当正在抓取操作时
	{
		ReleaseCapture();									//释放全屏捕捉
		
		m_bStartSnapWindow = FALSE;							//重置抓取操作为假

		KillTimer(1);										//消除抓取定时器操作
		
		if (m_hwndFoundWindow)								//如果已有选中窗口的话,则刷新它
		{
			RefreshWindow (m_hwndFoundWindow);
		}
	}

	//注销已注册的系统热键
	UnregisterHotKey(GetSafeHwnd(),WM_SNAPHOTKEY);	

	return CDialog::DestroyWindow();
}

//********************************************************************************
//* 名称:OnTrayNotification()
//* 功能:系统区创建的图标映射涵数
//********************************************************************************
LRESULT CScreenSnapDlg::OnTrayNotification(WPARAM wParam, LPARAM lParam)
{
  
  return m_TrayIcon.OnTrayNotification(wParam, lParam);
}

//********************************************************************************
//* 名称:FindTrayWnd
//* 功能:在显示窗体动画效果前,先寻找系统区位置
//********************************************************************************
BOOL CALLBACK FindTrayWnd(HWND hwnd, LPARAM lParam)
{
    TCHAR szClassName[256];
    GetClassName(hwnd, szClassName, 255);

    // 比较窗口类名
    if (_tcscmp(szClassName, _T("TrayNotifyWnd")) == 0)
    {
        CRect *pRect = (CRect*) lParam;
        ::GetWindowRect(hwnd, pRect);
        return TRUE;
    }

    // 当找到时钟窗口时表示可以结束了
    if (_tcscmp(szClassName, _T("TrayClockWClass")) == 0)
    {
        CRect *pRect = (CRect*) lParam;
        CRect rectClock;
        ::GetWindowRect(hwnd, rectClock);
        pRect->right = rectClock.left;
        return FALSE;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -