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

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);
}