ツリービューでドラッグアンドドロップした際に"IEのお気に入り"のように挿入や並び替えをするには?

解決


saru  2004-08-24 06:30:49  No: 54282

いつもお世話になっております。
開発環境は Windows Xp, VC++6.0 MFC使用
ダイアログベースで開発を行っています。

ツリービューでドラッグアンドドロップを行い、ウィンドウ内で
ツリービューアイテムの移動やコピーが出来るものを作っています。
通常のドラッグアンドドロップは出来るようになったのですが、今度は
IEの"お気に入り"のようにアイテムの挿入や並べ替えが出来るように
したいと考えています。

IEの"お気に入り"を見て頂ければ分かるのですが、まず
ドラッグしたアイテムをどこかのフォルダの直下へ挿入する場合は
そのフォルダの上にカーソルを移動しフォルダが選択された状態で
ドロップ操作を行えば、アイテムはフォルダの直下に挿入されます。

また、ドラッグしたアイテムAをどこかのアイテムBとアイテムCの間に
挿入(この場合、同じ階層に挿入)する場合は、アイテムBとアイテムCの
間にカーソルを持ってくると、両アイテム間に"横棒"が現われます。
その位置でドロップ操作を行うとアイテムBとアイテムCの間にアイテムAが
並んで表示(挿入)されます。

質問1. マウスカーソルを移動した時にアイテムが選択されているのか、
       またはアイテム間が選択されているのかを知る方法を探しています。
       メッセージが投げられるのかと思って調査しているのですが、
       それらしきものが見つかりません。ご指導お願い致します。

質問2. "質問1"と関係しているような気がしますが、画面上でアイテムの
       選択状態とアイテム間の選択状態を区別する方法を調査しています。
       SetInsertMark()を使えばアイテム間に"横棒"を表示出来ることは
       分かったのですが、通常アイテムを選択したときにアイテム名を
       反転させる表示も同時に表示されてしまいます。
       IEの"お気に入り"のようにアイテムが選択されている状態から
       少しづつずらしていくとアイテムの選択表示が消え、アイテム間の
       選択表示である"横棒"が現われるというようにしたいと考えています。
       アイテム間を選択されていることが分からないので区別しようが
       無い気もするのですが・・・

以上の内容について調査しております。
ご指導宜しくお願い致します。


Gak  2004-08-25 20:53:38  No: 54283

> アイテム間が選択されているのかを知る方法
アイテム間 というものは無いような…。(言い換えると、アイテム間 == 0)

実際は、CTreeCtrl::GetItemRect() でマウスカーソル位置のアイテムの領域を取得して、
マウスカーソル位置が
・下方 1/3 に在るなら現在のアイテムの下に横棒
・中央 1/3 に在り現在のアイテムがフォルダならハイライト表示(CTreeCtrl::SelectDropTarget())
・上記に該当しない現在のアイテムの上に横棒
という感じでは?(1/3 というのは適当な値ですが)


saru  2004-08-26 20:35:46  No: 54284

Gakさんご指導ありがとうございます。
返事が遅くなり申し訳ありません。
教えて頂いた方法で無事出来ました。
実装方法等をまとめてから再度報告したいと思います。
まずは問題解決の報告とお礼を。
どうもありがとうございました。


saru  2004-08-30 21:55:28  No: 54285

遅くなりましたが実装の報告です。
いろんな実装が進行してしまった為、きれいに抜粋
出来ていないかも知れませんがご了承ください。

------OnMouseMove内------

UINT  flags;
HTREEITEM hitem = HitTest(point, &flags);
RECT lpRect;
GetItemRect( hitem, &lpRect, true );

if ((lpRect.top <= point.y) && (point.y <= (lpRect.top+5))) {
    SetInsertMark(hitem, false);
}
else {
    SetInsertMark(0, false);
}

まずHitTestでマウスカーソルの位置にあるアイテムを取得する。
GetItemRectでそのアイテムの外枠をlpRect構造体に取得する。
取得した外枠の座標を見てtopから5ドット(任意の値)の範囲内に
マウスカーソルがきたら"横棒"を表示するようにする。

書いてみるとGakさんのコメントにソースコードを付けただけの
内容になってしまいしまいました。
Gakさんどうもありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加