首页
社区
课程
招聘
怎么把屏幕的某个部分保存为Bmp
发表于: 2005-11-11 12:29 5986

怎么把屏幕的某个部分保存为Bmp

2005-11-11 12:29
5986

用的是SDK方式写的程序,已经得到了DC和Rect,
用什么API可以把那部分图象保存到bmp?


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 7
支持
分享
最新回复 (3)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
画图工具撒,我只晓得这个
2005-11-12 23:57
0
雪    币: 214
活跃值: (70)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
mfc我会,API不会
2005-11-13 08:51
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
BOOL CGetScreenTableDlg::CopyScreenToBitmap(CRect rect)
{
        CDC dc;
        dc.CreateDC("DISPLAY",NULL,NULL,NULL);
        CBitmap bm;

        bm.CreateCompatibleBitmap(&dc,rect.Width(),rect.Height());
        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.SelectObject(pOld);
        BITMAP btm;
        bm.GetBitmap(&btm);
        DWORD size=btm.bmWidthBytes*btm.bmHeight;
        LPSTR lpData=(LPSTR)GlobalAllocPtr(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= "CopyScreen.bmp";
        CFileDialog dlgSave(FALSE, NULL, m_wszFileName, OFN_PATHMUSTEXIST | OFN_HIDEREADONLY, strFilter);
        if (dlgSave.DoModal() == IDCANCEL)
                return FALSE;
        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();       
        }
        GlobalFreePtr(lpData);
       
        return TRUE;
}
2006-4-26 18:11
0
游客
登录 | 注册 方可回帖
返回