WinCE 桌面修改

//=====================================================================================================
//AUTHOR:
//  norains
//DATE:
//  Friday 7-April-2006
//=====================================================================================================

    桌面UI主要涉及到CDesktopView类;如果要更改桌面的UI表现形式,只要从这个类入手即可.CDesktopView类位于
    $(_WINCEROOT)/PUBLIC/SHELL/OAK/HPC/CESHELL文件夹中.
   
    1.禁止拖拽桌面图标
      CDesktopView类继承于CDefShellView类,拖拽的处理是直接采用CDefShellView类的DoDragDrop()函数.如果要禁止桌面图标拖拽,只要重载DoDragDrop()函数为空即可.
      在desktopview.h重载,代码如下:
      protect:
      virtual void DoDragDrop(NMLISTVIEW * pnmListView){};
     
     2.初始化图标排列顺序
     桌面图标排列顺序有按名称,类型,日期,大小以及还有一个自动排列;默认的是按名称排列.
     在CDesktopView中处理命令的是HandleCommand()函数,其实际是调用CDefShellView的HandleCommand()函数.为方便使用,我们可以以此方式调用:CDefShellView::HandleCommand(dwCmd);
     其中,dwCmd是命令类型,有如下宏定义命令:
     IDC_EDIT_COPY         :复制
     IDC_EDIT_CUT          :剪切
     IDC_EDIT_PASTE         :粘贴
     IDC_EDIT_PASTESHORTCUT     :粘贴快捷方式
     IDC_EDIT_SELECTALL       :全选
     IDC_EDIT_UNDO         :撤销
     IDC_FILE_DELETE        :删除
     IDC_FILE_NEWFOLDER       :新建文件夹
     IDC_FILE_OPEN         :打开
     IDC_FILE_PROPERTIES      :属性
     IDC_FILE_RENAME        :重命名
     IDC_FILE_SENDTO_DESKTOP    :发送到桌面
     IDC_FILE_SENDTO_MYDOCUMENTS  :发送到我的文档
     IDC_HELP_TOPICS        :(无作用)
     IDC_REFRESH          :刷新
     IDC_ARRANGE_AUTO        :自动排列
     IDC_ARRANGE_BYDATE       :按日期排列
     IDC_ARRANGE_BYNAME       :按名称排列
     IDC_ARRANGE_BYSIZE       :按大小排列
     IDC_ARRANGE_BYTYPE       :按类型排列
     IDC_VIEW_DETAILS        :详细信息查看
     IDC_VIEW_LIST         :列表方式查看
     IDC_VIEW_ICONS         :图标方式查看
     IDC_VIEW_OPTIONS        :查看选项(?)
     IDC_VIEW_TYPE         :查看类型(?)
     IDC_GO_MYDOCUMENTS       :转到到我的文档
     IDC_GO_FOLDERUP        :转到上级文件夹
     ID_ESCAPE           :ESC
     ID_CONTEXTMENU         :内容菜单(?)
    
     如果需要图标以日期方式初始化排列,只要在CDesktopView::CreateViewWindow()函数最后添加此语句即可:
     CDefShellView::HandleCommand(IDC_ARRANGE_BYDATE);
    
    
    
     3.删除菜单选项
     桌面的弹出菜单有两种:一种是在桌面按右键弹出的FOLDER_VIEW_MENU_OFFSET;另一种是在图标上点右键弹出的ITEM_MENU_OFFSET.两种菜单的完整表现如下:
    
         /******************************************************
         //FOLDER_VIEW_MENU_OFFSET菜单
        查看             (pos:FOLDER_VIEW_MENU_OFFSET)
        --------------
        图标排列方式
        刷新
        --------------
        粘贴
        粘贴快捷方式
        --------------
        新建文件夹
        --------------
        属性
        *******************************************************/
       
        
         /******************************************************
         //ITEM_MENU_OFFSET菜单
        打开          (pos:ITEM_MENU_OFFSET)
        ----------
        剪切
        复制
        ----------
        删除
        重命名
        ----------
        属性
        *******************************************************/
       
     在弹出菜单之前,都需要调用CDesktopView::HandleInitMenuPopup()函数对菜单进行构建;所以,要删除菜单的选项,也是在此函数中进行.
     删除菜单子项可以通过::RemoveMenu()函数进行删除,有以位置(MF_BYPOSITION)或命令方式(IDC_EDIT_CUT).
     例如:
     1.删除"复制"子菜单:
       ::RemoveMenu(hmenu, IDC_EDIT_COPY, MF_BYCOMMAND);
     2.删除ITEM_MENU_OFFSET菜单的第二个子菜单:
        ::RemoveMenu(hmenu, ITEM_MENU_OFFSET+1, MF_BYPOSITION); //其后的菜单子项位置会上移
       
     以下这段代码FOLDER_VIEW_MENU_OFFSET只保留了"刷新","属性";ITEM_MENU_OFFSET只保留了"打开","属性"(夹杂在begin和end间是笔者加的代码)
    

