如何支持的 Windows 资源管理器树中的项目重命名
概要
在创建一个具有多个级别的文件夹的命名空间扩展时,它可能需要允许重命名的文件夹。
本文讨论如何支持在 Windows 资源管理器树中的文件夹的重命名。
本文假定您已熟悉的命名空间扩展的开发。
编写命名空间扩展的详细信息,请参阅在 7 月份,1996年问题,Microsoft 系统日志的 David 斌文章"扩展 Windows 资源管理器的名称空间扩展"。
此外,请参阅 Microsoft 知识库中相应的文章:
178665
示例: RegView.exe: 外壳命名空间扩展示例
更多信息
若要支持在 Windows 资源管理器树中的文件夹的重命名,请执行以下步骤:
- 提供响应您的 IShellFolder::GetAttributesOf 方法,可以重命名任何文件夹中的 SFGAO_CANRENAME 属性。
资源管理器将调用您与您的命名空间中的文件夹的 PIDL IShellFolder::GetAttributesOf。如果可以重命名此项,则需要将 SFGAO_CANRENAME 属性添加到该项目的属性。不要忘记您可以调用与多个 PIDLs,IShellFolder::GetAttributesOf,因此您必须只返回的属性应用到所有项目的。当在树中,Windows 资源管理器检测到所选文件夹的 SFGAO_CANRENAME 属性时,它将使文件菜单中的重命名项。
GetAttributesOf 的一个示例可能如下所示:
示例代码STDMETHODIMP CShellFolder::GetAttributesOf( UINT uCount, LPCITEMIDLIST aPidls[], LPDWORD pdwAttribs) { UINT i; for(i = 0; i < uCount; i++) { DWORD dwAttribs = 0; // Is this item a folder? if(IsFolder(aPidls[i])) { dwAttribs |= SFGAO_FOLDER; // Does this folder item have any subfolders? if(HasSubFolders(aPidls[i])) dwAttribs |= SFGAO_HASSUBFOLDER; // Can this folder be renamed? if(CanRename(aPidls[i])) dwAttribs |= SFGAO_CANRENAME; } /* On entry, *pdwAttributes contains the attributes that are being requested, so just use it as a mask. */ *pdwAttribs &= dwAttribs; } return S_OK; }
- 重命名项添加到您的 IContextMenu::QueryContextMenu 中的上下文菜单。
要支持重命名的树项目还必须添加重命名项到树中的文件夹项为提供的上下文菜单。Windows 资源管理器调用您的 IShellFolder::GetUIObjectOf 与 IID_IContextMenu IContextMenu 获取文件夹项目。当调用此 IContextMenu QueryContextMenu 方法时,您需要将重命名项添加到菜单中,如果指定了 CMF_CANRENAME,然后启用或禁用基于项目的 SFGAO_CANRENAME 属性重命名菜单项。可以创建多个项目的上下文菜单。结果是,则应禁用重命名菜单项,如果由于重命名多个项目的通常未实现的多个项目创建上下文菜单。重命名菜单项可以有任何命令标识符,只要它是唯一相对于其他菜单项。请记住,这样可以支持各种语言进行本地化的重命名菜单项设置的字符串。
下面是 IContextMenu::QueryContextMenu 无法外观的示例。此示例代码假定上下文菜单对象维护 NULL 终止其 m_aPidls 成员变量和一个指向创建它在其 m_pSFParent 成员变量 IShellFolder 中创建的项目的列表。
示例代码#define IDM_MYRENAME 0 #define IDM_LAST 5 STDMETHODIMP CContextMenu::QueryContextMenu( HMENU hMenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags) { if(!(CMF_DEFAULTONLY & uFlags)) { MENUITEMINFO mii; // Add any other menu items here. if(uFlags & CMF_CANRENAME) { ZeroMemory(&mii, sizeof(mii)); mii.cbSize = sizeof(mii); mii.fMask = MIIM_ID | MIIM_TYPE; mii.wID = 0; mii.fType = MFT_SEPARATOR; InsertMenuItem( hMenu, indexMenu++, TRUE, &mii); ZeroMemory(&mii, sizeof(mii)); mii.cbSize = sizeof(mii); mii.fMask = MIIM_ID | MIIM_TYPE | MIIM_STATE; mii.wID = idCmdFirst + IDM_MYRENAME; mii.fType = MFT_STRING; mii.dwTypeData = TEXT("&Rename"); mii.fState = (CanRenameItems() ? MFS_ENABLED : MFS_DISABLED); InsertMenuItem( hMenu, indexMenu++, TRUE, &mii); } // Add the following menu items here. return MAKE_HRESULT(SEVERITY_SUCCESS, 0, USHORT(IDM_LAST + 1)); } return MAKE_HRESULT(SEVERITY_SUCCESS, 0, USHORT(0)); } BOOL CContextMenu::CanRenameItems(void) { if(m_aPidls) { // Get the number of items assigned to this object. UINT i; for(i = 0; m_aPidls[i]; i++) { } // You can't rename more than one item at a time. if(i > 1) return FALSE; DWORD dwAttributes = SFGAO_CANRENAME; m_pSFParent->GetAttributesOf(i, (LPCITEMIDLIST*)m_aPidls, &dwAttributes); return dwAttributes & SFGAO_CANRENAME; } return FALSE; }
- 指定 GCS_VERB 时,请提供响应您的 IContextMenu::GetCommandString 方法中的"重命名"动作。
当选中菜单中的项目时,Windows 资源管理器将调用您选定的菜单项的命令 id,以确定此菜单项是否支持"重命名"谓词的 GCS_VERB 与 IContextMenu::GetCommandString。它这样做是专门为了允许命名空间扩展以支持重命名的树中的项目。如果您 GetCommandString 提供所选的菜单项的"重命名"动作,它将树项目放到编辑模式并返回。
如果您的扩展是用 UNICODE 定义,则 GCS_VERB 将定义为 GCS_VERBA 或 GCS_VERBW。没有与此问题在某些平台上。Windows NT 4.0 没有 Internet Explorer 或 Internet Explorer 3.0 x 将始终通过 GCS_VERBW,即使使用 UNICODE 或未定义生成扩展。这已得到纠正与 Internet Explorer 4.0 x,它可在其中调用 GetCommandString 与 GCS_VERBW,而且,如果失败,然后调用 GetCommandString 与 GCS_VERBA。Windows 95 总是通过 GCS_VERBA,因为 Windows 95 不支持 UNICODE 的扩展。若要确保所有平台都支持,应显式处理 GCS_VERBA 和 GCS_VERBW 的情况。
此外请记住"重命名"谓词未进行本地化,因此它将始终是字符串"重命名"。在进行比较时,将忽略该谓词的大小写。
示例代码
GetCommandString 的一个示例可能如下所示:STDMETHODIMP CContextMenu::GetCommandString( UINT idCommand, UINT uFlags, LPUINT lpReserved, LPTSTR lpszName, UINT uMaxNameLen) { HRESULT hr = E_INVALIDARG; switch(uFlags) { case GCS_VERBA: switch(idCommand) { case IDM_MYRENAME: lstrcpynA((LPSTR)lpszName, "rename", uMaxNameLen); hr = NOERROR; break; } break; /* Windows NT 4.0 with Internet Explorer 3.0x or no Internet Explorer will always call this with GCS_VERBW. In this case, you need to do the lstrcpyW to the pointer passed. */ case GCS_VERBW: switch(idCommand) { case IDM_MYRENAME: lstrcpynW((LPWSTR)lpszName, L"rename", uMaxNameLen); hr = NOERROR; break; } break; } return hr; }
参考
属性
文章编号: 179900 - 最后修改: 2005年7月11日 - 修订: 1.4
关键字: | kbmt kbextension kbhowto kbnamespace KB179900 KbMtzh |
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版:
179900
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。