针对应用Windows CE系统的掌上设备,在系统进入睡眠状态前加载并显示睡眠画面。通过读取注册表查找所要加载的BMP格式图片,并读取图片信息。
对于横屏设备,图片水平放置;对于竖屏设备,图片逆时针旋转90度放置。
首先读取注册表信息:
SleeppicError = RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("Drivers//Display//Sleeppic"), 0, KEY_READ, &hKeySleeppic);
if( SleeppicError != ERROR_SUCCESS )
{
return FALSE;
}
SleeppicError = RegQueryValueEx( hKeySleeppic, TEXT("SleeppicFilePath"), NULL, NULL, (LPBYTE)Sleeppicnamebuf, &dwDataSizeSleeppic );
if( SleeppicError != ERROR_SUCCESS )
{
RegCloseKey(hKeySleeppic);
return FALSE;
}
RegCloseKey(hKeySleeppic);
然后打开文件并读取文件信息:
hFileSleeppic = CreateFile((LPCTSTR)Sleeppicnamebuf, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
ReadFile(hFileSleeppic, (LPSTR)&bf, sizeof(BITMAPFILEHEADER), &dwBytesReadSleeppic, NULL);
ReadFile(hFileSleeppic, (LPSTR)&bi, sizeof(BITMAPINFOHEADER), &dwBytesReadSleeppic, NULL);
通过读取bi.biBitCount判断BMP图片位数,再针对16位、24位分别加载图片:
//读取16位位图数据
case 16:
switch(bi.biCompression) //判断图象数据压缩的类型
{
//读取16位无压缩555格式位图数据
case 0:
SetFilePointer(hFileSleeppic, -(2 * PicWidth), NULL, FILE_END);
for(a = 0; a < PicHeight; a++)
{
for(b = 0; b < PicWidth; b++)
{
ReadFile(hFileSleeppic, Sleeppicbuf + 2 * PicWidth * a + 2 * b, 2, &dwBytesReadSleeppic, NULL);
temp = Sleeppicbuf[2 * PicWidth * a + 2 * b];
nGreen = temp&0xe0;
nBlue = Sleeppicbuf[2 * PicWidth * a + 2 * b]&0x1f;
Sleeppicbuf[2 * PicWidth * a + 2 * b ] = (nGreen << 1)|nBlue;
Sleeppicbuf[2 * PicWidth * a + 2 * b + 1] = (Sleeppicbuf[2 * PicWidth * a + 2 * b + 1]&0x7f) << 1;
}
SetFilePointer(hFileSleeppic, -(4 * PicWidth), NULL, FILE_CURRENT);
}
CloseHandle(hFileSleeppic);
break;
//读取16位Bitfields-位域存放方式位图数据
case 3:
ReadFile(hFileSleeppic, Sleeppicbuf, 2, &dwBytesReadSleeppic, NULL);
//判断是否565格式图片,如果是则读取,不是则返回。
if(Sleeppicbuf[1] == 248)
{
SetFilePointer(hFileSleeppic, -(2 * PicWidth), NULL, FILE_END);
for(a = 0; a < PicHeight; a++)
{
ReadFile(hFileSleeppic, Sleeppicbuf + 2 * PicWidth * a, 2 * PicWidth, &dwBytesReadSleeppic, NULL);
SetFilePointer(hFileSleeppic, -(4 * PicWidth), NULL, FILE_CURRENT);
}
CloseHandle(hFileSleeppic);
}
else
{
CloseHandle(hFileSleeppic);
return FALSE;
}
break;
default:
CloseHandle(hFileSleeppic);
return FALSE;
}
break;
//读取24位位图数据
case 24:
SetFilePointer(hFileSleeppic, -(3 * PicWidth), NULL, FILE_END);
for(a = 0; a < PicHeight; a++)
{
for(b = 0; b < PicWidth; b++)
{
ReadFile(hFileSleeppic, Sleeppicbuf + 2 * PicWidth * a + 2 * b, 3, &dwBytesReadSleeppic, NULL);
nBlue = Sleeppicbuf[2 * PicWidth * a + 2 * b];
nGreen = Sleeppicbuf[2 * PicWidth * a + 2 * b + 1];
nRed = Sleeppicbuf[2 * PicWidth * a + 2 * b + 2];
value = (((nBlue & 0xfff8) >> 3)|((nGreen & 0xfffc) << 3)|((nRed & 0xfff8) << 8));
Sleeppicbuf[2 * PicWidth * a + 2 * b] = LOBYTE(value);
Sleeppicbuf[2 * PicWidth * a + 2 * b + 1] = HIBYTE(value);
}
SetFilePointer(hFileSleeppic, -(6 * PicWidth), NULL, FILE_CURRENT);
}
CloseHandle(hFileSleeppic);
break;
default:
CloseHandle(hFileSleeppic);
return FALSE;