如何实现WinCE截屏并保存为BMP文件

//
/*
    函数: OnScreenSave
    参数: filename为存储图片的路径
 功能: 屏幕截图并保存到所指目录下
*/
//
void OnScreenSave(const char *filename)

 DWORD dwRest = GetTickCount();
 HDC  hScrDC, hMemDC;        
 int  width, height;

 //定义指向DIB数据区的指针
 BYTE  *lpBitmapBits = NULL;

 //创建屏幕DC
 hScrDC = CreateDC(_T("DISPLAY"), NULL, NULL, NULL);

 //获取屏幕参数
 width = GetDeviceCaps(hScrDC, HORZRES);
 height = GetDeviceCaps(hScrDC, VERTRES);

 //创建内存DC
 hMemDC = CreateCompatibleDC(hScrDC);
 
 //初始化位图结构描述信息
 BITMAPINFO bitmapInfo;
 ZeroMemory(&bitmapInfo, sizeof(BITMAPINFO));
 bitmapInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
 bitmapInfo.bmiHeader.biWidth = width;
 bitmapInfo.bmiHeader.biHeight = height;
 bitmapInfo.bmiHeader.biPlanes = 1;
 bitmapInfo.bmiHeader.biBitCount = 32;   //保存为32位色深的位图

 //创建位图
 HBITMAP directBmp = CreateDIBSection(hMemDC, (BITMAPINFO*)&bitmapInfo,
  DIB_RGB_COLORS, (void **)&lpBitmapBits, NULL, 0);
 HGDIOBJ previousObject = SelectObject(hMemDC, directBmp);

 //拷贝源DC到内存DC中
 BitBlt(hMemDC, 0, 0, width, height, hScrDC, 0, 0, SRCCOPY);

 //初始化位图文件头结构
 BITMAPFILEHEADER bmBITMAPFILEHEADER;
 ZeroMemory(&bmBITMAPFILEHEADER, sizeof(BITMAPFILEHEADER));
 bmBITMAPFILEHEADER.bfType = 0x4d42;  //bmp 
 bmBITMAPFILEHEADER.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
 bmBITMAPFILEHEADER.bfSize = bmBITMAPFILEHEADER.bfOffBits + ((width*height)*3); ///3=(24 / 8)

 //准备写文件
 FILE *mStream = NULL;
 if((mStream = fopen(filename, "wb")))
 { 
  //写位图头
  fwrite(&bmBITMAPFILEHEADER, sizeof(BITMAPFILEHEADER), 1, mStream);
  //写位图描述信息
  fwrite(&(bitmapInfo.bmiHeader), sizeof(BITMAPINFOHEADER), 1, mStream);
  //写RGB数据
  fwrite(lpBitmapBits, 3*width*height, 1, mStream);

  fclose(mStream);
 }

 //资源释放
 SelectObject(hMemDC,previousObject);
 DeleteObject(directBmp);
 DeleteObject(hMemDC);
 DeleteObject(hScrDC);

 RETAILMSG(1,(TEXT("Screenshot spend %d ms/r/n"),GetTickCount()-dwRest));
}

 

另外,如果想实现两个主程序界面之间的动画切换效果,上面这个函数将十分有用:

设计思路:

假设两个主程序A、B,从A切换到B的动画

1、在B窗口刷屏之前,先取得A窗口背景的位图数据(截屏),如果需要销毁A窗口,则此时是好时机

2、获得B本身的背景位图数据

3、A与B进行相关的动画算法,比如透明,百叶窗等等

4、贴图显示

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值