有点痛苦: WINCE 自定义开始菜单[一]

本文介绍如何在Windows CE 5.0中定制开始菜单,包括修改菜单项、添加背景图、处理菜单响应及如何将资源添加到操作系统中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转: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中。理解起来方便。但对于。我这种新手。可花了大几天啊研究。还不知道心得到底是对还是错?有待高手指教。

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值