1、进入截图状态
PRTSCRING = TRUE;//开始截图标志为TRUE
AfxGetMainWnd()->ShowWindow(SW_SHOWMAXIMIZED);//主窗口最大化
SetWindowLong(GetSafeHwnd(), GWL_EXSTYLE, ::GetWindowLongPtr(GetSafeHwnd(), GWL_EXSTYLE) | WS_EX_LAYERED);
this->SetLayeredWindowAttributes(0, (255 * 1) / 100, LWA_ALPHA);//设置透明度为1%
CButton *begin_btn = (CButton*)GetDlgItem(IDC_BTN_BEGIN);//开始截图按钮
CButton *exit_btn = (CButton*)GetDlgItem(IDC_BTN_EXIT);//退出程序按钮
begin_btn->ShowWindow(FALSE);//截图按钮不可见
exit_btn->ShowWindow(FALSE);//退出程序按钮不可见
SetClassLong(this->GetSafeHwnd(), GCL_HCURSOR, (LONG)LoadCursor(NULL, IDC_CROSS));//设置截图时的光标为十字
2、鼠标左键按下消息函数
if (PRTSCRING == TRUE)//如果是在截图状态下鼠标左键按下
{
begin_point = point;//存储鼠标左键按下的坐标
CDialogEx::OnLButtonDown(nFlags, point);
}
3、鼠标左键弹起消息函数
if (PRTSCRING == TRUE)//如果是在截图状态下鼠标左键弹起
{
PRTSCRING = FALSE;//开始截图标志为FALSE
PRTSCRED = TRUE;//截图结束标志为TRUE
end_point = point;//得到截图结束时的坐标
int weith, heith;
weith = (end_point.x > begin_point.x ? end_point.x - begin_point.x : begin_point.x - end_point.x);//截图的宽度
heith = (end_point.y > begin_point.y ? end_point.y - begin_point.y : begin_point.y - end_point.y);//截图的长度
/*如果截图的面积太小,会影响视觉感,人为增大*/
if (weith < 50)
weith = 50;
if (heith < 100)
heith = 100;
SetWindowPos(NULL, 0, 0, weith, heith, SWP_SHOWWINDOW);//把主窗口大小设置成用户截图的图片大小
//SetWindowLong(m_hWnd, GWL_STYLE, GetWindowLong(m_hWnd, GWL_STYLE) & ~WS_CAPTION); //去标题栏
//SetWindowLong(m_hWnd, GWL_EXSTYLE, GetWindowLong(m_hWnd, GWL_EXSTYLE) & ~(WS_EX_WINDOWEDGE | WS_EX_DLGMODALFRAME)); //去边框
CDC *pDesktopDC = GetDesktopWindow()->GetDC();//获取全屏幕DC
CRect rect;//获取主窗口矩形对象
this->GetClientRect(&rect);
CDC *pDC = this->GetDC();//获取主窗口DC
/*用StretchBlt函数将源矩形的位图复制到目标矩形*/
pDC->StretchBlt(0, 0, rect.Width(), rect.Height(), pDesktopDC, begin_point.x>end_point.x ? end_point.x : begin_point.x, begin_point.y > end_point.y ? end_point.y : begin_point.y, weith, heith, SRCCOPY);//核心函数,将全屏幕的截图区域复制在主窗口上面显示
::SetWindowLong(GetSafeHwnd(), GWL_EXSTYLE, ::GetWindowLongPtr(GetSafeHwnd(), GWL_EXSTYLE) | WS_EX_LAYERED);
this->SetLayeredWindowAttributes(0, (255 * 100) / 100, LWA_ALPHA);//恢复正常透明度
CButton *save_btn = (CButton *)GetDlgItem(2000);//保存截图按钮
save_btn->ShowWindow(TRUE);//这个保存按钮是我在初始化函数中生成的,本来是不可见的,当截图完成后,这个按钮就可见
4、保存按钮函数
CButton *save_btn = (CButton*)GetDlgItem(2000);//在点击了保存按钮之后,这个按钮不可见
save_btn->ShowWindow(FALSE);
CDC *pDC = GetWindowDC();//获取主窗口设备上下文
CDC memDC;//内存设备上下文
memDC.CreateCompatibleDC(pDC);
CRect rt;//获取主窗口的矩形
GetWindowRect(&rt);
CBitmap Bmp;
Bmp.CreateCompatibleBitmap(pDC, rt.Width(), rt.Height());
CBitmap *pBmpPrev = (CBitmap*)memDC.SelectObject(&Bmp);
memDC.BitBlt(0, 0, rt.Width(), rt.Height(), pDC, 0, 0, SRCCOPY);
CImage image;
image.Attach((HBITMAP)Bmp.m_hObject);
image.Save(L"c:\1.bmp");