第11回 ドラッグ・アンド・ドロップで画像を開く

ImageViewer11_01.gif 前回は「ファイルを開く」ダイアログが利用できるようにした。今回はさらにドラッグ・アンド・ドロップで画像ファイルを開けるようにする。 まず「ImageViewerView.h」にドラッグアンドドロップ用のメッセージWM_DROPFILESのメッセージハンドラを用意する。
		MESSAGE_HANDLER(WM_DROPFILES, OnDropFiles)

ImageViewer11_02.gif そしてドラッグ・アンド・ドロップされたファイルの取得とウインドウへの利用登録を行う。 複数項目がドラッグ・アンド・ドロップされる可能性があり、さらにフォルダなど画像ファイル以外がドロップされる可能性もある。そのためフォルダは処理せず、LoadImageの戻り値を見て成功したらそれ以上読み込み処理をしないようにした。
	//ドラッグアンドドロップで開く
	LRESULT OnDropFiles(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)
	{
		bool	bRet;
		UINT	i;
		UINT	nSize;
		UINT	ret;
		HDROP	hDrop;
		TCHAR	pszBuff[MAX_PATH*10];

		hDrop = (HDROP)wParam;
		nSize = ::DragQueryFile(hDrop,-1,NULL,0);
		for(i = 0; i < nSize; i++)
		{
			ret = ::DragQueryFile(hDrop,i,pszBuff,MAX_PATH*10);
			if(ret == -1)
				continue;

			if(::PathIsDirectory(pszBuff))
				continue;

			bRet = LoadImage(pszBuff);
			if(bRet)
				break;
		}
		::DragFinish(hDrop);

		return	0;
	}
		//ドラッグアンドドロップを受け入れる
		::DragAcceptFiles(m_hWnd,TRUE);

ImageViewer11_03.gif
これで自由にドラッグ・アンド・ドロップしてファイルを読み込めるようになった。
また、「ファイルを開く」ダイアログではJPEGファイルしか選択できなかった。しかしドラッグ・アンド・ドロップ処理では拡張子のチェックを入れていないので、PNGやGIFなどJPEGファイル以外の様々な画像ファイルを開ける。

プロジェクトファイルをダウンロード


カテゴリー「画像表示ソフトを作る」 のエントリー