WinCE开始菜单定制(二)
来源:互联网 发布:ios知乎日报 api 编辑:程序博客网 时间:2024/05/16 15:14
前面转了一篇关于添加应用程序到开始菜单的帖子,可以将应用程序添加到开始的菜单的Programs目录或Favorites等。
正好今天接了个需求,客户需要将应用程序添加到开始菜单的第一级。也就是跟Programs平级的地方。开始以为也就是换个目录而已。后来发现不是,需要更改WinCE的开始菜单代码个资源文件才能做到。花了大半天的时间才搞定,并不在于有多难,而是太不熟悉了。
实现方式如下:
1. 首先打开如下文件(在PB的FileView的public-->shell-->oak-->hpc-->explorer-->taskbar-->Source Files-->stmenu.cpp):
物理位置是/WINCE500/PUBLIC/SHELL/OAK/HPC/EXPLORER/TASKBAR/stmenu.cpp
找到
WCHAR const c_szCable[] = L"//windows//peghelp.exe";
WCHAR const c_szBluetooth[] = L"//windows//peghelp.exe";
static STMENUDATA const stmenuData[] = {
{IDM_START_CABLE, IDS_CABLE, IDI_CABLE, STATIC_ITEM, 0, 0, 0},
{IDM_START_BLUETOOTH, IDS_BLUETOOTH, IDI_BLUETOOTH, STATIC_ITEM, 0, 0, 0},
// {IDM_START_CABLE, IDS_MENURUN, IDI_STRUN, STATIC_ITEM, 0, 0, 0},
// {IDM_START_BLUETOOTH, IDS_MENURUN, IDI_STRUN, STATIC_ITEM, 0, 0, 0},
{0, IDS_NULL, 0, STATIC_ITEM, 0, 0, 0},
{IDM_START_PROGRAMS, IDS_MENUPROGRAMS, IDI_STPROGS, CSIDL_PROGRAMS, 0, 0, 0},
{IDM_START_FAVORITES, IDS_MENUFAVORITES, IDI_STFAVORITES, CSIDL_FAVORITES, 0, 0, 0},
{IDM_START_DOCUMENTS, IDS_MENUDOCUMENTS, IDI_STDOCS, CSIDL_RECENT, 0, 0, 0},
{IDM_START_SETTINGS, IDS_MENUSETTING, IDI_STSETNGS, STATIC_ITEM, 0, 0, 0},
{IDM_START_HELP, IDS_MENUHELP, IDI_STHELP, STATIC_ITEM, 0, 0, 0},
{IDM_START_RUN, IDS_MENURUN, IDI_STRUN, STATIC_ITEM, 0, 0, 0},
{0, IDS_NULL, 0, STATIC_ITEM, 0, 0, 0},
{IDM_START_SUSPEND, IDS_MENUSUSPEND, IDI_STSUSPD, STATIC_ITEM, 0, 0, 0},
};
红色部分是我添加的自定义的菜单信息。
IDM_用来标识菜单,IDS_是菜单显示的字符串,IDI_是菜单前的图标。
DWORD StartMenu_ProcessCommand(HWND hwnd, WPARAM wp, LPARAM lp)
{
DWORD cmdId = GET_WM_COMMAND_ID(wp,lp);
SHELLEXECUTEINFO info;
switch (cmdId)
{
// Add by xxx
case IDM_START_CABLE:
RETAILMSG(1, (L"IDM_START_CABLE processed, id is 0x%x/r/n", cmdId));
info.cbSize = sizeof(info);
info.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_FLAG_NO_UI;
info.lpVerb = NULL;
info.lpFile = c_szCable;
info.lpParameters = NULL;
info.lpDirectory = NULL;
info.nShow = SW_SHOW;
info.hInstApp = NULL;
ShellExecuteEx(&info);
break;
case IDM_START_BLUETOOTH:
RETAILMSG(1, (L"IDM_START_BLUETOOTH processed, id is 0x%x/r/n", cmdId));
info.cbSize = sizeof(info);
info.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_FLAG_NO_UI;
info.lpVerb = NULL;
info.lpFile = c_szBluetooth;
info.lpParameters = NULL;
info.lpDirectory = NULL;
info.nShow = SW_SHOW;
info.hInstApp = NULL;
ShellExecuteEx(&info);
break;
...
上面是菜单的具体功能,我只是简单的打印了一条信息看菜单是否被调用以及打开WinCE帮助文档,可以根据实际需要来实现其功能。
2. 接下来就是添加的菜单信息的定义了。
打开/WINCE500/PUBLIC/SHELL/OAK/HPC/EXPLORER/INC/resource.h
添加:
#define IDI_STTASKBAR 31
#define IDI_STCONNMC 32
// Add by xxx
#define IDI_CABLE 33
#define IDI_BLUETOOTH 34
...
#define IDS_MENUTASKBAR 0x8a0b
#define IDS_MENUCONNMC 0x8a0c
// Add by xxx
#define IDS_CABLE 0x8a0d
#define IDS_BLUETOOTH 0x8a0e
...
#define IDM_START_FAVORITES 20
#define IDM_START_LAST_BANNER 20
// add by jiangjun 2011-02-16 for add app to startmenu
#define IDM_START_CABLE 21
#define IDM_START_BLUETOOTH 22
这里千万要注意资源文件的定义,不能重复了。
3.资源头文件中有了信息,现在要做的就是在资源文件中添加了。我就是在这里浪费了很多时间,开始不知道怎么想的,搜了下.res文件就开始改,改来改去发现生成的系统中菜单项是有了,可上面什么也不显示,后来仔细一看,改过的res文件又被改回原样了。所以这里应该修改对应的.rc文件而不是.res文件。
找到:/WINCE500/PUBLIC/SHELL/OAK/HPC/EXPLORER/MAIN/explorerbase.rc
这个很奇怪,用PB修改它后没法用,说什么因为不是PB创建的文件。所以只能用文本方式打开(UE或记事本)
添加红色部分:
// start menu icons
IDI_STPROGS ICON DISCARDABLE "RES//STPROGS_new.ico"
IDI_STDOCS ICON DISCARDABLE "RES//STDOCS_new.ico"
IDI_STSETNGS ICON DISCARDABLE "RES//STSETNGS_new.ico"
IDI_STHELP ICON DISCARDABLE "RES//STHELP.ico"
IDI_STRUN ICON DISCARDABLE "RES//STRUN_new.ico"
IDI_STSUSPD ICON DISCARDABLE "RES//STSUSPD.ico"
IDI_STFAVORITES ICON DISCARDABLE "RES//stfav_new.ico"
IDI_STTASKBAR ICON DISCARDABLE "RES//sttaskbr_new.ico"
IDI_STCTLPNL ICON DISCARDABLE "RES//stcpanel_new.ico"
IDI_STCONNMC ICON DISCARDABLE "RES//remotenw_new.ico"
// Add by xxx
IDI_CABLE ICON DISCARDABLE "RES//cable.ico"
IDI_BLUETOOTH ICON DISCARDABLE "RES//blutooth.ico"
...
// start menu
STRINGTABLE DISCARDABLE
BEGIN
IDS_CABLE "Cable"
IDS_BLUETOOTH "Bluetooth"
IDS_MENUPROGRAMS "&Programs"
IDS_MENUDOCUMENTS "&Documents"
IDS_MENUSETTING "&Settings"
IDS_MENUFIND "&Find"
IDS_MENUHELP "&Help"
IDS_MENURUN "&Run..."
IDS_MENUSUSPEND "S&uspend"
IDS_MENUFAVORITES "F&avorites"
IDS_MENUCTLPNL "&Control Panel"
IDS_MENUTASKBAR "&Taskbar and Start Menu..."
IDS_MENUCONNMC "&Network and Dial-up Connections"
END
4.将3中需要的ico文件拷贝到:
/WINCE500/PUBLIC/SHELL/OAK/HPC/EXPLORER/MAIN/RES/目录下。
5. 在PB的File View中右键选择shell,先保证右键菜单的Clean Before Building和Make Run-time Image After Building勾选,然后右键菜单选择Build and Sysgen Current Project。
OK,现在开始菜单的Programs上面多了两个菜单和一个分隔符了。
今天改变了一下系统的语言为日语后发现菜单又没有图标和内容了。这个郁闷了,估计是对应的语言资源里面没有菜单的信息。于是在
D:/WINCE500/PUBLIC/SHELL/OAK/LIB/X86/RETAIL/0411
中找到explorerbase.res用PB打开,添加菜单需要的图标和字符串,验证后OK。
也就是说多语言的操作系统的话,必须对所有的语言的explorerbase.res都做上面的添加。否则菜单就没有图标和字符串显示。
也许存在不要修改全部需要语言的explorerbase.res的更简单的方式,但我现在还没找到,知道的请告诉我一声,非常感谢。
- WinCE开始菜单定制(二)
- WinCE 定制 开始菜单问题
- 有点痛苦:WINCE自定义开始菜单[二]
- 有点痛苦:WINCE自定义开始菜单[二]
- WINCE IE浏览器定制(二)
- Wince 开始菜单
- Windows CE 5.0待机界面定制之二 - 开始菜单
- Windows CE 5.0待机界面定制之二 - 开始菜单
- wince隐藏开始菜单
- WinCE控制面板添加应用程序+WinCE开始菜单中添加应用程序+WinCE桌面墙纸及图标更换+WinCE文件目录定制及内存调整
- Wince总结(一)--控制开始菜单内容
- wince下开始菜单 状态栏 输入法的控制(转载)
- Windows 10开始菜单定制工具
- Wince 控制开始菜单内容讲解
- WinCE开始菜单中添加应用程序
- WinCE开始菜单中添加应用程序
- WinCE开始菜单中添加应用程序
- WinCE开始菜单中添加应用程序
- cisco交换机配置
- tomcat6+spring2.5+xfire1.2开发webservice报错原因
- 类的继承引起的一个错误:error C2259 cannot instantiate abstract class due to following members
- 大白菜 U盘系统指南
- CSS 基本选择器
- WinCE开始菜单定制(二)
- 从“土豆”看软件**
- RMI 远程对象工程设计模式
- MFC 分页控件
- C++ primer 注意的知识点(第3-6章)
- asp.net wap
- 敏捷开发学习笔记
- asp.net wap
- asp.net wap