首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 屏幕保存bmp图像,经常出错,高手给指点迷津
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • jiaqt
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 结帖率:
    发表于:2008-05-14 15:52:18 楼主
    如题,想保存一个窗口图像到bmp,从网上参考别人一段,但执行起来,经常出错,检查发现可能是DC没有释放,加上后,还是异常,请高手指点一下,感谢~!~!

                      CDC *pDC;
    CRect rect;
    CStatic *pCurve=(CStatic *)GetDlgItem(IDC_STATIC_CURVE);//保存曲线的窗口
    if(pCurve==NULL) return;
    pCurve->GetClientRect(&rect);
            pDC=(CDC *)pCurve->GetDC();
     
        CDC dc;
            dc.CreateDC("DISPLAY",NULL,NULL,NULL);
    //dc.CreateCompatibleDC(pDC);

    //rect.bottom+=15; //调整图像
    //rect.right+=15;
            CBitmap bm;
            bm.CreateCompatibleBitmap(&dc,rect.Width(),rect.Height()); //定义bmp图像的宽阔,高
            CDC tdc;
            tdc.CreateCompatibleDC(&dc);
            CBitmap*pOld=tdc.SelectObject(&bm);
            //tdc.BitBlt(0,0,rect.Width(),rect.Height(),&dc,rect.left,rect.top,SRCCOPY);
    tdc.BitBlt(0,0,rect.Width(),rect.Height(),&dc,10,50,SRCCOPY);
        tdc.SelectObject(pOld);
           
    BITMAP btm;
            bm.GetBitmap(&btm);
            DWORD size=btm.bmWidthBytes*btm.bmHeight;
            //LPSTR lpData=(LPSTR)GlobalAllocPtr(GPTR,size);
    LPSTR lpData=(LPSTR)GlobalAlloc(GPTR,size);

            BITMAPINFOHEADER bih;
            bih.biBitCount=btm.bmBitsPixel;
            bih.biClrImportant=0;
            bih.biClrUsed=0;
            bih.biCompression=0;
            bih.biHeight=btm.bmHeight;
            bih.biPlanes=1;
            bih.biSize=sizeof(BITMAPINFOHEADER);
            bih.biSizeImage=size;
            bih.biWidth=btm.bmWidth;
            bih.biXPelsPerMeter=0;
            bih.biYPelsPerMeter=0;
            GetDIBits(dc,bm,0,bih.biHeight,lpData,(BITMAPINFO*)&bih,DIB_RGB_COLORS);
            BITMAPFILEHEADER bfh;
            bfh.bfReserved1=bfh.bfReserved2=0;
            bfh.bfType=((WORD)('M' < < 8)|'B');
            bfh.bfSize=54+size;
            bfh.bfOffBits=54;

            CString strFilter = "BMP Files (*.bmp)|*.bmp|";
            CString m_wszFileName;//=m_FileName.Left(m_FileName.GetLength()-4)+".bmp";//"CopyScreen.bmp";
            CFileDialog dlgSave(FALSE, ".bmp", m_wszFileName, OFN_PATHMUSTEXIST | OFN_HIDEREADONLY, strFilter);
            if (dlgSave.DoModal() == IDCANCEL)
                return ;
            m_wszFileName = dlgSave.GetPathName();
            CFile bf;
            if(bf.Open(m_wszFileName,CFile::modeCreate|CFile::modeWrite))
            {
                    bf.WriteHuge(&bfh,sizeof(BITMAPFILEHEADER));
                    bf.WriteHuge(&bih,sizeof(BITMAPINFOHEADER));
                    bf.WriteHuge(lpData,size);
                    bf.Close();       
            }       
        GlobalFree(lpData);  

    //****************原来到这里后面,我加上了释放DC,但还是异常****************************
    //pDC->DeleteDC();
    pCurve->ReleaseDC(pDC);
    dc.DeleteDC();
    tdc.DeleteDC();
    20  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • jiaqt
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-14 15:54:161楼 得分:0
    出错位置,就在最后函数结尾的大括号处。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • gaohl
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-16 13:49:492楼 得分:0
    我这里用这段代码没问题
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Mackz
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 4

      6

      8

    发表于:2008-05-16 14:00:103楼 得分:0
    dc.CreateDC("DISPLAY",NULL,NULL,NULL);是用于拷贝屏幕的,你已经获取了控件的DC,这个就不需要了,把控件的DC作为BitBlt的源DC就可以了。
    后面再加一句bm.DeleteObject()看看。
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved