睡眠画面加载

针对应用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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值