|
だいぶ前にC#でListViewを遊んでいたときのコードを見てみました。
// ListViewにドロップ要素が入る
private void LView_DragEnter(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.FileDrop)) // ファイル
e.Effect = DragDropEffects.All;
else // 要素
e.Effect = DragDropEffects.Move;
}
// ListView内でドロップ
private void LView_DragDrop(object sender, DragEventArgs e)
{
....
if (e.Data.GetDataPresent(typeof(ListViewItem))) { // ListView内でのDnD
....
ListViewItem dstItem = LView.GetItemAt(p.X, p.Y);
int dstIdx = LView.Items.IndexOf(dstItem); // ドロップした位置
....
} else { // エクスプローラからドロップ
// ドロップ要素を配列にとる
string[] sDrop = (string[])e.Data.GetData(DataFormats.FileDrop);
for (int i = 0; i < sDrop.Length; i++) // メモリに格納していく
....
>他のアプリケーションについては、
…
>実際に開いているウィンドウそのものに対してだとマウスカーソルの座標が必要
遊んでいた際には、エクスプローラからのドロップでマウスカーソルの座
標を使わずにドロップされたアイテムを取得していたので、ドロップ対象
のアプリケーションには座標を渡す必要はないと思われます。
アプリケーションのウインドウ宛へのDnDだけならウインドウ列挙だけに
なる気がします。
しかし、ウインドウ内にあるコンポーネント宛にドロップメッセージを送
るなら、相手アプリケーションのリソースを列挙していきつつそのコンポ
ーネントにドロップのメッセージを送る際に必要なユーザがするコンポー
ネント選択をどのように選択させるのか、 DnDに失敗した際、そのアプリ
ケーションが放さないかぎり秀丸ファイラーClassicに処理が戻ってこな
い可能性もありますし。
単純に、マウスに手を動かすのが軽減される、と思い込んでしまっていま
した。よく考えもせずにすみません。
|
|