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

📄 screensnapdlg.cpp

📁 截取屏幕部分
💻 CPP
📖 第 1 页 / 共 3 页
字号:
    }
 
    return TRUE;
}

//********************************************************************************
//* 名称:WinAnimation
//* 功能:显示窗口动画效果的涵数
//********************************************************************************
void CScreenSnapDlg::WinAnimation(BOOL ShowFlag) 
{
    CRect rect(0,0,0,0);

    // 查找托盘窗口 
    CWnd* pWnd = FindWindow("Shell_TrayWnd", NULL);
    if (pWnd)
    {
        pWnd->GetWindowRect(rect);
		EnumChildWindows(pWnd->m_hWnd, FindTrayWnd, (LPARAM)&rect);
		//rect 为托盘区矩形
		CRect rcWnd;
		GetWindowRect(rcWnd);
		if(ShowFlag)					//窗体滑向系统区
		  DrawAnimatedRects(GetSafeHwnd(),IDANI_CAPTION,rcWnd,rect);
		else							//窗体从系统区滑出
		  DrawAnimatedRects(GetSafeHwnd(),IDANI_CAPTION,rect,rcWnd);
    }
}

//////////////////////////////////////////////////////////////////////////////
//涵数名:OnScreensnap
//功能:开始抓图操作
/////////////////////////////////////////////////////////////////////////////
void CScreenSnapDlg::OnScreensnap() 
{
	SetCapture();                        //启动全屏捕捉

	if(IsWindowVisible())				 //窗体是否已隐藏
	{
		ShowWindow(SW_HIDE);             //先隐藏窗体
		WinAnimation(true);			     //窗体动画滑入到系统区中 
	}

	m_bStartSnapWindow = TRUE;

	m_Description.SetWindowText("正在进行抓图...");

	SetTimer(1,300,NULL);                //启动定时器,开始抓取图像
}

//////////////////////////////////////////////////////////////////////////////
//涵数名:OnAbout
//功能:弹出"关于"对话框
/////////////////////////////////////////////////////////////////////////////
void CScreenSnapDlg::OnAbout() 
{
	CAboutDlg AboutDlg;

	AboutDlg.DoModal();
}

//********************************************************************************
//* 名称:OnShowhide()
//* 功能:显示或隐藏对话框
//********************************************************************************
void CScreenSnapDlg::OnShowhide() 
{
	CWnd * pFrame;					 //得到当前窗体指针

	pFrame=AfxGetApp()->GetMainWnd();
	if(!pFrame->IsWindowVisible())	 //是否进行窗体动画,窗体已显示则不进行
	{
		WinAnimation(false);		 //窗体动画从系统区滑出 
		pFrame->ShowWindow(SW_SHOW);
	}
    else							 //是否进行窗体动画,窗体已隐藏则不进行
	{
        pFrame->ShowWindow(SW_HIDE);
	    WinAnimation(true);			 //窗体动画滑入到系统区中 
	}	
}

//********************************************************************************
//* 名称:OnExit()
//* 功能:退出程序
//********************************************************************************
void CScreenSnapDlg::OnExit() 
{
	m_TrayIcon.RemoveIcon();          //删除系统区图标

	SendMessage(WM_CLOSE);
}

