プログラミングメモ →目次

ドラッグアンドドロップ(VC++MFC)

Drag And Drop

MFCを使って、ドラッグアンドドロップ機能を簡単に実装できます。ダイアログ上に貼り付いた二つのエディット間のドラッグアンドドロップを例として、実装方法を記述します。サンプルソースダウンロード

1.ダイアログを作成して、ダイアログの上にエディットを二つを貼り付けます。

2.CEditから派生クラスを作成します(例え:CEditForDD)。

3.自分のクリップボートフォーマットを登録します。例えば、

#define CFSTR_TEXT_TEST	"TextTest.Format"
const UINT CF_TEXT_TEST = RegisterClipboardFormat(CFSTR_TEXT_TEST);

4.COleDropTargetから派生クラスを作成します(例え:CDropTarget)。 下記の二つのメンバー関数を継承して、後に実装します。

	virtual DROPEFFECT OnDragOver(CWnd* pWnd, COleDataObject* pDataObject,
		DWORD dwKeyState, CPoint point);
	virtual BOOL OnDrop(CWnd* pWnd, COleDataObject* pDataObject,
		DROPEFFECT dropEffect, CPoint point);

5.CEditForDDクラスにメンバー変数のCDropTarget m_DropTarget;追加します。二つのエディットをCEditForDDの型として、ダイアログクラスにメンバー変数(例え:CEditForDD m_Ed1; CEditForDD m_Ed2;)を追加します。ダイアログのOnInitDialog()関数の中で、m_Ed1m_Ed2m_DropTargetのメンバー関数Register()を呼び出します。

6.CEditForDDのイベントハンドラのOnLButtonDown(UINT nFlags, CPoint point)を継承して、ドラッグを開始する為の処理を実装します。具体的に言えば、エディットから文字列をクリップボードに投げて、ドラッグアンドドロップのモードに突入します。

7.CDropTargetOnDrop()を実装します。ドロップした時にクリップボードから文字列を拾って、エディットに設定するよいにします。

8.OnDragOver()を実装して、ドラッグアンドドロップのモードで、マウスカーソルがエディットの領域に入っている時に、[+]のようなマークを表示するようにします。