📄 screensnapdlg.cpp
字号:
}
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 + -