转:Windows CE 5.0待机界面定制之二 - 开始菜单
http://blog.youkuaiyun.com/91program/archive/2007/12/04/1915265.aspx
开始菜单的修改效果如Windows CE 5.0待机界面定制(概述) 中所附图。
具体的修改,主要是修改WinCE500/PUBLIC/SHELL/OAK/HPC/EXPLORER/TASKBAR/stmenu.cpp文件。
由于是在Windows CE内核源代码的基础之上进行修改的,所以没有将全部代码贴出来。将修改的主要部分内容,进行了说明。其中所需要的部分变量需要自己根据需要自定义。
第一:修改stmenuData数组
例如增加:{IDM_MOBILE, IDS_MOBILE, IDI_MOBILE, STATIC_ITEM, 0, 0, 0},
等,需要多个菜单的,可增加多行的内容
第二:为菜单定义背景图,并加载背景图:hbmStMenuBackGround
第三:在StartMenu_DrawMenuItem()的ODA_SELECT分支中,增加菜单背景绘制过程
if(hbmStMenuBackGround)
{
HDC hdcmem = CreateCompatibleDC(lpdis->hDC);
if(hdcmem)
{
SelectObject(hdcmem, hbmStMenuBackGround);
BitBlt(lpdis->hDC, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, hdcmem, rc.left, rc.top, SRCCOPY);
DeleteDC(hdcmem);
}
}
第四:在StartMenu_ProcessCommand()函数中,处理菜单响应
如
case IDM_MOBILE:
info.cbSize = sizeof(info);
info.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_FLAG_NO_UI;
info.lpVerb = NULL;
info.lpFile = L"//ResidentFlash//MyMobileApp.exe";
info.lpParameters = NULL;
info.lpDirectory = NULL;
info.nShow = SW_SHOW;
info.hInstApp = NULL;
ShellExecuteEx(&info);
break;
最后:删除背景图资源
到此只知道修改流程,怎么把资源添加到OS。Google啊 baidu啊 yahoo啊。基本上就是如上所说。只好自己动手啦。
第一步:在VS2005中打开项目,找到目录WINCE600/PUBLIC/SHELL/OAK/HPC/EXPLORER/MAIN/Resource files下添加名为:“explorerCustomers.rc”
继续完成:添加的资源。如字符串:关机/重启。
这里要特别注意:添加的ID_Value是自动的,需要修改自定义的。
最好在WINCE600/PUBLIC/SHELL/OAK/HPC/EXPLORER/INC/RESOURCE.H中定义你要的ID值。
//stmenu.cpp
#define IDS_MENUEXPLORE 0x8a00
#define IDS_MENUPROGRAMS 0x8a01
#define IDS_MENUDOCUMENTS 0x8a02
#define IDS_MENUSETTING 0x8a03
#define IDS_MENUFIND 0x8a04
#define IDS_MENUHELP 0x8a05
#define IDS_MENURUN 0x8a06
#define IDS_NULL 0x8a07
#define IDS_MENUSUSPEND 0x8a08
#define IDS_MENUFAVORITES 0x8a09
#define IDS_MENUCTLPNL 0x8a0a
#define IDS_MENUTASKBAR 0x8a0b
#define IDS_MENUCONNMC 0x8a0c
#define IDS_MENUSHUTDOWN 0x8a0d ///自定义
#define IDS_MENURESTART 0x8a0e //自定义
因为在INC/Resources.h中有定义。所以把explorerCustomers.rc.目录下的Resource.h删除。
再打开explorerCustomers.rc.修改包含的头文件#include "../INC/resource.h"
第二步:source文件修改编译
INCLUDES=../inc;../../inc
WINCETARGETFILES=$(_RELEASELIBDIR)/$(TARGETNAME)base.res /
$(_RELEASELIBDIR)/$(TARGETNAME)_vgal.res /
$(_RELEASELIBDIR)/$(TARGETNAME)_qvgap.res /
SOURCES=explorer.cpp /
browseobj.cpp /
utils.cpp /
animthrd.cpp /
mainwnd.cpp /
desktop.cpp /
api.cpp /
guid.cpp /
urlmonutils.cpp /
explorerlist.cpp /
explorerCustomers.rc
第三步:检测编译后。有没有产生:WINCE600/PUBLIC/SHELL/OAK/HPC/EXPLORER/MAIN/obj/ARMV4I/retail/explorerCustomers.res
第四步:再次source文件修改编译
INCLUDES=../inc;../../inc
WINCETARGETFILES=$(_RELEASELIBDIR)/$(TARGETNAME)base.res /
$(_RELEASELIBDIR)/$(TARGETNAME)_vgal.res /
$(_RELEASELIBDIR)/$(TARGETNAME)_qvgap.res /
$(_RELEASELIBDIR)/$(TARGETNAME)Customers.res
SOURCES=explorer.cpp /
browseobj.cpp /
utils.cpp /
animthrd.cpp /
mainwnd.cpp /
desktop.cpp /
api.cpp /
guid.cpp /
urlmonutils.cpp /
explorerlist.cpp /
第五步:出错。再次修改makefile.inc编译
# Resource base
$(_RELEASELIBDIR)/$(TARGETNAME)base.res: $(_OBJDIR)/$(TARGETNAME)base.res
copy $? $@
$(_RELEASELIBDIR)/$(TARGETNAME)Customers.res: $(_OBJDIR)/$(TARGETNAME)Customers.res
copy $? $@
第六步:系统生成。不然是看不到效果的咯。但未成功,显示的是空白条。心得是MS调整了Resource.h到INC中。理解起来方便。但对于。我这种新手。可花了大几天啊研究。还不知道心得到底是对还是错?有待高手指教。