//=====================================================================================================
//AUTHOR:
//  norains
//DATE:
//  Saturday 4-Mar-2006
//=====================================================================================================
windows ce 的开始菜单的子项可以通过更改注册表来更改,但只能对有限的子项进行更改.如果想要对开始菜单进行更为详尽的设置,必须要对代码下手.开始菜单位于"$(_WINCEROOT)/PUBLIC/SHELL/OAK/HPC/EXPLORER/TASKBAR/stmenu.cpp.由于代码众多,再此只对菜单的创建函数StartMenu_Create()做一个注释.下面这个例子的菜单只有"设置"和"程序"两个子项
HMENU StartMenu_Create(VOID)
/*---------------------------------------------------------------------------*/
 *
/*---------------------------------------------------------------------------*/
{
 BOOL fOK= FALSE;
 HMENU hmenu;
 BITMAP bm;
 HDC hdc;
 int i;
 
 //创建"设置"菜单
 HMENU hmenuSettings = StartMenu_CreateSettingsMenu();
 if (!hmenuSettings) {
  return NULL;
 }

//如果无法创建下级弹出菜单,则跳出此函数
    hmenu = CreatePopupMenu();
 if (!hmenu) {
  FileMenu_Destroy(hmenuSettings);
  return 0;
 }

// 开始菜单
 for (i=0; i<START_NUM_STATIC_ITEMS; i++) {

//如果不存在peghelp.exe文件,将去掉"Help"子项
  if((IDM_START_HELP == stmenuData[i].idMenuCmd) && (GetFileAttributes(L"//Windows//peghelp.exe") == -1))
   continue;
 
  //如果注册表设置不采用挂起,则将"挂起"子项去掉(是否采用分隔符也可以在注册表设定)
  if ((IDM_START_SUSPEND == stmenuData[i].idMenuCmd) || (0 == stmenuData[i].idMenuCmd))
        {
            DWORD dwLen;
            DWORD dwValue;
            HKEY  hkey;
           
            dwValue = TRUE; // 设置默认值
            dwLen = sizeof(dwValue);
            if( RegOpenKeyEx( HKEY_LOCAL_MACHINE, L"Explorer", 0, KEY_READ, &hkey ) == ERROR_SUCCESS )
            {
                RegQueryValueEx(hkey, L"Suspend", NULL, NULL, (LPBYTE)&dwValue, &dwLen );
                RegCloseKey( hkey );
            }
            if (FALSE == dwValue) {
                continue;
            }
  }

if (0 == idFirstMenu) {
   idFirstMenu = stmenuData[i].idMenuCmd;
  }
  idLastMenu = stmenuData[i].idMenuCmd;
 
  if (stmenuData[i].idMenuIcon) {
   if (stmenuData[i].idMenuCmd == IDM_START_SETTINGS){
    // 插入"设置"菜单
    fOK = AppendMenu(hmenu,  MF_OWNERDRAW | MF_POPUP,
         (UINT)hmenuSettings, (LPCTSTR)&stmenuData[i]);
   }
   
   //*--------------------------------------------------------------------------------------------------------------
   //此段代码管理"运行","挂起"   
   else if (!stmenuData[i].nSpecialFolder ||
        (stmenuData[i].nSpecialFolder == STATIC_ITEM)) {
    // insert standard menu item
    //if(stmenuData[i].idMenuCmd!=IDM_START_RUN ||stmenuData[i].idMenuCmd!=IDM_START_SUSPEND )  //my adding:不添加"运行","挂起"选项
    //ori: {fOK = AppendMenu(hmenu, MF_OWNERDRAW, stmenuData[i].idMenuCmd,(LPCTSTR) &stmenuData[i]);}
   }
   //--------------------------------------------------------------------------------------------------------------*/
   
   
   //*----------------------------------------------------------------------------------------------------- 
   //此段代码管理:"程序","收藏","文档";
   
   //++++++++++++++++++++++++++
   //:my adding
   //不添加"收藏","文档"选项
   else if(stmenuData[i].idMenuCmd == IDM_START_FAVORITES ||stmenuData[i].idMenuCmd == IDM_START_DOCUMENTS)
    {;}
   //++++++++++++++++++++++++++
   
   else{
    // insert cascade item
    // my explanation:cascade menu指的是带有下级弹出菜单的,standard menu是单独的,没有下级弹出菜单的    
    HMENU hmenuSubMenu;
    LPITEMIDLIST pidl;

if (SUCCEEDED(SHGetSpecialFolderLocation(NULL, stmenuData[i].nSpecialFolder, &pidl))) {
        hmenuSubMenu = FileMenu_CreatePopupWithPIDL(pidl);//创建弹出的下级菜单
        fOK = AppendMenu(hmenu,  MF_OWNERDRAW | MF_POPUP,
             (UINT)hmenuSubMenu,
             (LPCTSTR)&stmenuData[i]);
                }            
   }
   //-------------------------------------------------------------------------------------------------------*/
   
  }else{
    //fOK = AppendMenu(hmenu,MF_SEPARATOR, 0,0); //创建一个菜单分割符
  }
  ASSERT(fOK);

}

if (g_fUseSTBitmap)
 {
  hdc = GetDC(NULL);
  if (GetDeviceCaps(hdc, BITSPIXEL) == 2) {
   hbmSTPegasus = LoadBitmap(g_hInstance, MAKEINTRESOURCE(IDB_STPEGASUSG));
  }else{
   hbmSTPegasus = LoadBitmap(g_hInstance, MAKEINTRESOURCE(IDB_STPEGASUS));
  }
  ReleaseDC(NULL, hdc);

GetObject(hbmSTPegasus, sizeof(BITMAP), &bm);

sizeSTPegasus.cx = bm.bmWidth;
  sizeSTPegasus.cy = bm.bmHeight;
 }
 else
 {
  hbmSTPegasus = NULL;
  sizeSTPegasus.cx = 0;
  sizeSTPegasus.cy = 0;
 }

return hmenu;
 
} /* StartMenu_Create() */

