2012-03-19 21:22:59|?次阅读|上传:wustguangh【已有?条评论】发表评论
关键词:C/C++, MFC, 界面设计, 操作系统|来源:唯设编程网
用户按下鼠标左键->拖动选区->释放完成截图操作,将用户截图保存到对象CBitmap的指针类型成员变量pResBitmap所指内存中,并返回调用对话框的OnOK()方法返回。
//保存截取的位图 void CScreenSnapDlg::loadShutterBitmap(){ //必须调用重画窗口函数,否则截图会有边框 RedrawWindow(NULL); //NEW资源(调用一次重新拷贝一次) if (pResBitmap != NULL) { delete pResBitmap; pResBitmap = NULL; } //创建位图 pResBitmap = new CBitmap(); CDC *pDC=this->GetDC(); CDC MemDC; //临时设备描述表 MemDC.CreateCompatibleDC(pDC); //计算区域 int startX=startPos.x<endPos.x?startPos.x:endPos.x; //起点X坐标 int startY=startPos.y<endPos.y?startPos.y:endPos.y; //起点Y坐标 int imgWidth=abs(startPos.x-endPos.x); //图像宽度 int imgHeight=abs(startPos.y-endPos.y); //图像高度 //创建位图 pResBitmap->CreateCompatibleBitmap(pDC,imgWidth,imgHeight); MemDC.SelectObject(pResBitmap); //拷贝屏幕的区域到创建的位图中 MemDC.BitBlt(0, 0, imgWidth, imgHeight,pDC,startX, startY,SRCCOPY); MemDC.DeleteDC(); this->ReleaseDC(pDC); } //鼠标左键释放 void CScreenSnapDlg::OnLButtonUp(UINT nFlags, CPoint point) { CClientDC dc(this); endPos=point; ScreenToClient(&endPos); //将屏幕坐标转换成窗口坐标 if(m_drawRegin){ m_drawRegin=false; //关闭显示鼠标拖动区域的开关 loadShutterBitmap(); //加载截取的位图 CDialog::OnOK(); //关闭对话框 } CDialog::OnLButtonUp(nFlags, point); }
loadShutterBitmap实现了位图的拷贝操作,实现原理在VC编程实现交互式截屏的MFC DLL(一)中已经介绍,读者可以参考。
至此,一个完整的交互式截屏MFC DLL便实现了,该程序实现了类似QQ等软件的截图功能,具体包括:交互式截屏、指定区域截屏、位图(BMP)拷贝、位图(BMP)保存到磁盘文件等功能。