首先感謝文章的原作者。轉自http://www.ustcers.com/blogs/devzhao/pages/13027.aspx
Windows CE 案頭UI修改
案頭UI主要涉及到CDesktopView類 ,CDesktopView類繼承於CDefShellView類;如果要更改案頭的UI表現形式,只要從這個類入手即可.CDesktopView類位於
$(_WINCEROOT)\PUBLIC\SHELL\OAK\HPC\CESHELL檔案夾中.
1.更改右鍵快顯功能表選項
案頭的快顯功能表有兩種:一種是在案頭按右鍵彈出的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)或命令方式(MF_BYCOMMAND).
例如:
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)
{
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
::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); //"建立檔案夾"
}
else if (pPopupMenuInfo && (ITEM_MENU_OFFSET == pPopupMenuInfo->offset))
{
::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
}
}
- return result;
}
那麼增加功能表項目如何?呢,呵呵。。。^_^
2.禁止拖拽案頭表徵圖
CDesktopView的拖拽處理是直接採用基類CDefShellView的DoDragDrop()函數.如果要禁止案頭表徵圖拖拽,只要重載DoDragDrop()函數為空白即可.
在desktopview.h重載,代碼如下:
protect:
virtual void DoDragDrop(NMLISTVIEW * pnmListView){};
3.案頭表徵圖排列順序
案頭表徵圖排列順序有按名稱,類型,日期,大小以及還有一個自動排文;預設的是按名稱排列.
在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);
4.更改案頭背景
在CDesktopView::PaintBackground中修改。
修改背景顏色:
// --- Original code commented out ---// ::FillRect(hdc, &rc, ::GetSysColorBrush(COLOR_BACKGROUND));// Explicitly set the background color.::FillRect(hdc, &rc, ::GetSysColorBrush(RGB(230, 150, 230)));修改顯示的os版本資訊(類似“windows ce.net 4.2")
/* -- Original code commented out --::wsprintf(wszVersion, L"Microsoft Windows \CE v%d.%02d (Build %d on %s) ", VerInfo.dwMajorVersion,VerInfo.dwMinorVersion, VerInfo.dwBuildNumber,TEXT(__DATE__));*/// Display shell name along with Windows CE version information.::wsprintf(wszVersion, L"<
Shell Name> for Microsoft Windows \CE v%d.%02d (Build %d on %s) ",VerInfo.dwMajorVersion, VerInfo.dwMinorVersion,VerInfo.dwBuildNumber, TEXT(__DATE__));
5.。。。。待續