自定义的COleDropTarget

来源:百度文库 编辑:神马文学网 时间:2024/05/04 15:25:02
COleDropTarget
一个COleDropTarget对象提供窗口与OLE库之间的通讯机制。创建这个类的对象之后,窗口就可以通过OLE拖放机制接收数据。
为了使一个窗口能够接收拖放来的命令,就必须首先创建一个COleDropTarget类对象,然后调用Register函数,该函数只有一个参数,该参数是一个指向所需要的CWnd对象的指针。
有关使用OLE进行拖放操作的更多信息,参见“Visual C++程序员指南”一书中的文章“拖放(OLE)”。
#include
请参阅:COleDropSource
COleDropTarget类成员
构造COleDropTarget构造一个COleDropTarget对象
操作Register将一个窗口注册为一个有效的拖放目标
Revoke使窗口不再是一个有效的拖放目标
可重载OnDragEnter当光标第一次进入窗口时被调用
OnDragLeave当光标被拖动出窗口时被调用
OnDragOver当光标在窗口中拖动时被重复调用
OnDragScroll用来确定光标是否被拖进了窗口的滚动条区域
OnDrop当数据被放在窗口中时被调用,缺省的处理
OnDropEx当数据被放在窗口中时被调用,最初的处理
自定义部分如下
1.头文件部分
#pragma once
#define WM_OLEDROPTARGET_MSG    WM_USER  +1467
struct AFX_EXT_CLASS TPOleDropData
{
CWnd           *pWnd;
COleDataObject *pDataObject;
DWORD           dwKeyState;
CPoint          point;
DROPEFFECT      eRetrun;
public:
BOOL           CheckType(UINT uType,LPCTSTR sType);
};
class AFX_EXT_CLASS CTPOleDropSource: public COleDropSource
{
public:
CTPOleDropSource();
virtual ~CTPOleDropSource();
};
class AFX_EXT_CLASS CTPOleDropTarget: public COleDropTarget
{
DECLARE_DYNAMIC(CTPOleDropTarget)
public:
CTPOleDropTarget();
virtual ~CTPOleDropTarget();
public:
CWnd              *m_pMsgWnd;
private:
TPOleDropData      m_stuOleDropData;
public:
virtual DROPEFFECT OnDragEnter(CWnd* pWnd, COleDataObject* pDataObject, DWORD dwKeyState, CPoint point);
virtual DROPEFFECT OnDragOver(CWnd* pWnd, COleDataObject* pDataObject, DWORD dwKeyState, CPoint point);
virtual BOOL       OnDrop(CWnd* pWnd, COleDataObject* pDataObject,DROPEFFECT dropEffect, CPoint point);
virtual void       OnDragLeave(CWnd* pWnd);
protected:
DECLARE_MESSAGE_MAP()
};
2 cpp部分
#include "stdafx.h"
#include "TPOleDropTarget.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
// CTPOleDropTarget
IMPLEMENT_DYNAMIC(CTPOleDropTarget, COleDropTarget)
CTPOleDropTarget::CTPOleDropTarget()
{
m_pMsgWnd = NULL;
m_stuOleDropData.dwKeyState   = 0;
m_stuOleDropData.pDataObject  = NULL;
m_stuOleDropData.point        = CPoint(0,0);
m_stuOleDropData.pWnd         = NULL;
m_stuOleDropData.eRetrun      = DROPEFFECT_NONE;
}
CTPOleDropTarget::~CTPOleDropTarget()
{
}
BEGIN_MESSAGE_MAP(CTPOleDropTarget, COleDropTarget)
END_MESSAGE_MAP()
DROPEFFECT CTPOleDropTarget::OnDragEnter(CWnd* pWnd, COleDataObject* pDataObject,DWORD dwKeyState, CPoint point)
{
m_stuOleDropData.dwKeyState   = dwKeyState;
m_stuOleDropData.pDataObject  = pDataObject;
m_stuOleDropData.point        = point;
m_stuOleDropData.pWnd         = pWnd;
if(pWnd == m_pMsgWnd && m_pMsgWnd)
{
m_pMsgWnd->SendMessage(WM_OLEDROPTARGET_MSG,0,(LPARAM)&m_stuOleDropData);
return m_stuOleDropData.eRetrun;
}
else return DROPEFFECT_NONE;
}
DROPEFFECT CTPOleDropTarget::OnDragOver(CWnd* pWnd, COleDataObject* pDataObject,DWORD dwKeyState, CPoint point)
{
m_stuOleDropData.dwKeyState   = dwKeyState;
m_stuOleDropData.pDataObject  = pDataObject;
m_stuOleDropData.point        = point;
m_stuOleDropData.pWnd         = pWnd;
if(pWnd == m_pMsgWnd && m_pMsgWnd)
{
m_pMsgWnd->SendMessage(WM_OLEDROPTARGET_MSG,1,(LPARAM)&m_stuOleDropData);
return m_stuOleDropData.eRetrun;
}
else return DROPEFFECT_NONE;
}
BOOL CTPOleDropTarget::OnDrop(CWnd* pWnd, COleDataObject* pDataObject,DROPEFFECT dropEffect, CPoint point)
{
m_stuOleDropData.dwKeyState   = dropEffect;
m_stuOleDropData.pDataObject  = pDataObject;
m_stuOleDropData.point        = point;
m_stuOleDropData.pWnd         = pWnd;
if(pWnd == m_pMsgWnd && m_pMsgWnd)
{
m_pMsgWnd->SendMessage(WM_OLEDROPTARGET_MSG,2,(LPARAM)&m_stuOleDropData);
return m_stuOleDropData.eRetrun;
}
else return DROPEFFECT_NONE;
}
void CTPOleDropTarget::OnDragLeave(CWnd* pWnd)
{
m_stuOleDropData.dwKeyState   = 0;
m_stuOleDropData.pDataObject  = NULL;
m_stuOleDropData.point        = CPoint(0,0);
m_stuOleDropData.pWnd         = pWnd;
if(m_pMsgWnd)
{
m_pMsgWnd->SendMessage(WM_OLEDROPTARGET_MSG,3,(LPARAM)&m_stuOleDropData);
}
}
BOOL TPOleDropData::CheckType(UINT uType,LPCTSTR sType)
{
if(pDataObject == NULL) return FALSE;
if(CF_HDROP == uType)
{
return pDataObject->IsDataAvailable(CF_HDROP,NULL);
}
else
{
if(!pDataObject->IsDataAvailable(uType,NULL)) return FALSE;
if(lstrlen(sType)>0)
{
HGLOBAL hGlobal   =   pDataObject->GetGlobalData(uType,NULL);;
LPBYTE lpData     = (LPBYTE)GlobalLock(hGlobal);
CString      sFileName = _T("");
sFileName  = (LPCTSTR)(LPTSTR)lpData;
GlobalUnlock(hGlobal);
if(sFileName.Find(sType)>=0) return TRUE;
else                         return FALSE;
}
else return TRUE;
}
return FALSE;
}
// CTPOleDropTarget message handlers
只要在需要接受拖拽素材的窗口的构造函数中加入
m_pDropTarget = new CTPOleDropTarget();
m_pDropTarget ->m_pMsgWnd = this;
m_pDropTarget ->Register(this);
析构函数中加入
if(m_pDropTarget)
{
m_pDropTarget ->Revoke();
delete m_pDropTarget;
m_pDropTarget = NULL;
}
加一个相应函数LRESULT            OnMsgOleDrag(WPARAM wp,LPARAM lp);
ON_MESSAGE(WM_OLEDROPTARGET_MSG,OnMsgOleDrag)