Windows Mobile下快速截屏的一种方法

本文介绍了一种在Windows CE系统中使用GAPI快速截取屏幕的方法。通过GX库函数获取显示属性并直接访问屏幕缓冲区,将屏幕内容保存为位图文件。这种方法适用于游戏开发及其他需要屏幕快照的应用场景。

    WinCE下截屏的方法有很多种,这里介绍一种利用GAPI实现的方法。GAPI是Game API的缩写,它提供了一系列函数,可以直接对屏幕缓冲区进行读/写访问。虽然现在逐渐被DirectX Mobile取代,但自从2000年首次应用在PPC上后,几乎所有的移动设备上都能看见它。GAPI主要应用于游戏开发,但也不仅限于此。下面就介绍一种在WM下如何利用GAPI快速截取屏幕的方法。

 1      struct {
 2           BITMAPINFOHEADER bmih;
 3           RGBQUAD rgq[256];
 4      } bmi;
 5      BYTE *pLCDBuffer = NULL;
 6      BITMAPFILEHEADER bmfHdr;
 7      HANDLE hFile;
 8      DWORD dwWritten;
 9      DWORD dwFrameBufferSize;
10      
11      GXOpenDisplay(NULL, NULL);
12      g_DisplayProperties = GXGetDisplayProperties();
13      pLCDBuffer = (PBYTE)GXBeginDraw();
14      dwFrameBufferSize = g_DisplayProperties.cxWidth*g_DisplayProperties.cyHeight*(g_DisplayProperties.cBPP>>3);
15  
16      ZeroMemory(&bmi, sizeof(bmi));
17      bmi.bmih.biSize = sizeof(BITMAPINFOHEADER);
18      bmi.bmih.biWidth = g_DisplayProperties.cxWidth;
19      bmi.bmih.biHeight = -g_DisplayProperties.cyHeight;
20      bmi.bmih.biPlanes = 1;
21      bmi.bmih.biBitCount = (WORD)g_DisplayProperties.cBPP;
22      bmi.bmih.biCompression = BI_BITFIELDS;
23      *(DWORD *)(&bmi.rgq[0]) = 0xF800;
24      *(DWORD *)(&bmi.rgq[1]) = 0x07E0;
25      *(DWORD *)(&bmi.rgq[2]) = 0x001F;
26  
27      ZeroMemory(&bmfHdr, sizeof(BITMAPFILEHEADER));
28      bmfHdr.bfType = 0x4d42;
29      bmfHdr.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + sizeof(DWORD)*3;
30      bmfHdr.bfSize = bmfHdr.bfOffBits + dwFrameBufferSize;
31  
32      hFile = CreateFile(_T("\\1.bmp"), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,NULL, NULL);
33      if (INVALID_HANDLE_VALUE != hFile)
34      {
35          WriteFile(hFile, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);
36          WriteFile(hFile, (LPSTR)&(bmi.bmih), sizeof(BITMAPINFOHEADER) + sizeof(DWORD)*3&dwWritten, NULL);
37          WriteFile(hFile, (LPSTR)pLCDBuffer, dwFrameBufferSize, &dwWritten, NULL);
38          CloseHandle(hFile);
39      }
40     
41      GXEndDraw();
42      GXCloseDisplay();

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值