转载于:https://www.cnblogs.com/wodeyitian/archive/2006/03/04/2460575.html

WinCE 开始菜单StartMenu_Create()函数代码分析相关推荐

  1. caffe中loss函数代码分析--caffe学习(16)

    接上篇:caffe中样本的label一定要从序号0开始标注吗?–caffe学习(15) A: 1:数学上来说,损失函数loss值和label从0开始还是从1或者100开始是没有直接联系的,以欧式距离损 ...

  2. planner_wisdom(),fftw_wisdom_lookup(),fftw_measure_runtime(),init_test_array()函数代码分析

    代码分析以fftw2.15为例,原代码在fftw/planner.c中 planner_wisdom()函数是fftw为了运行效率提出的wisdom机制,主要思想是通过查找之前相似数据(结构.大小等相 ...

  3. AC_AttitudeControl_Heli.cpp的AC_AttitudeControl_Heli::rate_target_to_motor_yaw函数代码分析

    代码基于ardupilot3.4.2RC2,仅分析ArduCopter(多旋翼.直升机)构型中代码逻辑.使用关系,其他构型(飞机.云台.车)后续考虑分析. float AC_AttitudeContr ...

  4. AC_AttitudeControl_Heli.cpp的AC_PosControl::set_dt函数代码分析

    代码基于ardupilot3.4.2RC2,仅分析ArduCopter(多旋翼.直升机)构型中代码逻辑.使用关系,其他构型(飞机.云台.车)后续考虑分析. void AC_PosControl::se ...

  5. AC_AttitudeControl_Heli.cpp的void AC_AttitudeControl_Heli::rate_bf_to_motor_roll_pitch函数代码分析

    代码基于ardupilot3.4.2RC2,仅分析ArduCopter(多旋翼.直升机)构型中代码逻辑.使用关系,其他构型(飞机.云台.车)后续考虑分析. void AC_AttitudeContro ...

  6. AC_AttitudeControl_Heli.cpp的AC_AttitudeControl_Heli::passthrough_bf_roll_pitch_rate_yaw函数代码分析

    代码基于ardupilot3.4.2RC2,仅分析ArduCopter(多旋翼.直升机)构型中代码逻辑.使用关系,其他构型(飞机.云台.车)后续考虑分析. 函数作用:传统直升机(单旋翼带尾桨)带平衡杠 ...

  7. 一个网页菜单的CSS代码分析

    一个绿色网页菜单,效果如下,网上可下载到该资源: 下面研究其css代码:这是一个比较复杂的菜单:可学到很多东西: /* menu::base */ div#menu {height: 46px;pad ...

  8. linux ip rcv,Linux网络层 ip_rcv()函数代码分析(__pskb_pull_tail)

    int ip_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt) //几个结构sk_buff套接字缓存,n ...

  9. Linux内核分析2:一个简单的时间片轮转多道程序内核代码分析

    Lab2:一个简单的时间片轮转多道程序内核代码 席金玉   <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-100002900 ...

最新文章

  1. Ubuntu下eclipse indigo版在线安装hibernate插件
  2. json-server模拟后台接口
  3. 微软Cloud+AI本地化社区贡献指南
  4. 介绍“又一个” Cloud Foundry Gradle插件
  5. 两岸三地在线编程学习网站大全
  6. 华为鸿蒙OS Beta3,华为鸿蒙HarmonyOS Beta3 2.0.0.101安装包-华为鸿蒙HarmonyOS Beta3官网版v2.0.0.101...
  7. 【Vue-router中,require代替import解决vue项目首页加载时间过久】
  8. 为什么电脑CPU这么贵?
  9. 无向图中两点之间的距离_自然语言处理中距离计算总结
  10. java jre 和jed_需要jre的软件如何安装,如jedit?
  11. python 百度aip实现文字识别
  12. html游戏官网界面设计教程,【ideas】游戏官网我们到底应该设计什么?
  13. linux smtp ip伪造,邮箱伪造之搭建匿名SMTP服务器
  14. 牛魔王珍满福拉面 - 北京团购网|京东团购
  15. React学习笔记(二) | 受控组件
  16. 开箱即用的高匿代理抓取工具
  17. 成长路上最好的伙伴——敌人
  18. 内网搭建maven私库
  19. Digilent FPGA开发板的Boards file的添加——以Eclypse-Z7为例
  20. Double类型精度问题引起的错误

热门文章

  1. 64位Linux下JVM内存调设遇到GC问题的备忘
  2. 设置远程访问mysql服务端的日志
  3. 视图解析自定义视图和自定义视图解析器——未完待续
  4. 用python实现自动填数生成表格v2.0
  5. JAVA不借助第三个变量实现两个变量交换的思考
  6. Linux 环境运维 - 查看远程调试端口被占用的ip地址,设置连接处于空闲状态快速自动化断开方法,keepalive机制相关说明
  7. MySQL 语法问题:You can‘t specify target table ‘xxx‘ for update in FROM clause. 原因及解决方法
  8. CTFshow php特性 web125
  9. HYSBZ-1951 古代猪文 【好题】
  10. pascal--生成Pascal矩阵