MFC程序中,拖动文件到编辑框控件中获取全路径的实现(从CEdit派生一个CDropEdit类)

一、CDropEdit类中两个重要的消息处理函数与其它
    1、OnCreate(添加DragAcceptFiles 函数);
    2、OnDropFile(处理拖动文件到控件上并释放时产生的消息);
    3、PreTranslateMessage(用于过滤文字输入)
    注意:在程序开始运行时,需要额外添加    
    ChangeWindowMessageFilter(WM_DROPFILES, MSGFLT_ADD);
    ChangeWindowMessageFilter(0x0049, MSGFLT_ADD);       // 0x0049 == WM_COPYGLOBALDATA
    否则,WM_DROPFILES被过滤, 编辑框控件接受不到;
二、代码实现
    DropEdit.h

class CDropEdit : public CEdit
{
	DECLARE_DYNAMIC(CDropEdit)

public:
	CDropEdit(CWnd *pParentWnd=NULL);
	virtual ~CDropEdit();

protected:
	DECLARE_MESSAGE_MAP()
	virtual BOOL PreTranslateMessage(MSG* pMsg);

public:
	afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
	afx_msg void OnDropFiles(HDROP hDropInfo);

	void SetParentWnd(CWnd* pParentWnd);
private:
	CWnd * m_pParentWnd;
};

DropEdit.cpp

IMPLEMENT_DYNAMIC(CDropEdit, CEdit)

CDropEdit::CDropEdit(CWnd *pParentWnd):m_pParentWnd(pParentWnd)
{

}

CDropEdit::~CDropEdit()
{
}

BEGIN_MESSAGE_MAP(CDropEdit, CEdit)
	ON_WM_CREATE()
	ON_WM_DROPFILES()
END_MESSAGE_MAP()

// CDropEdit message handlers
BOOL CDropEdit::PreTranslateMessage(MSG* pMsg)
{
	if ((pMsg->message == WM_KEYDOWN) || (pMsg->message == WM_CHAR) || (pMsg->message == WM_RBUTTONDOWN))
		return TRUE;
	else
	{
		TranslateMessage(pMsg);
		DispatchMessage(pMsg);
	}
	return TRUE;
}


int CDropEdit::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	DragAcceptFiles(TRUE);
	return CEdit::OnCreate(lpCreateStruct);
}

void CDropEdit::OnDropFiles(HDROP hDropInfo)
{
	// 被拖拽的文件的文件名
	wchar_t szFileName[MAX_PATH + 1];
	// 得到被拖拽的文件名
	DragQueryFile(hDropInfo, 0, szFileName, MAX_PATH);
	// 把文件名显示出来
	SetWindowText(szFileName);
	UpdateData(TRUE);
	
	return CEdit::OnDropFiles(hDropInfo);
}

void CDropEdit::SetParentWnd(CWnd* pParentWnd)
{
	m_pParentWnd = pParentWnd;
}

 

你可能感兴趣的:(Visual,C++/MFC,标准(ISO),C++)