VC编程实现交互式截屏的MFC DLL(二)

2012-03-19 21:22:59|?次阅读|上传:wustguangh【已有?条评论】发表评论

关键词:C/C++, MFC, 界面设计, 操作系统|来源:唯设编程网

8. 鼠标释放时保存用户截取的位图

用户按下鼠标左键->拖动选区->释放完成截图操作,将用户截图保存到对象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)保存到磁盘文件等功能。

<123>
发表评论0条 】
网友评论(共?条评论)..
VC编程实现交互式截屏的MFC DLL(二)