//********************************************************************************
//* 名称:toClipboard
//* 功能:将指定窗口复制到系统剪切板中
//********************************************************************************
void CScreenSnapDlg::toClipboard(CWnd * wnd, BOOL FullWnd)
{
     CDC dc;
     if(FullWnd)
        { /* 抓取整个窗口 */
         HDC hdc = ::GetWindowDC(wnd->m_hWnd);
         dc.Attach(hdc);
        } /* 抓取整个窗口 */
     else
        { /* 仅抓取客户区时 */
         HDC hdc = ::GetDC(wnd->m_hWnd);
         dc.Attach(hdc);
        } /* 仅抓取客户区时 */

     CDC memDC;
     memDC.CreateCompatibleDC(&dc);

     CBitmap bm;
     CRect r;
     if(FullWnd)
        wnd->GetWindowRect(&r);
     else
        wnd->GetClientRect(&r);

     CString s;
     wnd->GetWindowText(s);
     CSize sz(r.Width(), r.Height());
     bm.CreateCompatibleBitmap(&dc, sz.cx, sz.cy);
     CBitmap * oldbm = memDC.SelectObject(&bm);
     memDC.BitBlt(0, 0, sz.cx, sz.cy, &dc, 0, 0, SRCCOPY);

     wnd->GetParent()->OpenClipboard();
     ::EmptyClipboard();
     ::SetClipboardData(CF_BITMAP, bm.m_hObject);
     CloseClipboard();

	 //恢复原始环境
     memDC.SelectObject(oldbm);
     bm.Detach();  
}

//********************************************************************************
//* 名称:toClipboard_Bio
//* 功能:将指定窗口复制到系统剪切板中(扩展)
//********************************************************************************
void CScreenSnapDlg::toClipboard_Bio(CWnd * wnd, BOOL FullWnd)
{
     CDC *dc;
     if(FullWnd)
        { /* 抓取整个窗口 */
		 dc = new CWindowDC(wnd);
        } /* 抓取整个窗口 */
     else
        { /* 仅抓取客户区时 */
		 dc = new CClientDC(wnd);
        } /* 仅抓取客户区时 */

     CDC memDC;
     memDC.CreateCompatibleDC(dc);

     CBitmap bm;
     CRect r;
     if(FullWnd)
        wnd->GetWindowRect(&r);
     else
         wnd->GetClientRect(&r);

     CString s;
     wnd->GetWindowText(s);
     CSize sz(r.Width(), r.Height());
     bm.CreateCompatibleBitmap(dc, sz.cx, sz.cy);
     CBitmap * oldbm = memDC.SelectObject(&bm);
     memDC.BitBlt(0, 0, sz.cx, sz.cy, dc, 0, 0, SRCCOPY);

     //直接调用OpenClipboard(),而不用wnd->GetParent()->OpenClipboard();
	 wnd->OpenClipboard();

     ::EmptyClipboard();
     ::SetClipboardData(CF_BITMAP, bm.m_hObject);
     CloseClipboard();

	 //恢复原始环境
     memDC.SelectObject(oldbm);
     bm.Detach();  

	 delete dc;
}

//********************************************************************************
//* 名称:CaptureWindowToClipboard
//* 功能:将指定窗口复制到系统剪切板中
//********************************************************************************
BOOL CScreenSnapDlg::CaptureWindowToClipboard (HWND hwndToCapture)
{
  BOOL bRet = FALSE;

  //如果"hwndToCapture"是有效窗口的话,将其复制到系统剪切板中
  if((hwndToCapture) && (::IsWindow (hwndToCapture)))
  {
    bRet = TRUE;
    toClipboard_Bio((CWnd *)CWnd::FromHandle (hwndToCapture), TRUE);
  }

  return bRet;
}

//********************************************************************************
//* 名称:RefreshWindow
//* 功能:刷新选中的图像窗口,消除高度显示
//********************************************************************************
long CScreenSnapDlg::RefreshWindow (HWND hwndWindow)
{
  long lRet = 0;

  ::InvalidateRect(hwndWindow, NULL, TRUE);
  ::UpdateWindow (hwndWindow);
  ::RedrawWindow (hwndWindow, NULL, NULL, RDW_FRAME | RDW_INVALIDATE | RDW_UPDATENOW | RDW_ALLCHILDREN);

  return lRet;
}

