【VC++】ドラッグ&ドロップでファイルパスをセットする
<機能>
(1)ダイアログに配置された2つのエディットボックスがドラッグ&ドロップ通知を受け取ります
(2)複数ファイルがドラッグ&ドロップされたときリストボックスにすべてのパスを表示します
(3)ドラッグ&ドロップクラス(CDropFile)により2つのエディットボックスは同じ動作をします
<動作検証&開発環境>
Visual Studio Community 2015
<イメージ>
2つのエディットボックスにそれぞれドラッグ&ドロップするとエディットボックスには最後にドロップされたパス、リストボックスにはドロップされたすべてのパスが表示されます
<使い方>
ドラッグ&ドロップサンプルアプリを作成する手順を記載します。
Visual Studio 2015での手順ですが他でもそんなに変わらないと思います。
(1)MFCアプリケーションでプロジェクトを作成(名前はDropSampleとします)
(2)アプリケーションの種類でダイアログベースを選択
その他の設定はデフォルトで問題ないので[完了]を押下してください。
(3)ダイアログにエディットボックス、リストボックスを配置
IDC_EDIT1、IDC_EDIT2のプロパティ変更
・Right Align Text : True
・Right To Left Reading Order : True
ドロップしたパスを右寄せで表示します(ファイル名が表示されるようにする)
・Accept Files : True
ドラッグ&ドロップ通知を受け取るためにAcceptFilesをTrueに変更します
IDC_LIST1、IDC_LIST2
・Right Align : Text True
右寄せで表示します(ファイル名が表示されるようにする)
(4)クラスを追加します
クラス ウィザード→[クラスの追加]押下しクラスを追加します。
本サンプルアプリはエディットボックスにドロップするため基底クラスにCEditを指定します。
クラス名 : CDropFile
基底クラス : CEdit
(5)追加したCDropFileクラスにイベントWM_DROPFILESを追加します
・クラス ウィザード画面にてクラス名からCDropFileを選択
・メッセージよりWM_DROPFILESを選択
・[ハンドラーの追加]押下
(6)エディットボックス、リストボックスにメンバ変数をセットします
IDC_EDIT1、IDC_EDIT2にメンバ変数追加
・変数の種類(型) : CDropFile型
・変数名 : m_dpEdit1(m_dpEdit2)
・コントロール変数 : チェックOn
・カテゴリ : コントロール
IDC_LIST1、IDC_LIST2にメンバ変数追加
・変数の種類(型) : CListBox
・変数名 : m_List1(m_List2)
・コントロール変数 : チェックOn
・カテゴリ : コントロール
変数が追加されると以下のようになります。
(7)エディットボックスにEN_CHANGEメッセージを追加します
・クラス ウィザード画面にてクラス名からCDropSampleDlgを選択
・コマンドタブからIDC_EDIT1(IDC_EDIT2)を選択
・メッセージの一覧よりEN_CHANGEを選択
・[ハンドラーの追加]押下
(8)ソースの追加
//DropFile.h
//複数ファイル(フォルダ)がドロップされた時のためにパスを格納する配列(csdrop)を用意
public CEdit
{
//〜省略〜
//複数ファイル(フォルダ)がドロップされたときにパスを格納する
CStringArray csdrop;
};
//DropFile.cpp
//ドロップされた時の動作を記載
ファイル(フォルダ)がドロップされた時のイベント
***********************************************************/
void CDropFile::OnDropFiles(HDROP hDropInfo)
{
//ドロップされたファイルの個数を取得
//DragQueryFile の詳細についてはmsdn参照
//第2引数に -1 を指定すると、DragQueryFile はドロップされたファイルの総数を返します
//unsigned int型の 0 を反転させると -1(0xFFFFFFFF) です
UINT iCnt = DragQueryFile(hDropInfo, ~0u, NULL, 0);
csdrop.RemoveAll();
{
//ファイル名の長さを取得
//第3引数にNULLを指定すると、DragQueryFile は必要なバッファのサイズを文字単位で返します
UINT iLen = DragQueryFile(hDropInfo, i, NULL, 0);
//第2引数に0〜ドロップされたファイルの総数未満のいずれかの値を指定すると、その値に対応するファイル(フォルダ)名を格納します
CString csfile;
DragQueryFile(hDropInfo, i, csfile.GetBuffer(iLen + 1), iLen + 1);
csfile.ReleaseBuffer();
csdrop.Add(csfile);
//複数ファイルドロップした場合は結果として最後に処理したパスが表示される)
this->SetWindowText(csfile);
}
}
//DropSampleDlg.cpp
//エディットボックス、リストボックスをドロップされたパスで更新する
IDC_EDIT1のイベント
***********************************************************/
void CDropSampleDlg::OnChangeEdit1()
{
int idx;
UpdateData(TRUE);
m_List1.ResetContent();
{
m_List1.AddString(m_dpEdit1.csdrop.GetAt(idx));
}
}
IDC_EDIT2のイベント
***********************************************************/
void CDropSampleDlg::OnChangeEdit2()
{
int idx;
UpdateData(TRUE);
m_List2.ResetContent();
{
m_List2.AddString(m_dpEdit2.csdrop.GetAt(idx));
}
}
よろしければポチッと押してください