话说大四陪MM在图书管写论文的时候,图书馆没网,也没登陆QQ之类IM。都晓得论文要图文并茂。。。。于是乎就需要截图。么法之好printscreen然后画图,麻烦到死。。。就想写个截图小工具还是很好玩的。顺便打发下无聊的时光。
网上这种工具还是很多的,但是自己写下,避免长时间不写代码手生
进入正题:写截图工具,肯定就是先搞个隐藏窗口把当前的桌面保存个bmp给画到窗口上,然后再获得鼠标事件,鼠标拖动的时候给画个轨迹,当鼠标松开的时候就将开始点和结束点方形的图片内容从内存拷贝出来,然后保存成一张图片就OK了。
原理很简单
1实现截图基本功能
2实现快捷键进入截图ctrl+alt+F10
3快捷键退出程序ctrl+alt+F9
关键代码
在触发截图的时候需要一张覆盖桌面的画有当前桌面图像的窗口
我们通过dailog来实现。
/*bo add begin*/ int x=GetSystemMetrics(SM_CXSCREEN); //获取屏幕分辨率的x int y=GetSystemMetrics(SM_CYSCREEN); //获取屏幕的分辨率的y //CDialog::SetWindowPos(NULL,0,0,x,y,SWP_SHOWWINDOW); //设置窗口的大小SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE); CDialog::ModifyStyle(WS_BORDER,0,0); //清除VC的对话框 this->SetWindowPos(&wndTopMost,0,0,x,y, SWP_SHOWWINDOW); /*bo add end*/
这样我们就根据用户的分比率实现了一个覆盖全屏的窗口
接下来要把当前的图像画到窗口上
void ShowDlgS::OnLButtonUp(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default if (!isbegin||isend) { return; } isend=true; end=point; if (begin==end) { return; } CBrush * pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));//set touming CClientDC dc(this); CBrush *pOldBrush=dc.SelectObject(pBrush);//select brush dc.Rectangle(CRect(begin,end)); dc.SelectObject(pOldBrush);//save old brush HBITMAP hbm=myGetScreenBmp(CRect(begin,end)); CFileDialog dlg(FALSE,NULL,"cut.bmp",OFN_OVERWRITEPROMPT,"(*.bmp)"); if ( dlg.DoModal()!=IDOK ) SendMessage(WM_CLOSE); //get path CString sFileName=dlg.GetPathName(); mySaveBitmapToFile(hbm,sFileName); SendMessage(WM_CLOSE); }
还有一个专门的bmp 保存 获取的类,太长了。。。可以看源码
附带程序。效果可能在某些机器上拖动会一闪一闪的。。。毕竟是当年的东西了,懒得看了。有人能完善下更好,加个画红框框、绿框框的……
点此下载:程序演示
点此下载:源码