LRESULT CDesktopView::HandleInitMenuPopup(HMENU hmenu, PopupMenuInfo * pPopupMenuInfo)
{
 
  //return 0;  //norains 2006-4-7 16:01 桌面不弹出菜单;失败,菜单依然会建立,并且,"查看"也会出现
 
   RETAILMSG(1,(TEXT("HandleInitMenuPopup/n/r"))); //norains 2006-4-7 17:02

   LRESULT result = CDefShellView::HandleInitMenuPopup(hmenu, pPopupMenuInfo);

   if ((0 == result) && (FWF_DESKTOP & m_fFlags))
   {
      if (pPopupMenuInfo && (FOLDER_MENU_OFFSET == pPopupMenuInfo->offset))
      {    
        //"桌面"->"右键"弹出的菜单       
               
         ::RemoveMenu(hmenu, FOLDER_VIEW_MENU_OFFSET, MF_BYPOSITION); // "View" sub-menu
         ::RemoveMenu(hmenu, FOLDER_VIEW_MENU_OFFSET, MF_BYPOSITION); // "View" separator
          
         //norains begin 2006-4-7 19:08-----------------------------------------------------
         //删掉某一菜单子项,于其之后的菜单位置上移
         ::RemoveMenu(hmenu, FOLDER_VIEW_MENU_OFFSET, MF_BYPOSITION); //"图标排列方式"
         ::RemoveMenu(hmenu, FOLDER_VIEW_MENU_OFFSET+1, MF_BYPOSITION); //separator
         ::RemoveMenu(hmenu, FOLDER_VIEW_MENU_OFFSET+1, MF_BYPOSITION); //"粘贴"
         ::RemoveMenu(hmenu, FOLDER_VIEW_MENU_OFFSET+1, MF_BYPOSITION); //"粘贴快捷方式" 
         ::RemoveMenu(hmenu, FOLDER_VIEW_MENU_OFFSET+1, MF_BYPOSITION); //separator
         ::RemoveMenu(hmenu, FOLDER_VIEW_MENU_OFFSET+1, MF_BYPOSITION); //"新建文件夹"
         //norains end----------------------------------------------------------------------
      }       
     
      //norains begin 2006-4-7 17:59---------------------------------------------------------
      else if (pPopupMenuInfo && (ITEM_MENU_OFFSET == pPopupMenuInfo->offset))
      {
        //"桌面图标"->"右键"弹出的菜单 
       
        RETAILMSG(1,(TEXT("It is ITEM_MENU_OFFSET/n/r")));
        ::RemoveMenu(hmenu, IDC_EDIT_CUT, MF_BYCOMMAND);
     ::RemoveMenu(hmenu, IDC_EDIT_COPY, MF_BYCOMMAND);
        ::RemoveMenu(hmenu, IDC_FILE_DELETE, MF_BYCOMMAND);
        ::RemoveMenu(hmenu, IDC_FILE_RENAME, MF_BYCOMMAND);
        ::RemoveMenu(hmenu, ITEM_MENU_OFFSET+1, MF_BYPOSITION); //  separator
        ::RemoveMenu(hmenu, ITEM_MENU_OFFSET+1, MF_BYPOSITION); //  separator
      }
      //norains end -------------------------------------------------------------------------
     
   }

   return result;
 
}
    

posted @ 2006-04-08 11:06  我的一天  阅读(184)  评论(0编辑  收藏  举报