一般来说,给树设置一个imagelist,然后调用TreeView_CreateDragImage即可处理拖动相关的问题,但是,当没有imagelist时,如何处理拖动呢?
目前没有找到相关资料,请各位朋友帮忙!

解决方案 »

  1.   

    MSDN:拖放 (OLE)OLE 的拖放功能主要是作为复制和粘贴数据的快捷方式。使用剪贴板复制或粘贴数据时,需要执行许多步骤。选择数据,单击“编辑”菜单中的“剪切”或“复制”,转至目标文件、窗口或应用程序,将光标置于希望的位置处,然后单击“编辑”菜单中的“粘贴”。OLE 拖放不同于文件管理器的拖放机制,后者只能处理文件名并专门用于将文件名传递给应用程序。OLE 拖放则通用得多。它允许拖放任何可以放置到剪贴板上的数据。当使用 OLE 拖放时,从上述过程中去掉两个步骤。从源窗口(“放置源”)选择数据,将其拖动到所需的目标(“放置目标”),然后松开鼠标按钮将其放下。该操作不需要使用菜单,因此比复制/粘贴序列的速度快。该操作的唯一要求是放置源和放置目标都必须已打开,并且在屏幕上必须至少部分可见。使用 OLE 拖放可以在一个文档中、不同文档之间或应用程序之间,将数据从一个位置传输到另一个位置。无论在容器应用程序中还是在服务器应用程序中都可以实现该操作,而且任何应用程序可以是放置源或是放置目标,也可以既是放置源又是放置目标。如果应用程序同时实现了放置源支持和放置目标支持,则将在子窗口之间或在一个窗口内启用拖放。该功能可使应用程序的使用容易得多。如果只想使用 OLE 的拖放功能,请参见拖放:自定义。可以通过使用该文章中解释的技术,使非 OLE 应用程序成为放置源。拖放:实现放置目标一文描述了如何为 OLE 应用程序和非 OLE 应用程序实现放置目标支持。查看 MFC OLE 示例 OCLIENT 和 HIERSVR 也很有帮助。如果尚未阅读数据对象和数据源 (OLE) 文章族,现在可能需要阅读。这些文章解释了数据传输的基本知识以及如何在应用程序中实现数据传输。有关拖放的更多信息,请参见: 拖放:实现放置源 
    拖放:实现放置目标 
    拖放:自定义 
      

  2.   

    拖放:实现放置源本文解释如何使应用程序为拖放操作提供数据。放置源的基本实现相对较简单。第一步是确定哪个事件开始拖动操作。建议的用户界面指南将拖动操作的开始定义为选择数据和在选定数据内的某个点发生的 WM_LBUTTONDOWN 事件。MFC OLE 示例 OCLIENT 和 HIERSVR 遵循这些指南。如果应用程序是容器应用程序,并且选定的数据是 COleClientItem 类型的链接对象或嵌入对象,则调用其 DoDragDrop 成员函数。否则,构造 COleDataSource 对象,用选定内容初始化该对象,然后调用数据源对象的 DoDragDrop 成员函数。如果应用程序是服务器,则使用 COleServerItem::DoDragDrop。有关自定义标准拖放行为的信息,请参见拖放:自定义一文。如果 DoDragDrop 返回 DROPEFFECT_MOVE,请立即从源文档中删除源数据。DoDragDrop 返回的任何其他值均不会对放置源产生影响。有关更多信息,请参见: 实现放置目标 
    自定义拖放 
    创建和销毁 OLE 数据对象和数据源 
    操作 OLE 数据对象和数据源 
      

  3.   

    拖放:实现放置目标本文概述如何使应用程序成为放置目标。同实现放置源相比,实现放置目标所需的步骤稍多一些,但仍然相对简单。这些技术也适用于非 OLE 应用程序。实现放置目标 向希望其成为放置目标的应用程序的每个视图中添加一个成员变量。该成员变量必须是 COleDropTarget 类型或由其派生的类。 
    从处理 WM_CREATE 消息(通常是 OnCreate)的视图类函数中,调用新成员变量的 Register 成员函数。当视图被销毁时,会自动调用 Revoke。 
    重写下列函数。如果希望整个应用程序中的行为相同,在视图类中重写这些函数。如果希望修改独立情况中的行为,或希望在非 CView 窗口中启用放置,则在 COleDropTarget 派生类中重写这些函数。重写 允许 
    OnDragEnter 放置操作发生在窗口中。当光标首次进入该窗口时调用。 
    OnDragLeave 拖动操作离开指定窗口时的特殊行为。 
    OnDragOver 放置操作发生在窗口中。当光标正在被拖过窗口时调用。 
    OnDrop 处理放置到指定窗口中的数据。 
    OnScrollBy 目标窗口中需要滚动时的特殊行为。 有关这些函数是如何一起工作的示例,请参见 MAINVIEW.CPP 文件,该文件是 MFC OLE 示例 OCLIENT 的一部分。有关更多信息,请参见: 实现放置源 
    创建和销毁 OLE 数据对象和数据源 
    操作 OLE 数据对象和数据源 
      

  4.   

    拖放:自定义对于大多数应用程序而言,拖放功能的默认实现就已经足够了。但是,某些应用程序可能要求更改此标准行为。本文解释更改这些默认行为所必需的步骤。此外,可以使用该技术建立不支持复合文档作为放置源的应用程序。如果自定义标准 OLE 拖放行为,或者有非 OLE 应用程序,则必须创建 COleDataSource 对象来包含数据。当用户启动拖放操作时,代码应从该对象而不是从支持拖放操作的其他类中调用 DoDragDrop 函数。另一种方法是,可创建一个 COleDropSource 对象来控制放置,并根据要更改的行为类型重写该对象的某些函数。这个放置源对象随后传递给 COleDataSource::DoDragDrop,以更改这些函数的默认行为。这些不同的选项为如何在应用程序中支持拖放操作提供了极大的灵活性。有关数据源的更多信息,请参见数据对象和数据源 (OLE) 一文。可以重写下列函数来自定义拖放操作:重写 自定义 
    OnBeginDrag 调用 DoDragDrop 后如何启动拖动。 
    GiveFeedback 不同放置结果的可视反馈(如光标外观)。 
    QueryContinueDrag 拖放操作的终止。该函数使您能够在拖动操作期间检查组合键状态。 
      

  5.   

    谢谢楼上的解答,但不是我要的信息。
    我想问的是,如何在没有imagelist的情况下处理拖拽的imagelist