//********************************************************************************
//* 名称:HighlightFoundWindow
//* 功能:高度显示选中的图像窗口
//********************************************************************************
long CScreenSnapDlg::HighlightFoundWindow (HWND hwndFoundWindow)
{
  HDC		hWindowDC = NULL;  
  HGDIOBJ	hPrevPen = NULL;   
  HGDIOBJ	hPrevBrush = NULL; 
  RECT		rect;              
  long		lRet = 0;
  HPEN      hRectanglePen = CreatePen (PS_SOLID, 3, RGB(256, 0, 0));

  ::GetWindowRect(hwndFoundWindow, &rect);

  //获取选中窗口DC
  hWindowDC = ::GetWindowDC(hwndFoundWindow);

  if (hWindowDC)
  {
    //选取自定义的高亮矩形画笔
    hPrevPen = SelectObject(hWindowDC, hRectanglePen);

    //选取自定义的高亮画刷
    hPrevBrush = SelectObject (hWindowDC, GetStockObject(HOLLOW_BRUSH));

    //在选中的图像窗口四周绘制高亮矩形
    Rectangle(hWindowDC, 0, 0, rect.right - rect.left, rect.bottom - rect.top);

    //恢复原始画笔、画刷
    SelectObject (hWindowDC, hPrevPen);

    SelectObject (hWindowDC, hPrevBrush);

    //释放DC
    ::ReleaseDC (hwndFoundWindow, hWindowDC);
  }

  //删除创建的矩形画笔
  if(hRectanglePen)
	DeleteObject (hRectanglePen);

  return lRet;
}

//********************************************************************************
//* 名称:OnLButtonDown
//* 功能:鼠标左键按下时,实现无标题移动
//********************************************************************************
void CScreenSnapDlg::OnLButtonDown(UINT nFlags, CPoint point) 
{
	//实现窗体无标题移动
	PostMessage(WM_NCLBUTTONDOWN,HTCAPTION,MAKELPARAM(point.x,point.y));
	
	CDialog::OnLButtonDown(nFlags, point);
}

//********************************************************************************
//* 名称:CheckWindowValidity
//* 功能:检验选中窗口的有效性
//********************************************************************************
BOOL CScreenSnapDlg::CheckWindowValidity(HWND hwndToCheck)
{
  HWND hwndTemp = NULL;
  BOOL bRet = TRUE;

  //不能为空
  if (hwndToCheck == NULL)
  {
    bRet = FALSE;
	return bRet;
  }

  //必须是一个不效窗口
  if (IsWindow(hwndToCheck) == FALSE)
  {
    bRet = FALSE;
	return bRet;
  }

  //确定它不是先前选中的窗口
  if (hwndToCheck == m_hwndFoundWindow)
  {
    bRet = FALSE;
	return bRet;
  }

  //不能是程序主窗口
  if (hwndToCheck == this->m_hWnd)
  {
    bRet = FALSE;
	return bRet;
  }

  //不能是程序中的子窗口
  hwndTemp = ::GetParent(hwndToCheck);
  if ((hwndTemp == this->m_hWnd))
  {
    bRet = FALSE;
	return bRet;
  }

  return bRet;
}

//********************************************************************************
//* 名称:OnTimer
//* 功能:鼠标移动时,获取并高亮显示选中图像窗口
//********************************************************************************
void CScreenSnapDlg::OnTimer(UINT nIDEvent) 
{
	if(m_bStartSnapWindow)					//当正在抓取操作时
	{
		POINT		CursorPoint;
		HWND		hwndFoundWindow = NULL;
		
		GetCursorPos(&CursorPoint);  
		
		//从当前鼠标所在点位置,获取其窗口句柄
		hwndFoundWindow = ::WindowFromPoint(CursorPoint);
		
		//检验选中窗口的有效性
		if (CheckWindowValidity(hwndFoundWindow))
		{
			
			//如果先前有选中的窗口,则刷新它,以消除它的高亮显示
			if (m_hwndFoundWindow)
			{
				RefreshWindow(m_hwndFoundWindow);
			}
			
			//得到选中窗口的句柄
			m_hwndFoundWindow = hwndFoundWindow;
			
			//高亮显示选中窗口
			HighlightFoundWindow(m_hwndFoundWindow);
		}

⌨️ 快捷键说明

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