因为一款特殊机型, 无法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);
}