1.7 处理用户界面的旋转
Windows Embedded Compact 7支持以90°为增量旋转其用户界面,使Windows Embedded Compact 7设备横放使用或者坚放使用。例如,对于一般的Web Pad、Internet Appliance设备,屏幕多为横向显示,而对于掌上电脑等手持式移动设备,屏幕多为纵向显示。
目前基于Windows Embedded Compact 7设备的屏幕旋转仅支持单屏幕的旋转显示,不支持多屏幕的旋转显示,而与屏幕旋转对应的应用程序主要有两个:Shell应用程序,任务条应用程序。当出现屏幕旋转时,鼠杯和光标会自动调整以适应新的屏幕显示方向。
只有当基于Windows Embedded Compact 7设备的显示驱动支持屏幕旋转时才能真正实现屏幕的旋转显示,如果开发者使用白己的显示驱动而非Platform Builder提供的显示驱动,那么开发者必须保证自己的显示驱动支持屏幕旋转。
在Windows Embedded Compact 7中微软提供的RFlat和Geode MediaGx例显示驱动支持屏幕的旋转,RFlat驱动位于�_WINCEROOT%\ Public\Common\0AK\Drivers\Display\RFlat文件夹中,Oeode MediaGx驱动位于%_WINCEROOT%\Public\Common\OAK\CSP\X86\Geode\GXvideo文件夹中。支持旋转的显示驱动应该继承相应的旋转类,并实现一些给定的方法;
同时,支持旋转显示的驱动应该与GPERotate.iib和EmulRotate.lib进行链接。RFlar驱动的
RGPEFIat类继承于GDI的GPERotate类,同时,RFlat驱动的GetRutate ModeFromnReg函数从注册表[HKEY_LOCAL_MACHINE\SYSTEM\GDI\ROTATION]返回Angle键的dword键值并以此来决定当前的屏幕旋转角度。
在显示驱动程序支持屏幕旋转的情况下,还需要创建一个使屏幕产生旋转的应用程序并设置相应的注册表。
1.7.1 创建一个操作系统设计
创建一个支持屏幕旋转的操作系统设计,在New platform向导中进行如下选择:
・命名操作系统设计为Screen Rotation:
・从可用的BSP列表中选择Virtual PC: X86:
・从可用的设计模板列表中选择Handheld。
1.7.2 修改注册表设置
在默认情况下,当操作系统映像下载到目标平台之后,屏幕的旋转角度为0°,即不产生旋转,开发者可以通过修改相应的注册表来更改这个默认设置。随后,在目标平台上运行的任何应用程序可以旋转屏幕,覆盖这个注册表设置。表9-3展示了可以在注册表中设置的Angle子键的值。
表3-3 屏幕旋转角度Angle注册表子键
Angle的值 |
描 述 |
Ox0 |
不旋转 |
Ox5A |
顺时针旋转90° |
OxB4 |
顺时针旋转180° |
Ox10E |
顺时针旋转270° |
下面的过程设置屏幕旋转注册表键:
(l)在Solution窗口,选择ParameterFile选项卡如图1.1:
图1.1选择ParameterFile选项卡
(2)展开目录树,选择Project Specific Files结点;
(3)双击OSdesign.reg在编辑窗口中打开它;
(4)为了设置当前操作系统设计屏幕旋转的默认角度,将下列文本添加到Project.reg文件的末尾,下面的例代码将默认的屏幕角度设置为Ox5A,即90。:
: Settings to rotate the scrcen by 90 degrees clockwise upon download
[HKEY_LOCAL_MACHINE\System\GDI\Rotation]
“Angle”=dword:5A
(5)保存并关闭Project.reg文件,如图1.2:
图1.2保存并关闭Project.reg文件
1.7.3 创建屏幕旋转应用程序
这里我们将在当前的操作系统设计中创建一个使用户能操作屏幕旋转的应用程序,使用户能根据需要以90°为增量顺时针旋转屏幕。
下面过程创建一个屏幕旋转应用程序工程:
(1)打开ScreenRotation操作系统设计。
(2)从“File”菜单上选择“New Project or File”,在“Projects”选项卡上选择“MFC Smart DeviceApplication”。
(3)在“Project name”框中输入屏幕旋转应用程序工程名“Rotate”,默认情况下,Platform Builder将这个工程存储在当前操作系统设计的文件夹下.
(4)选择“Workspace Project”单选按钮,单击“OK”按钮,系统显示“New ProjectWizard”对话框。
(5)选择yincheng_OS SDK.
(6)在当前工程的创建结束后,在“FileView”选项卡的Projects目录树下会显示新创建的Rotate工程。
(7)在“Workspace”窗口中选择“ClassView”选项卡,找到WndProc回调函数,双击WndProc在编辑窗口中打开它。
(8)在WndProc函数的Switch语句中添加以下代码:
case WM_CREATE:
HWND hwndRotateButton;
hwndRotateButton= CreateWindow(TEXT(”button”).TEXT(”Rotate Me”),
WS_CHILDIWS_VISIBLE IBS_PUSHBUTTON, 50. 50.100.75. hWnd.
(HMENU)J,((LPCREATESTRUCT)iParam)->hlnstance,NULL);
break;
这段代码通过在WM_CREATE消息中添加一个“Rotate Me”按钮来为用户提供一个界面,允许用户通过单击这个按钮来旋转屏幕。WM_CREATE消息是在应用程序主窗口创建时自动被调用的。
(9)为了处理Rotate按钮消息,需要在WndProc函数的Switch语句中添加“case WM_ COMMAND ”消息处理语句,当用户按下“Rotate Me”按钮时,应用程序调用WM_COMMAND消息。
下面的“case WM_COMMAND”代码响应“Rotate”按钮来设置屏幕旋转:
case WM_COMMAND:
// 返回当前屏幕方向
DEVMODE devMode;
memset(&devMode.0x00,sizeof( devMode));
devMode.dmSize =sizeof(devMode);
devMode.dmFields= DM_DISPLAYORIENTATION:
ChangeDisplaySettingsEx(NULL,&devMude,NULL,CDS_TEST.NULL);
// 计算新的旋转角度
switch( devMode.dmDisplayOrientation)
{
case DMDO_0:
devMode,dmDisplayOnentation= DMD0_90;
break;
case DMD0_90;
devMode,dmDisplayOrierjtation = DMDO_180;
break;
case DMD0_180:
devMode.dmDisplayOrientation = DMD0_270;
break:
case DMD0_270:
devMode.dmDisplayOrientat.ion = DMDO_0:
break:
default;
devMode.dmDisplayOrientaiion = DMDO_0;
Break ;
�y
// 设置新的屏幕方向
devMode.dmFields =DM_DISPLAYORIENTATION;
ChangeDisplaySetcingsEx(NULL.&devMode.NULL,CDS_RESET.NULL);
break;
在以上代码中,使用ChangeDisplaySettingsEx函数将特定显示设备设置为特定的图形模式,如果设置成功,则操作系统将向所有运行的应用程序发送WM_SETTINGCHANGE消息。同时,上面的代码还使用了DEVMODE结构来查询显示驱动程序支持的旋转角度。
(10)在设置新的屏幕方向之后,还需要在WndProc函数的Switch语句中添加“case WM_ SETTINGCHANGE ”消息来旋转屏幕显示,代码如下:
case WM_SETTINGCHANGE
// 在旋转之后刷新显示器
Sleep(250); // 给系统一点时间完成旋转
int Screen_x, Screen_y;
Screen_x= GetSystemMetricsf( SM_CXSCREEN); // 获得屏幕x和Y方向的尺寸
Screen_y= GetSyscemMetrics( SM_CYSCREEN);
MoveWindowthWnd,0,O,Screen_x, Screen_y, TRUE); // 改变窗口大小并重画窗口
Break;
(11)保存Rotate.cpp文件。
1.7.4 创建并下载操作系统运行时映像
创建并下载操作系统运行时映像的过程如下:
(1)从Platform builder工具条的“Set Active Configuration”下拉式列表中选择“Virtual PC: X86” 配置。
(2)在“Build OS”菜单上,确认选择了"Clean Before Building"、“Copy Files to Release Directory after Build”和“Make Run _Time Image After Build”选项。
(3)执行“Build OS”菜单上的“Sysgen”命令,创建操作系统运行时映像。
(4)在创建结束后,单击“Target”菜单上的“Conectivity Options”命令,配置目标设备连接。
(5)打开Virtual PC: X86虚拟机,单击Platform Builder的“Target”菜单上“Attach Device”命令,下载并在Virtual PC: X86虚拟机上运行操作系统运行时的映像,正常情况下一会就会在目标设备上看到Windows Embedded Compact 7桌面。
1.7.5 运行屏幕旋转应用程序测试屏幕旋转
单击Virtual PC: X86 目标设备上的“Start”菜单,选择“Run”,键入“Rotate”,运行Rotate应用程序。
单击Rotate应用程序上的“Rotate Me”按钮,确认屏幕以顺时针90°方向发生了旋转。
1.8 定制用户界面
Windows Embedded Compact 7 允许开发者对它的用户界面进行全方位的定制,以使开发者的产品区别于其他用户的产品,本节将详细讨论定制Windows Embedded Compact 7用户界面的换肤技术。
1.8.1 创建一个皮肤
Windows Embedded Compact 7允许开发者创建一个完全定制的用户界面,一般将这个定制的用户界面称为皮肤(Skin),即一个定制用户界面的过程也就是一个创建皮肤(Create a Skin)的过程,它允许定制控件的外表以及其他用户界面元素等。这种定制用户界面的能力使OEM或开发者可以定制适合于自己产品或自身风格的产品显示界面,提高产品的灵活性,增加产品的吸引力。
为了支持创建皮肤,Windows Embedded Compact 7将控件和窗口的非客户区域的绘图代码与实现那些用户界面元素的其他代码区分开来。例如,在Windows Embedded Compact 7E中滚动条的实现由两个组件构成:Sbcmn和Sbcmnview,Sbcmnview组件包含的是滚动条的绘图代码,而Sbcmn包含的是实现滚动条的其余代码。通过这种区分,当开发者在创建一个皮肤时,只需要修改控件和窗口非客户区域的绘图代码,而不需要修改其他部分的代码。
在Windows Embedded Compact 7中,可换肤的用户界面元素的绘图代码被放置在$(_WINCEROOT)\ public\ common \oak\drivers \skinnableui. 文件夹中。每个可定制的控件以及窗口的非客户区域都对应于一个c++类,开发者可以通过改变这些类所包含的实现方法来定制用户界面。如果开发者基于除家庭网关和数字媒体接收机之外的设计模板创建一个包含完整用户界面的操作系统设计,在创建操作系统运行映像时,Platform Builder会自动将修投后的代码结合到GWES模块。因此,由于开发者修改的代码作为GWES模块的一部分来运行,所以开发者必须细心并保证修改的代码运行可靠且不会影响操作系统的稳定性。
1.8.2 可以被换肤的用户界面元素
可以被换肤的用户界面元素主要包括以下三类:
・ 常用控件( Common Controls);
・ 窗口控件(Windows Controls);
・ 窗口的非客户区域。
1.常用控件
常用控件可修改的代码忙于%_WINCEROOT%\Public\Common\Oak\Drivers\Skinnableui\Commctrl文件夹中。表1-4对可定制其界面的常用控件进行了总结,列出了这些控件的名称、包含可定制控件实现方法的类名、实现方法所在的文件以及可定制的控件元素。
表1-4可定制UI的常用控件
控件名称 |
类 |
文件名 |
可定制元素 |
Header control |
HeaderView _t |
Headerview.cpp |
Bitmap图片或文本的位置,Header按钮的边界.Header控件的高度 |
Progress bar |
ProgressBarView_t |
Progressview.cpp |
用于绘制整个进度条的代码 |
Rebar |
RebarView_t |
Rebarview.cpp |
Gripper(分割线)、项与项之间的间隔 |
Tab control |
TabView_ t |
TabView.cpp |
绘制选项卡控件的代码 |
Toolbar |
ToolBarView _t |
ToolBarView.cpp |
按钮图片的位置,按钮边界.下拉箭头.按钮边界矩形,按钮之间的间隔,系统定义的Bitmap图片 |
Trackbar |
TrackBarView _t |
TrackBarView.cpp |
通道(Channel),焦点矩形,滑动条和刻度标记 |
Up-down |
UpdownView_t |
Updownview.cpp |
按钮的样式,边界和边界矩形 |
值得读者注意的是,不能通过创建皮肤的方法定制下列常用控件:
・ Date and time picker;
・ Image list;
・ List view;
・ Month calendar control;
・ Status bar;
・ ToolTip control;
・ Tree view .
2.窗口控件
窗口控件可修改的代码位于%_WINCEROOT%\Public\Common\Oak\Drjvers\Skinnableui\Gwe文件夹中。表1-5对可定制其界面的窗口控件进行了总结,列出了这些控件的名称、包含可定制控件实现方法的类名、实现方法所在的文件以及可定制的控件元素。
表1-5可定制UI的窗口控件
控件名称 |
类 |
文件名 |
可定制元素 |
Button |
Button View _t |
Brnet\ButtonView.cpp |
拔钮的状态、样式和文本,分组框的文本和着色,Hit_test代码,绘制单选按钮、多选框和按钮的代码 |
Cornho box |
Cornho boxView_t |
Cmbctl\Cornho boxView.cpp |
边界样式,焦点矩形,边界矩形顶部的y坐标 |
ListBox |
ListBoxView_t |
Lbetlview\ListBoxView.cpp |
项日的高度、焦点矩形,绘制项目文本的y坐标 |
Scroll Bar |
Scroll BarView_t |
Sbemn\Scroll BarView.cpp |
滑块的坐标代码,确定滚动条特定点位置的代码,确定滑块位置并绘制滑块的代码,滚动条绘制代码 |
Static control |
Static controlView_t |
Stcctl\Static controlView |
静态控件的图像和文本格式 |
3.窗口的非客户区域
为了定制窗口的非客户区域开发者可以修改NonClientView_t类的实现方法,实现这些方法的代码位于_WINCEROOT%\Public\Common\OaklDrivers\Skinnableui\Gwe\Nclient\Nclientview.cpp文件中。表1-6列出了NonCUentView_t类中开发者可修改的方法。
表1-6NonClientView-t类中可修改的方法
方法 |
描述 |
NonClientView_t: :BoundingRect |
返回边界矩形的坐标 |
NonClientView_t: :BoundPoint |
限制屏幕,可触及的矩形坐标 |
NonClientView_t::CalcClientRectWithHorzScrollBars |
确定一个具有水平滚动条的窗口客户区域的大小,对于没有水平滚动条的窗口给出客户矩形的大小 |
NonClientView_t: :CalcClientRectWithNoScrollBars |
确定一个没有水平滚动条的窗口客户区域的大小 |
NonClientView_t::CalcClientRectWithVertScrollBars |
确定―个具有垂直滚动条的窗口客户区域的大小,对于没有垂直滚动条的窗口给出客户矩形的大小 |
NonClientView_t : : DoesHorz ScrollBarFit |
确定一个水平滚动条是否适合于一个窗口 |
NonClientView_t : :DoesVertScrollBarFit |
确定一个垂直滚动条是否适合于一个窗口 |
NonClientView_t: : DoHitTest |
确定在非客户区域是否出现一个单机(hit)以及单机的位置 |
NonClientView_t: :DoPaint |
绘制非客户区域 |
NonClientView_t: :DrawBorder |
允许绘制分组框的边界 |
NonClientView_t: :DrawFrameControl |
绘制特定类型和样式的框架(Frame)控件 |
NonClientView_t: :ExposedDrawFrameControl |
绘制特定类型和样式的框架(Frame)控件,它是NonClientView_t:DrawFrameControl函数的一个更新版本 |
NonClientView_t: :WidretRect |
计算在非客户区域的一个按钮的大小 |
1.8.3 附加的用户界面定制选项
除了常用控件、窗口控件和窗口非客户区域之外,开发者还可以定制下列用户界面组件:
・ 系统颜色;
・ 字符;
・ 操作系统用户界面组件。
1. 系统颜色
开发者可以通过修改注册表HKEY_LOCAL_MACHINE\SYSTEM\GWEISysColor的注册表入口来定制系统显示元素的颜色,这个注册表入口是一个由29个DWORD值组成的二进制大对象(Binary Large Object,BLOB)。下面是定义系统颜色注册表的一个例子:
[HKEY_LOCAL_MACHINE\SYSTEM\GWE]
"SysColor"=hex : EO, EO*EO, 00. 00,80.8 0,00. SO, 80.FF.OO , SO, 80.80,00.
co,co.co, 00. FF, FF.FF.OO, 00 , oo.oo .oo, oo.oo.o n.oo,
00.00,00,00. FF.FF.OO,OO, CO.CO.CO,OO. co,cotco.oo.
80.80, so,oo, OO ?OO.FF.oo. FF.OO.OO.OO , COTCO,CO.OO.
80, 80*80, 00. SO, 80.80, 00. 00.00.00, 00. co,co.co,oo ,
FF.FF,FF,OO 00.00.00,00. DF.DF,DF.OO, 00.00,00,00,
FF, FF.EI ,OO. FF,FF,E1,OO. oo.oo.oo,oo. IO,84,DO,OO,
B5,B5,B5,JO
这29个DWORD值所对应的系统颜色见表9-7。
表1-7SysColor注册表入口对应的系统颜色
注册表顺序 |
系统颜色 |
描述 |
0 |
COLOR_SCROLLHAR |
滚动条灰色区域的颜色 |
1 |
COLOR_BACKGROUND |
桌面窗口的背景颜色 |
2 |
COLOR_ACTfVECAPTJON |
活动窗口标题栏的颜色 |
3 |
COLOR_lNACTIVECAPTioN |
非活动窗口标题栏的颜色 |
4 |
COLOR_MENU |
菜单的背景颜色 |
3.操作系统用户界面组件
Windows Embedded Compact 7还允许以下其他的操作系统用户界面组件:
(1)内存溢出对话框(Out of Memory dialog box)
当程序内存小够用时系统向用户显示内存溢出对话框,提示用户重新从对象存储分配内存。开发者可以通过修改位于%_WINCEROOT%\Public\CommonhOak\Drivers\OomUI文件夹中的源代码对它进行定制。
(2)启动用户界面(Startup User Interface)
当用户唤醒一个设备时,系统显示启动用户界面,用于输入密码或显示用户和系统信息。开发者可以通过修改位于%_WINCEROOT%\PubliclCommon\Oak\DriverslStarlUI文件夹中的源代码肘它进行定制。
(3)触摸屏校准屏幕(Touch Screen Calibration Screen)
触摸屏梭准组件用于将触摸屏的物理位置映射为屏幕坐标,实现屏幕的准确定位。开发者可以通过修改位于%_WINCEROOTTolPublic \ Common \ Oak \Drivers\CalibrUI文件夹中的源代码对它进行定制。
1.9 Shell走制实例:IEShell
在Platform Builder中包含了两个浏览器例应用程序:IESAMPLE浏览器,IESIMPLE浏览器。
当开发者创建一个操作系统设计时,如果选择r添加Internet Explorer7 samplebrowser组件或设置了SYSGEN_IESAMPLE环境变量,那么操作系统将包含IESample.exe浏览器应用程序,它包含一个标准的菜单条和一个地址栏。如果开发者想创建一个定制的浏览器Shell,那么应该以IESAMPLE为起点进打修改和定制。IESIMPLE浏览器是一个全屏幕的浏览器应用程序,它没有菜单、地址栏和状态条,开崖者也可以修改、编泽并在自己的操作系统设计中包含JFSIMPLE浏览器应用程序,它和IESAMPLE浏览器具有同样的功能。
下面我们将在IESIMPLE浏览器例代码的基础上,创建一个以浏览器Web页耐作为Shell的操作系统设计。
1.9.1 创建一个MyShell操作系统设计
创建一个MyShell操作系统设计,在Platform Builder的“New platform”向导中进行如下选择:
(1)命名操作系统设计为“MyShell“:
(2)从可用的BSP列表中选择“Virtual PC: X86”:
(3)从可用的设计模板列表中选择“Network projector”。
3.9.2 创建、下载并测试操作系统运行时映像
(l)设置当前活动配置为“GEODE: X86_Debug”或者“GEODE: X86_Release”,运行“Sysgen”命令创建操作系统运行时映像;
(2)配置“Connectivity Option”,运行“Attach Device”命令下载操作系统运行时映像;
(3)确认操作系统运行时映像能正常下载并运行;
(4)运行“Detach Device”命令断开Platform Builder与目标设备的连接。
1.9.3创建并测试IEShell应用程序
(l)从Platform Builder的“File”菜单上选择“New Project File”,在“Projects”选项卡上选择“Win32 Smart DeviceApplication”,输入“IESHELL”作为工程名,并选择“Workspace Project”单选按钮,单击“OK”按钮,系统显示“New Project Wizard”对话框;
(2)在stepl of 3对话框中,输入相应的信息,单击“Next”按钮;
(3)在step2 of 3对话框中,选择“An empty project“,单击“Finish”按钮,完成当前工程的创建;
(4)在当前工程的创建结束后,在“File View"选项卡的“Projects”目录树下会显示新创建的Shell工程;
(5)使用资源管理器,将%_WINCEROOT%\PUBLIC、IE\OAK、IESIMPLE文件夹下的所有.cpp、.h和.rc文件复制到IEShell的工程文件夹%_WINCEROOT%\PBWorkspaces\MySheII\IESHELL下;
(6)将IEShellF的iesimple.rc文什重命名为ieshell.rc;
(7)在Platform Buildcr中,选择“Workspace”窗口的“FileView”选项卡,展开Projects目录树的所有分支;
(8)在“Source Files”、“Include Files”和“Resource Files”分支上分别单击鼠标右键,选择“Add Fijes”命令,将mainwnd.cpp、mainwnd.h和resource.h、ieshell.rc分别添加到IEShell工程中;
(9)右击IEShell工程,然后选择“Open”,在编辑窗口中打开它的sources文件,在文件的末尾添加下列代码:
$(_WINCEROOT)1PUBLJC\IE\SDK\INC;
$(_WINCEROOT)\PUBLIC\COIVWlON\OAK\INC;
修改 TARGETUBS部分的代码如下:
TARGE'17YPE=PROGR}LM
TARGETLIBS= \
$(_PROJECTROOT)\cesysgen\sdk\lib\$(_CPUINDPATH)\coredll.lib \
$(_PROJECTROOD\cesysgen\sdk\lib\$(_CPUINDPATH)\wininet,lib \
$(_PROJECTROOT)\cesysgen\sdk\lib\Sf_CPUINDPATH)\commctrl.lib \
$(_PROJECTROOT)\ccsysgenlsdk\lib\S(_CPUINDPATH)\uuid.lib \
$LPROJECTROOT)\cesysgen\sdk\libl$(_CPUINDPATH)V)le32+llb \
$(_PROJECTROOT)\cesysgen\sdkVib\$( _CPUINDPATHl\oleaut32.lib \
POSTLINX_PASS_CMD=postlink. bat
PRELINK_PASS_CMD=prclink.bat
(10)保存sources文件;
(11)选择“Build Project”菜单上的“Build Current Projcct”命令来编译当前工程,确认没有任何编译错误;
(12)选择“Build OS”菜单上的“Make Run-Time Image”命令重新创建操作系统运行时映像;
(13)选择“Artach Device”命令,下载操作系统运行时映像到目标设备;
(14)配置目标设备IP地址、子网掩码以及代理服务器等;
(15)在目标设备上,运行IEShell.exe应用程序,如果目标设备连接到Internet则应该看到www.msn.com页面;
(16)运行“Detach Device”命令断开Platform Builder与目标设备的连接。
1.9.4 设置IEShell为目标设备的Shell
为了将一个Web页面作为目标设备的Shell界面,不同的开发者可以根据白己的设备设计特定的Web页面。至于如何设计Web页面,这里我们不作讨论。下而我们借用微软网站提供的例IEShell中提供的部分文件来说明下面的过程,读者可从下列站点下载到IEShell.exe包:
http://www.microsoft.com/downloads/details.aspx/FamilyID=8CFCA431-C81D-4E2E-9C0D-2DA4F49A3C70&displaylang=en
为了将IEShell设置为目标设备的Shell,需执行下列过程:
(l)将IEShell.exe压缩包解压缩到单独的IEShell文件夹下,在这个文件夹下只有Files子文件夹下的文件是这里所需要的。
(2)在MyShell工作空间的%_WINCEROOT%\PBWorkspaces\ MySheIE\IESHEL文件夹下创建一个名为ShellFiles的新文件夹,并将上述Files文件夹下的所有文件复制到ShellFiles文件夹中。
(3)将ShellFiles文件夹下的IEShell.reg文件复制到其上一级文件夹,覆盖位于这一文件夹下的IEShell.reg文件:在创建操作系统映像时,IEShell.reg文件中的Init\Launch50键值将使用“IEShell,exe”替换Common.reg文件中的“explorer.exe”入口,以达到使用定制Shell替换系统标准Shell的目的。
(4)打开IEShell工程中的mainwnd.cpp文件,将光标移动到171行的开始,添加下列代码来处理SignalStaned()调用:
// 存开发过程中允许带命令行参数运行
// 当从注册表的Init键加载时initSignal为非0
int initSignal= _wtoI(LpCmdLine):
if(initSignall=0)
{
SignaIStafred(imtSignal);
if{FAILED(HandleNewWindow2(_T(""), NULL》)
、 {
guco Cleanup:
}
}
else
注意:这坐的else与后面的if语句构成一个else if执行语句。
(5)展开“FileView”选项卡中IEShell目录树的所有分支,双击“Parameter Files”下的IEShell.reg文件以在编辑窗口中打开它,可以看到它已经包含了一个IEShell.exe文件入口。
(6)在IEShell.exe入口的下面,添加下列注册表入口,这将使构成新Shell的所有文件被包含到操作系统运行时映像中:
FILES
BKG.jpg $(PBWORKSPACEROOTNESHFJI)L\SheIIFiles\B KG.jpg NK U
Bucton(}.jpg $(PBWORKSPACEROOT)\IESHELL/SbeIIFijes\ButtonO.jpg NK U
Buttonl.jpg $tPBWORKSPACEROOT)lIESHELL\SheIIFiles\Buttonl.jpg NK U
Buttun2.jpg $(PBWORKSPACEROOT)\IESHELL\SheIIFileslBucton2.jpg NK U
BuUtm3 jpg $(PBWORKSPACEROOT)\IESHELL\SheIIFiles\Buuon3.j pg NK U
Button4.jpg $(PBWORKSPACEROOT)lIESHELL\ShcIIFileslButton4.jpg NK U
Button5.jpg $(PBWORKSPACEROOT)\IESHELL\ShelLFiles\Buiton5.jpg NK U
Button6.jpg $(PBWORKSPACEROOT)\IESHELL\ShellFiles\Button6.jpg NK U
Bucton7.jpg $(PBWORKSPACEROOTNESHELL\SheIIFiles\Button7jpg NK U
ButtonS.jpg $(PBWORKSPACEROOT)\IESHFI.I.\SheIIFiles、ButtonSjpg NK U
Button9.jpg :S(PBWORKSPACEROOT)\IESHELL\SheIIFiles\Butron9.jpg NK U
ButtonPOUND.jpg $(PBWORKSPACEROOTl\IESHELL\SheIIFiles\BuctonPOUND.jpg NK U
ButtonSTAR.jpg $(PBWORKSPACEROOT)\IESHELL\SheIIFileslButtonSTAR.jpg NK U
default.htm $(PBWORKSPACEROOT)\lESHELL\ShellFileskdeFault.htm NK U
homelogo+gif $(PBWORKSPACE7ZOOT)\IESHELL\ShcIIFiles\homelogo.gif NK U
Shell.htm $(PBWORKSPACEROOT)lIESHELL\SheijFilcs\Shell.htm NK U
(7)在 Platform Builder的 "File"菜单中,选择 "Save AlI”保存所有修改过的文件。
(8)执行 Platform菜单上的 "Settings..."命令,打开 "Platform Settings"对话框,选择 "Environment"选项卡,单击 "New..."按钮,创建一个值为1的 IMGIESHELL变量,单击 "OK"按钮。
(9)单击"OK" 关闭 "Platform Settings"对话框。
(10)在“Workspace”窗口中的“FileView”选项卡中,右击IEShell,选择“Build Current Project”编译当前工程;
(11)执行“Build OS”菜单上的“Build and Sysgen Current BSP”命令,创建MyShell操作系统设计的系统运行映像;
(12)在创建完毕后,运行“Target”菜单上的“Attach Device”命令,下载并运行操作系统映像,一会开发者就应该在目标设备上看到Shell界面。
1.10本章小结
Shell开发是Windows Embedded Compact 7操作系统开发的一个重要方面,Windows Embedded Compact 7 为开发者提供了丰富的Shell和任务管理器例Shell选项及完整的源代码,并提供了IE浏览器的完整源代码,开发者可以再此基础上开发适合于自己的定制Shell。为了帮助读者更好地理解这些Shell源代码并开发定制Shell,本章对必要的Shell功能、Shell组件、如何安装一个定制的Shell、如何处理屏幕旋转和定制用户界面元素进行了专题论述。作为Shell开发的一个实例,本章最后以IEShell的开发为例详细讲解了将浏览器作为定制Shell的开发过程。