65.9K
CodeProject 正在变化。 阅读更多。
Home

拖放 Outlook 附件

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.31/5 (11投票s)

2008年1月1日

CPOL

2分钟阅读

viewsIcon

55936

downloadIcon

1185

这篇文章演示了如何在树视图节点上拖放 Outlook 附件,并描述了 Outlook 的私有剪贴板格式。

引言

想把 Outlook 附件拖放到树视图中却卡住了? 别担心,我来帮您。

当遇到这个需求时,我在网上搜索,发现了一些对我的项目开发非常有帮助的东西,尽管做了一些修改。 你可以在这里看到原始代码:http://www.codeguru.com/cpp/i-n/internet/email/article.php/c3381/

这个链接很旧,提供了示例代码,但它适用于 VB,而不是 MFC,并且使用了 VC6 编译器。 我不喜欢的一件事是它使用了 COM。在这里,我使用了 MFC 高级 OLE 拖放机制,它封装了 COM,并提供了一种非常简单的开发机制。

Outlook 剪贴板格式不是一个标准格式。它注册了自己的私有格式,名为 CFSTR_FILECONTENTSCFSTR_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 的根节点,它指向任何地方,但它有两个子节点,Node1Node2,它们分别指向 D:\Javed\Node1D:\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);
    }
}

现在您可以下载示例项目并更深入地了解代码。

关注点

欢迎对此提供任何反馈。

© . All rights reserved.