您的位置:首页 > 产品设计 > UI/UE

Windows CE 桌面UI修改

2009-12-24 16:19 204 查看
桌面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.。。。。待续
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: