CMFCShellList和CMFCShellTreeList的使用点滴(关于zip对CMFCShellList没有反应的处理)

这里就是一个例子,具体的用法可以参考MSDN以及VC示例程序中的MFC Feature Pack 的NewControls。

1.创建一个基于对话框的MFC应用程序。

2.在工具箱中选择TreeCtrl控件,同时添加相应的变量,变量类型需要手动更改为CMFCShellTreeCtrl(默认只有CTreeCtrl),命名为:

   m_wndShellTree;

3.在应用程序类C××App的InitInstance()中的适当位置(我放在AfxEnableControlContainer()后面)添加InitShellManage();即可,之后直接编译运行就可以看到效果。

简单使用方法:

(1).资源管理器效果。

 一般情况下,CMFCShellTreeCtrl和CMFCShellListCtrl关联使用,以使呈现资源管理器的效果,首先和上面添加CMFCShellTreeCtrl的方法类似,添加一个List Ctrl,并关联一个CMFCShellListCtrl变量m_wndShellListCtrl。对话框可以在初始化(OnInitDialog)时用

CMFCShellTreeCtrl::SetRelatedList(CMFCShellTreeList *)。

(2).禁用ShellListCtrl的Pop-up菜单。

这时如果右击CMFCShellListCtrl将会弹出系统菜单。所以这个时候,你可以使用 m_wndShellListCtrl.EnableShellContextMenu(FALSE);来禁用Popup菜单。

(3).添加自己的弹出菜单

为CMFCShellListCtrl的相关控件上添加NM_RCLICK消息响应函数并添加如下代码:

void CMHPackerDlg::OnNMRClickShelllist(NMHDR *pNMHDR, LRESULT *pResult) { LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast(pNMHDR); // TODO: 在此添加控件通知处理程序代码 CPoint point; ::GetCursorPos(&point);//得到当前鼠标位置 CMenu PopMenu; PopMenu.LoadMenu(IDR_SHELLMENU);//载入资源 UINT nSelItems = m_wndShellListCtrl.GetSelectedCount(); if (nSelItems <= 0 ) { PopMenu.GetSubMenu(0)->EnableMenuItem(ID_SHELLPOPUP_ADD, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); } PopMenu.GetSubMenu(0)->TrackPopupMenu(TPM_HORIZONTAL , point.x, point.y, this);//必须要GetSubMenu(0)才行,因为菜单资源IDR_SHELLMENU中第一级菜单是没有效果。 *pResult = 0; }

(4)xp及xp以上系统认为zip为directory/Folder,所以需要将zip和他们相区别

代码如下:

ULONG ulAttrs = SFGAO_FOLDER | SFGAO_BROWSABLE;//很重要哦,添加了一个SFGAO_BROWABLE; psfFolder->GetAttributesOf(1, (const struct _ITEMIDLIST **) &pInfo->pidlRel, &ulAttrs); if (ulAttrs & SFGAO_FOLDER && !(ulAttrs & SFGAO_BROWSABLE))//很重要哦,添加了一个!(ulAttrs & SFGAO_BROWSABLE); { DisplayFolder(pInfo); } else { SHFILEINFO sfi; TCHAR szPath [MAX_PATH]; if (SHGetPathFromIDList(pInfo->pidlFQ, szPath)) { GetParent()->SendMessage(WM_ADDFILE, 0,(LPARAM)pInfo); } }

 

 

你可能感兴趣的:(VC/MFC)