拷屏函数

因为一款特殊机型, 无法u口同步. 故只能采用抓屏的方式存放在外设中以便于说明书编写.   函数实现方式如下(摘录自网络,只把位图位数改为24):

//
/*
    函数: 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);
UartTrans.UARTprintf("屏幕width = %d, height = %d. /n",width,height);

//创建内存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 = 24;//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);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值