您的位置:首页 > 编程语言 > Go语言

WinCE增加开机Logo及滚动条

2010-07-22 10:56 260 查看
目前手头的项目需要增加一个开机LOGO和滚动条,要求滚动条可以真实反映系统镜像加载的情况。



Wince启动过程分为三个部分,Steploader, Eboot, NK,如果***开机界面的话,主要是在Eboot以及NK部分。对于Eboot,主要是可以反映系统镜像的复制情况,系统镜像的加载占据了绝大多数启动时间,而NK部分主要是驱动的加载。这部分时间相对于系统镜像加载时间还是很小的。所以我打算把启动界面和进度条都做在Eboot里面。在网上找了些例子,一般的方式都是把一张和系统分辨率一致的BMP图片转换成数组编译到程序中,然后直接使用该数组填充显存。但是这样做有个不好的地方就是一般这个图片的尺寸较大,会导致Eboot的大小过大,甚至超过512KB。



后来发现友坚Idea6410的BSP中使用了一个简单的UI库,可以加载BMP文件,显示BMP文件。于是就直接用这个库显示LOGO。好处是不需要用一整张屏幕尺寸的BMP,仅需要LOGO本身就可以了,因为实际使用中,一般情况下背景大部分都是黑色的,只有屏幕中间显示一个LOGO,类似WindowsXP的启动界面,如下图所示。这样我们只需要保存一个LOGO就可以了,其他地方可以用黑色填充。






1. 进度条:
Step1: 在main函数中画出进度条的边框。

#define LEFT 298
#define RIGHT 502
#define HEIGHT 15

	for (i = LEFT + 3; i <= RIGHT - 3; i++) 
	{
		*(fbp_cp + i) = 0xb5b6;
		*(fbp_cp + i + LCD_WIDTH * HEIGHT) = 0xb5b6;
	}

	for (i = 3 ; i <= HEIGHT - 3; i++) 
	{
		*(fbp_cp + LEFT + i * LCD_WIDTH) = 0xb5b6;
		*(fbp_cp + RIGHT + i * LCD_WIDTH) = 0xb5b6;
	}

	*(fbp_cp + LEFT + 1 + 2 * LCD_WIDTH) = 0xb5b6;
	*(fbp_cp + LEFT + 2 + 1 * LCD_WIDTH) = 0xb5b6;
	*(fbp_cp + RIGHT - 1 + 2 * LCD_WIDTH) = 0xb5b6;
	*(fbp_cp + RIGHT - 2 + 1 * LCD_WIDTH) = 0xb5b6;

	*(fbp_cp + LEFT + 1 + 13 * LCD_WIDTH) = 0xb5b6;
	*(fbp_cp + LEFT + 2 + 14 * LCD_WIDTH) = 0xb5b6;
	*(fbp_cp + RIGHT - 1 + 13 * LCD_WIDTH) = 0xb5b6;
	*(fbp_cp + RIGHT - 2 + 14 * LCD_WIDTH) = 0xb5b6;

}


Step2: 移植bootpart代码到Eboot中,在BP_ReadData中更新滚动条本身,反映当前加载的情况。

dwPercent = dwCurrentSects * 100 / dwTotalSects + 1;

		//RETAILMSG (1, (TEXT("TotalSectors=%d CurrentSectors=%d Percent=%d./r/n"), dwTotalSects, dwCurrentSects, dwPercent));

		if(dwPercent == 1)
		{
			for (inum = 2; inum <= 15 -2; inum++) 
			{
				memcpy(pFB + LEFT + 2 + dwPercent -1
					
					+ inum * LCD_WIDTH, blueline, 2);
			}
		}

		for (inum = 2; inum <= 15 -2; inum++) 
		{
			memcpy(pFB + LEFT + 2 + dwPercent * 2  + inum * LCD_WIDTH, blueline, 2);
		}



2. Logo

Step1: 将BMP格式LOGO图片转换成数组,我自己写了一个小工具,可以自动生成Logo.h

long fileLength;

            defination = tbDefination.Text;
            StreamWriter outputFile = new StreamWriter(dictorypath + "logo.h");
            outputFile.AutoFlush = true;

            FileStream inputFile = new FileStream(filepath, FileMode.Open);
            fileLength = inputFile.Length;

            BinaryReader binaryReader = new BinaryReader(inputFile);

            //PrintHeader(outputFile);

            outputFile.WriteLine("#ifndef _LOGO_H_");
            outputFile.WriteLine("#define _LOGO_H_");
            outputFile.WriteLine("/n");

            outputFile.WriteLine(defination + " [" + fileLength.ToString() + "] =");
            outputFile.WriteLine("{");

            byte b;
            long count = 1;

            while(count <= fileLength)
            {
                b = binaryReader.ReadByte();
                outputFile.Write("  0x" + b.ToString("x02") + ",");

                if(count % 16 == 0 && count != 0)
                {
                    outputFile.Write("/n");
                }
                count++;
            }

            outputFile.Write("/n");
            outputFile.WriteLine("};");
            outputFile.WriteLine("/n");
            outputFile.WriteLine("#endif    // _LOGO_H_");

            outputFile.Flush();
            inputFile.Close();
            outputFile.Close();


Step2: 将BMP图片导入到内存

s_logo.width = LCD_WIDTH;
		s_logo.height = LCD_HEIGHT;
		s_logo.lineBytes = LCD_WIDTH * 2;
		s_logo.startAddr = (char *)EBOOT_LOGOCACHE_UA_START;
		mv_loadBmp(logo, &s_logo);


Step3: 显示LOGO到指定位置

mv_drawBitmap(250, 180, &s_logo, NULL, NULL);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: