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)保存到磁盘文件等功能。