ドラッグ&ドロップしたファイル名を取得する




さあ、今日はドラッグ&ドロップをしてみましょう。

(サンプル:WinTailView.cpp)
BOOL CWinTailView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: この位置で CREATESTRUCT cs を修正して Window クラスまたはスタイルを
	//  修正してください。

	BOOL bPreCreated = CEditView::PreCreateWindow(cs);
//	cs.style &= ~(ES_AUTOHSCROLL|WS_HSCROLL);	// ワード ラップを使用可能にします

	// 水平スクロールバーを表示する
	cs.style &= ~WS_VSCROLL;

	// ファイルのドロップを有効にする
	cs.dwExStyle = cs.dwExStyle | WS_EX_ACCEPTFILES;

	return bPreCreated;
}

まずは、ウィンドウをドラッグ&ドロップに対応させる必要があります。
ウィンドウの拡張スタイルにWS_EX_ACCEPTFILESを追加してやればOKです。
サンプルはViewクラスですが、MainFrmでも同様の処理を行っておいた方 がいいと思います。



次にクラスウィザードからViewクラスにWM_DROPFILES関数を追加します。
ファイルがドロップされたらこの処理が動くわけです。



(サンプル:WinTailView.cpp)
void CWinTailView::OnDropFiles(HDROP hDropInfo) 
{
	// TODO: この位置にメッセージ ハンドラ用のコードを追加するかまたはデフォルトの処理を呼び出してください

	char	DropFileName[255];			// ドロップファイルの名称
	int		ret;						// 関数戻り値


	// ドロップファイルの名称を初期化する
	memset( DropFileName, NULL, sizeof(DropFileName) );

	// ドロップファイルの名称を取得する
	ret = DragQueryFile( hDropInfo, 0x00, DropFileName, sizeof(DropFileName) );

	E_ReadFileName = _T("");
	E_ReadFileName = DropFileName;

	if( E_TimeSts == FALSE )
	{
		// タイマの再設定を行なう
		SetTimer( D_TIME_UPDATE,1000,NULL );

		// タイマ設定状態を設定中にする
		E_TimeSts = TRUE;
	}

	// MainFrmクラスへファイルがファイルが選択された事を通知する
	::SendMessage( E_WinHdl_Main, D_MSG_FILESELECTED, NULL, NULL );

	
	
	CEditView::OnDropFiles(hDropInfo);
}

ドロップされたファイル名を取得するにはDragQueryFile()関数を使用します。
1番目の引数はOnDropFiles()で渡されたhDropInfoをそのまま渡します。
2番目の引数はドロップファイルが1ファイルであれば0x00を指定して、複数ファイルであれば0xFFFFFFFFを 指定します。
3番目にはファイル名のバッファ、4番目にはそのサイズを渡します。
ただし、3番目と4番目の引数は1ファイル指定の時(2nd Arg=0x00)だけ有効です。
では複数ファイルのファイル名称はどうするんだ、ということになるのですが、N村にも 分かりません。分かっているのはhDropInfoのアドレスからダンプすると、複数のドロップした ファイル名が見えるということです。どうやら、ファイル名の格納されているhDropInfoのアドレス からの相対アドレスは変わらないので、強引に取ってこいということなのでしょうか?
戻り値は1ファイル指定(2nd Arg=0x00)ならファイル名の文字列長、複数ファイル指定(2nd Arg=0xFFFFFFFF) ならファイル数です。




N総研ソフトウェア開発部のTOPに戻る。

このページに関するご意見・質問は
ドンタコスN村 E-mail:wnaka@coco.ned.co.jp
まで送信してください。