拖放 Outlook 附件






3.31/5 (11投票s)
这篇文章演示了如何在树视图节点上拖放 Outlook 附件,并描述了 Outlook 的私有剪贴板格式。
引言
想把 Outlook 附件拖放到树视图中却卡住了? 别担心,我来帮您。
当遇到这个需求时,我在网上搜索,发现了一些对我的项目开发非常有帮助的东西,尽管做了一些修改。 你可以在这里看到原始代码:http://www.codeguru.com/cpp/i-n/internet/email/article.php/c3381/。
这个链接很旧,提供了示例代码,但它适用于 VB,而不是 MFC,并且使用了 VC6 编译器。 我不喜欢的一件事是它使用了 COM。在这里,我使用了 MFC 高级 OLE 拖放机制,它封装了 COM,并提供了一种非常简单的开发机制。
Outlook 剪贴板格式不是一个标准格式。它注册了自己的私有格式,名为 CFSTR_FILECONTENTS
和 CFSTR_FILEDESCRIPTORA
。 另外请记住,它没有注册 Unicode 版本 CFSTR_FILEDESCRIPTORW
,因此,即使我的示例代码可以在非 Unicode 和 Unicode 上构建,但在 Unicode 构建中,在使用时可能会丢失一些 Unicode 字符。
您首先要做的是实现树视图类的 OnCreate()
函数并注册窗口和私有剪贴板格式。
int CDragnDropView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CTreeView::OnCreate(lpCreateStruct) == -1)
return -1;
//Register the private clipboard formats of Outlook
cp_format_contents = ::RegisterClipboardFormat(CFSTR_FILECONTENTS);
//We need to use Non unicode version of CFSTR_FILEDESCRIPTOR even in unicode build
cp_format_descriptor = ::RegisterClipboardFormat(CFSTR_FILEDESCRIPTORA);
m_oleDropTarget.Register (this);
//Enable drag and drop for Outlook attachments
return 0;
}
下一步是重写 OnDragEnter()
、OndragOver()
、OnDrop()
和 OnDragLeave()
函数。
在 OnDragEnter()
和 OnDragOver()
函数中,您只需过滤掉何时启用拖放以及何时禁用它。 核心功能放在 OnDrop()
函数内部。 如果您开始拖放操作,但没有将其拖放到树视图上,或者只是按下了 Escape 键,则将调用 OnDragLeave()
函数而不是 OnDrop()
,这是您应该编写清理代码的地方,例如,内存删除等。
在我的示例项目中,我有一个名为 Javed
的根节点,它指向任何地方,但它有两个子节点,Node1
和 Node2
,它们分别指向 D:\Javed\Node1 和 D:\Javed\Node2。 当您将 Outlook 附件拖放到这些节点之一时,它将被拖放到相应的节点。 您需要在系统中拥有这些文件夹; 否则您需要在 OnDrop()
函数中更改节点的路径。
void CDragnDropView::OnDrop()>
{
//Other codes
if (bStatus)
{
// Dump stream to a file
CString strFile_name,strLocation;
CString strTargetNode = GetTreeCtrl().GetItemText(m_htTargetNode);
if(!strTargetNode.CompareNoCase(_T("Node1")))
strLocation = _T("D:\\Javed\\Node1\\");
if(!strTargetNode.CompareNoCase(_T("Node2")))
strLocation = _T("D:\\Javed\\Node2\\");
strFile_name = file_descriptor.cFileName;
strFile_name = strLocation + strFile_name;
hr = StreamToFile(storage.pstm, strFile_name);
}
}
现在您可以下载示例项目并更深入地了解代码。
关注点
欢迎对此提供任何反馈。