ツリー コントロールのドラッグ アンド ドロップ操作
ツリー コントロール (CTreeCtrl) は、ユーザーが項目のドラッグを開始したときに通知を送信します。 このコントロールは、ユーザーがマウスの左ボタンを使用して項目のドラッグを開始したときに TVN_BEGINDRAG 通知メッセージを送信し、ユーザーが右ボタンを使用してドラッグを開始したときに TVN_BEGINRDRAG 通知メッセージを送信します。 ツリー コントロールからのこれらの通知の送信を停止するには、ツリー コントロールに TVS_DISABLEDRAGDROP スタイルを指定します。
ドラッグ操作中に表示するイメージを取得するには、CreateDragImage メンバー関数を呼び出します。 ツリー コントロールは、ドラッグされる項目のラベルに基づいて、ドラッグ ビットマップを作成します。 その後で、ツリー コントロールは、イメージ リストを作成して、それにビットマップを追加し、CImageList オブジェクトへのポインターを返します。
実際に項目をドラッグするコードを指定する必要があります。 これには、通常、イメージ リスト関数のドラッグ機能の使用と、ドラッグ操作の開始後に送信される WM_MOUSEMOVE メッセージと WM_LBUTTONUP (または WM_RBUTTONUP) メッセージの処理が含まれます。 イメージ リスト関数の詳細については、MFC リファレンスの「CImageList」と Windows SDK の「イメージ リスト」を参照してください。 ツリー コントロール項目のドラッグの詳細については、Windows SDK の「ツリー ビュー項目のドラッグ」を参照してください。
ツリー コントロール内の項目をドラッグ アンド ドロップ操作のターゲットにする場合は、マウス カーソルがターゲット項目上に存在するタイミングを知る必要があります。 そのタイミングを検出するには、HitTest メンバー関数を呼び出します。 ポイントと整数、または、マウス カーソルの現在の座標が格納される TVHITTESTINFO 構造体のアドレスを指定します。 関数が戻ると、整数または構造体に、ツリー コントロールに対するマウス カーソルの位置を示すフラグが含まれています。 カーソルがツリー コントロール内の項目上に存在する場合は、構造体にその項目のハンドルも含まれています。
項目がドラッグ アンド ドロップ操作のターゲットであることを指定するには、SetItem メンバー関数を呼び出してその状態を TVIS_DROPHILITED
値に設定します。 この状態にある項目は、ドラッグ アンド ドロップ ターゲットを示すために使用されるスタイルで描画されます。