ツリー コントロールのドラッグ アンド ドロップ操作
更新 : 2007 年 11 月
ツリー コントロール (CTreeCtrl) は、ユーザーが項目のドラッグを開始すると通知メッセージを送信します。コントロールは、ユーザーがマウスの左ボタンを使用して項目のドラッグを開始すると TVN_BEGINDRAG 通知メッセージを送り、マウスの右ボタンを使用してドラッグを開始すると TVN_BEGINRDRAG 通知メッセージを送ります。ツリー コントロールに TVS_DISABLEDRAGDROP スタイルを設定することで、ツリー コントロールからこれらの通知を抑制することもできます。
CreateDragImage メンバ関数を呼び出して、ドラッグ操作中に表示するイメージを取得します。ツリー コントロールは、ドラッグ操作中の項目のラベルに基づいて、ドラッグ用のビットマップを作成します。次に、イメージ リストを作成し、それにビットマップを追加し、CImageList オブジェクトへのポインタを返します。
実際に項目をドラッグするコードを用意する必要があります。このコードは通常、イメージ リスト関数のドラッグ機能を使用し、ドラッグ操作が開始された後に送られる WM_MOUSEMOVE メッセージおよび WM_LBUTTONUP メッセージ (または WM_RBUTTONUP メッセージ) を処理します。イメージ リスト関数の詳細については、『MFC リファレンス』の「CImageList」、および Windows SDK の「Image Lists」を参照してください。ツリー コントロール項目のドラッグの詳細については、Windows SDK の「Dragging the Tree View Item」を参照してください。
ツリー コントロール内の項目がドラッグ アンド ドロップ操作の対象になる場合は、その項目上にマウス ポインタがあるかどうかを確認する必要があります。このチェックは HitTest メンバ関数を呼び出して行うことができます。この関数で、座標と整数変数のアドレスを指定するか、またはマウス ポインタの現在の座標が含まれている TVHITTESTINFO 構造体のアドレスを指定します。この関数は、ツリー コントロールに対するマウス カーソルの相対位置を示すフラグを整数変数または構造体に返します。ポインタがツリー コントロール内の項目上にある場合、構造体には項目のハンドルも返されます。
SetItem メンバ関数を呼び出して項目の状態を TVIS_DROPHILITED 値に設定することで、その項目がドラッグ アンド ドロップ操作の対象であることを示すことができます。この状態に設定されている項目は、ドラッグ アンド ドロップ操作の対象を示す場合に使用されるスタイルで描画されます。