エディットコントロールでドラッグドロップ

#keywords(VC++,MFC,ドラッグドロップ)

エディットコントロールでドラッグドロップ [#qd70c813]

MFCアプリケーションのエディットコントロールに、ドラッグドロップでファイルを受けるには、コントロールのプロパティで「Acccept Files」を”True”にすれば、ファイルを受けることができます。
しかしこれだけでは、受けることができるだけでファイル名を取得したり、表示することはできません。

そこで、下記のようなクラスを作成しました。エディットコントロールをサブクラス化することで、ドラッグドロップするとファイル名が表示されるとともに、メンバ変数にファイルのパスが格納されます。
// DropEdit.h
 
#pragma once
 
// CDropEdit
 
class CDropEdit : public CEdit
{
	DECLARE_DYNAMIC(CDropEdit)
 
public:
	CDropEdit();
	virtual ~CDropEdit();
 
protected:
	DECLARE_MESSAGE_MAP()
public:
	afx_msg void OnDropFiles(HDROP hDropInfo);
	CString m_szFilePath;
};
// DropEdit.cpp
#include "stdafx.h"
#include "DropEdit.h"
#include ".\dropedit.h"
 
// CDropEdit
 
IMPLEMENT_DYNAMIC(CDropEdit, CEdit)
CDropEdit::CDropEdit()
{
	m_szFilePath = _T("");
}
 
CDropEdit::~CDropEdit()
{
}
 
BEGIN_MESSAGE_MAP(CDropEdit, CEdit)
	ON_WM_DROPFILES()
END_MESSAGE_MAP()
 
// CDropEdit メッセージ ハンドラ
 
void CDropEdit::OnDropFiles(HDROP hDropInfo)
{
	UINT nFiles;	// ドロップファイル数
	UINT nSize;	// ファイル名サイズ
	CString szName;	// 文字列
 
	// ドロップされたファイル数を取得
	nFiles = DragQueryFile(hDropInfo, 0xFFFFFFFF, NULL, 0);
 
	if (nFiles < 1)
	{
		return;
	}
 
	nSize = DragQueryFile(hDropInfo, 0, NULL, 0);
	DragQueryFile(hDropInfo, 0, szName.GetBuffer(nSize + 1), nSize + 1);
	szName.ReleaseBuffer();
 
	m_szFilePath = szName;
	int nPos = szName.ReverseFind('\\');
	szName = szName.Mid(nPos + 1);
 
	SetWindowText(szName);
 
	CEdit::OnDropFiles(hDropInfo);
}
OK キャンセル 確認 その他